diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 00000000..4d93cc92
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,22 @@
+## 변경 내용
+
+변경 목적과 독자가 얻는 결과를 간단히 적어 주세요.
+
+## 공개 문서 체크리스트
+
+- [ ] 사례·가이드·실습·리서치 중 올바른 문서 유형과 폴더를 선택했습니다.
+- [ ] 필수 front matter와 `docs-taxonomy.yml`의 분류 값을 사용했습니다.
+- [ ] Microsoft/Azure 기술 주장을 Microsoft Learn MCP와 `verify-with-microsoft-learn` skill로 원문까지 확인했습니다.
+- [ ] 실제 구독·테넌트 ID, 비밀, 내부 URL·IP·호스트명 등 공개 안전성 문제를 제거했습니다.
+- [ ] 필요한 경우 현재 가이드와 시점 고정 사례를 분리하고 서로 연결했습니다.
+- [ ] 아래 로컬 검증을 통과했습니다.
+
+```powershell
+python -m pytest tests/docs -q
+python scripts/docs/validate_metadata.py
+python scripts/docs/validate_sources.py
+python scripts/docs/validate_links.py
+python scripts/docs/validate_public_safety.py
+mkdocs build --strict
+python scripts/docs/validate_search_index.py
+```
diff --git a/.github/skills/verify-with-microsoft-learn/SKILL.md b/.github/skills/verify-with-microsoft-learn/SKILL.md
new file mode 100644
index 00000000..efdaa13a
--- /dev/null
+++ b/.github/skills/verify-with-microsoft-learn/SKILL.md
@@ -0,0 +1,52 @@
+---
+name: verify-with-microsoft-learn
+description: Use when creating, revising, or reviewing public technical documentation that contains Microsoft or Azure product claims.
+---
+
+# Verify with Microsoft Learn
+
+## Core rule
+
+Verify product behavior, support status, limits, versions, configuration steps, and CLI or API usage against current official text. A source URL alone is not evidence of a completed review.
+
+## Workflow
+
+1. Extract every checkable claim from the changed document. Separate product claims from incident-specific observations.
+2. Confirm the `microsoft.docs.mcp` server is connected. Inspect its current tool descriptions through `tools/list`; tool names, parameters, and response shapes can change.
+3. Search Microsoft Learn for each claim using the official product name, feature, version, error, or command. Use the discovered documentation search tool rather than general web search.
+4. Fetch every selected article in full with the discovered article-fetch tool. Search snippets are only candidates.
+5. Compare each claim with the fetched article's scope, prerequisites, supported versions, limitations, and current terminology.
+6. Correct unsupported claims. For a historical case, preserve the observation but state its date and contrast it with current documented behavior.
+7. For Kubernetes or CNCF behavior that Microsoft Learn does not define, also check the relevant `kubernetes.io` or `cncf.io` source. Microsoft Learn remains mandatory for this repository's Azure context.
+8. Record the exact article title and canonical URL in `official_sources`, set `sources_checked_at` to the actual review date, and set `verification_status: verified` only after every material claim is covered.
+9. Run `python scripts/docs/validate_metadata.py`, `python scripts/docs/validate_sources.py`, and `python scripts/docs/validate_links.py`.
+
+If the server is unavailable, no relevant full article can be fetched, or a material conflict remains, set `verification_status: needs-review` and report the unresolved claim. Never use `last_verified` to imply a check that did not occur.
+
+## Evidence contract
+
+```yaml
+verification_status: verified
+sources_checked_at: 2026-09-12
+official_sources:
+ - title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+```
+
+Use at least one claim-relevant `https://learn.microsoft.com/` article. Add upstream official sources when they hold the authoritative implementation detail.
+
+## Quick reference
+
+| Claim | Verify |
+|---|---|
+| Supported feature or version | Availability, region, tier, preview/GA status |
+| Configuration procedure | Prerequisites, command syntax, defaults, permissions |
+| Limit or performance statement | Units, scope, exceptions, last-updated context |
+| Historical incident | Observation date separately from current product behavior |
+
+## Common mistakes
+
+- Treating a search snippet as the full source
+- Citing a product landing page that does not support the claim
+- Using blogs, Q&A, or copied examples when an official article exists
+- Marking a document verified while one material claim is unresolved
diff --git a/.github/skills/verify-with-microsoft-learn/agents/openai.yaml b/.github/skills/verify-with-microsoft-learn/agents/openai.yaml
new file mode 100644
index 00000000..f26e49f6
--- /dev/null
+++ b/.github/skills/verify-with-microsoft-learn/agents/openai.yaml
@@ -0,0 +1,4 @@
+interface:
+ display_name: "Verify with Microsoft Learn"
+ short_description: "Verify technical docs against Microsoft Learn"
+ default_prompt: "Use $verify-with-microsoft-learn to verify this technical documentation against current official sources."
diff --git a/.github/workflows/docs-ci.yml b/.github/workflows/docs-ci.yml
new file mode 100644
index 00000000..e96f8def
--- /dev/null
+++ b/.github/workflows/docs-ci.yml
@@ -0,0 +1,42 @@
+name: Documentation CI
+
+on:
+ pull_request:
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ validate:
+ runs-on: ubuntu-latest
+ timeout-minutes: 15
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.13"
+ cache: pip
+ cache-dependency-path: requirements-docs.txt
+
+ - name: Install documentation dependencies
+ run: python -m pip install -r requirements-docs.txt
+
+ - name: Run documentation contract tests
+ run: python -m pytest tests/docs -q
+
+ - name: Validate public documentation
+ run: |
+ python scripts/docs/validate_metadata.py
+ python scripts/docs/validate_sources.py
+ python scripts/docs/validate_links.py
+ python scripts/docs/validate_public_safety.py
+
+ - name: Build site strictly
+ run: mkdocs build --strict
+
+ - name: Validate search index
+ run: python scripts/docs/validate_search_index.py
diff --git a/.github/workflows/oryx-python-build-test.yml b/.github/workflows/oryx-python-build-test.yml
index 4209b8fc..5f1240c9 100644
--- a/.github/workflows/oryx-python-build-test.yml
+++ b/.github/workflows/oryx-python-build-test.yml
@@ -3,7 +3,7 @@ name: Oryx Python 3.11 Build Test
on:
push:
paths:
- - 'oryx-test/**'
+ - 'samples/azure-app-service/oryx-test/**'
- '.github/workflows/oryx-python-build-test.yml'
workflow_dispatch:
@@ -20,7 +20,7 @@ jobs:
- name: Oryx build Python 3.11
run: |
docker run --rm \
- -v ${{ github.workspace }}/oryx-test:/app \
+ -v ${{ github.workspace }}/samples/azure-app-service/oryx-test:/app \
mcr.microsoft.com/oryx/build:github-actions-debian-bullseye \
oryx build /app \
--platform python \
@@ -29,4 +29,4 @@ jobs:
- name: Verify build output
run: |
echo "=== Build output ==="
- ls -la ./oryx-test/
+ ls -la ./samples/azure-app-service/oryx-test/
diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
new file mode 100644
index 00000000..9942f783
--- /dev/null
+++ b/.github/workflows/pages.yml
@@ -0,0 +1,71 @@
+name: Deploy documentation to Pages
+
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ build:
+ permissions:
+ contents: read
+ pages: read
+ runs-on: ubuntu-latest
+ timeout-minutes: 15
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.13"
+ cache: pip
+ cache-dependency-path: requirements-docs.txt
+
+ - name: Install documentation dependencies
+ run: python -m pip install -r requirements-docs.txt
+
+ - name: Validate public documentation
+ run: |
+ python scripts/docs/validate_metadata.py
+ python scripts/docs/validate_sources.py
+ python scripts/docs/validate_links.py
+ python scripts/docs/validate_public_safety.py
+
+ - name: Build site strictly
+ run: mkdocs build --strict
+
+ - name: Validate search index
+ run: python scripts/docs/validate_search_index.py
+
+ - name: Configure Pages
+ uses: actions/configure-pages@v5
+
+ - name: Upload Pages artifact
+ uses: actions/upload-pages-artifact@v4
+ with:
+ path: site
+
+ deploy:
+ permissions:
+ contents: read
+ pages: write
+ id-token: write
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
index 641dc3ac..39f4f8dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,15 @@
node_modules/
.env
-.github/skills/
+.github/skills/*
+!.github/skills/verify-with-microsoft-learn/
+!.github/skills/verify-with-microsoft-learn/**
.venv
sim-env.json.vscode/
.mirrord/
__pycache__/
*.py[cod]
+.pytest_cache/
+site/
.worktrees/
.superpowers/
monitor/sre-agent-event-lab/evidence/
diff --git a/.vscode/mcp.json b/.vscode/mcp.json
new file mode 100644
index 00000000..4873b588
--- /dev/null
+++ b/.vscode/mcp.json
@@ -0,0 +1,8 @@
+{
+ "servers": {
+ "microsoft-learn": {
+ "type": "http",
+ "url": "https://learn.microsoft.com/api/mcp"
+ }
+ }
+}
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 00000000..5f173de7
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,66 @@
+# Repository instructions
+
+## Public documentation contract
+
+- 상세 기준은 `docs/contributing/index.md`를 단일 설명 문서로 사용한다.
+- 공개 기술 문서는 `docs////index.md` page bundle로 작성한다.
+- ``은 `cases`, `guides`, `labs`, `research` 중 하나이며 front matter의 `document_type`과 일치해야 한다.
+- Azure 제품의 ``는 `azure-`와 공식 전체 제품명을 kebab-case로 조합한다(예: `azure-kubernetes-service`).
+- Microsoft 제품은 공식 명칭을 보존하여 이름이 `Microsoft`로 시작하면 `microsoft-` slug를 사용하고, 오픈소스와 그 밖의 제품은 공식 프로젝트·제품명을 kebab-case로 사용한다.
+- 새 서비스, 기술 또는 태그가 필요할 때만 `docs-taxonomy.yml`을 함께 수정한다.
+- 개별 문서를 추가하기 위해 `mkdocs.yml`, `docs/.nav.yml`, README 또는 수동 문서 목록을 수정하지 않는다. 빌드가 폴더와 메타데이터에서 메뉴·색인을 생성한다.
+
+## Publishing automation
+
+- 문서의 원본은 Markdown page bundle과 front matter다. 기존 분류의 새 글은 `docs/guides/azure-kubernetes-service//index.md` 같은 bundle만 추가하고, 메뉴에 문서 경로를 수동 등록하지 않는다.
+- 메뉴 트리, 문서 유형별·서비스별 목록, 태그와 검색 인덱스는 빌드 시 자동 생성한다. 브라우저에서 Markdown을 다시 읽거나 별도의 수동 문서 목록을 동기화하는 구조를 추가하지 않는다.
+- `mkdocs.yml`과 `docs/.nav.yml`은 사이트 공통 설정과 대메뉴 구성에만 사용한다. 새 서비스·기술·태그를 처음 도입할 때의 공통 분류 등록은 `docs-taxonomy.yml`에서 처리한다.
+- 홈의 대표 글은 문서의 `featured: true`로 지정한다. 생성기에 특정 문서 경로나 제목 목록을 하드코딩하지 않는다.
+- 게시 자동화를 바꿀 때는 Markdown bundle 하나를 추가하는 것만으로 메뉴·목록·검색이 갱신되는지 검증한다. 설정 파일의 문자열이 존재하는지만 검사하는 테스트로 대체하지 않는다.
+
+## Reader interface
+
+- 독자는 개발자다. 제목과 설명은 구체적인 증상, 기술적 선택, 관측과 판단의 근거를 드러내고 일반적인 홍보 문구나 관료적인 표현을 피한다.
+- 메뉴는 대메뉴(문서 유형) → 중메뉴(서비스) → 소메뉴(문서)로 구분한다. 문서 이름은 front matter의 `title`, 서비스 이름은 taxonomy를 사용하고 bundle 폴더를 불필요한 추가 단계로 노출하지 않는다.
+- 그룹은 접기·펼치기가 가능하고 현재 문서의 경로만 기본으로 열린다. `navigation.sections`나 `navigation.expand`로 모든 그룹을 강제로 펼치지 않는다.
+- 큰 화면에서는 전체 문서 사이드바를, 작은 화면에서는 햄버거 메뉴를 제공한다. 들여쓰기·굵기·구분선으로 계층을 표시하고 현재 문서를 강조한다.
+- 글자 크기는 GitHub Markdown 수준을 기준으로 한다: 본문 16px, H1 32px, H2 24px, H3 20px, 코드 약 13.6px. 홈 제목만 과도하게 키우지 않으며 밝은·어두운 테마와 모바일에서도 실제 크기·가독성을 확인한다.
+- 검토 상태와 확인일은 사실대로 메타데이터에 유지하되, 마이그레이션·검토 미완료 같은 관리용 안내를 본문 배너나 목록 배지로 자동 노출하지 않는다. 출처 링크와 실제 기술적 제약·비용 경고는 보존한다.
+
+## Content lifecycle
+
+- 발생 시점의 환경, 관측값, 조사와 해결 이력은 `cases`에 보존한다.
+- 현재 권장 절차, 지원 상태와 버전별 차이는 `guides`에서 계속 갱신한다.
+- 한 문서에 두 성격이 섞이면 사례와 가이드로 분리하고 `related_cases`·`related_guides`로 연결한다.
+- 실행 가능한 프로젝트, 배포 매니페스트와 대용량 결과물은 `samples/`에 두고 문서에서는 GitHub 소스 링크를 사용한다.
+- 페이지에서 렌더링할 이미지만 같은 bundle의 `images/`에 두며 의미 있는 대체 텍스트를 작성한다.
+
+## Official-source verification
+
+- Microsoft 또는 Azure의 동작, 지원 여부, 제한, 버전, 구성 단계, CLI/API 사용법을 추가하거나 바꿀 때 `.github/skills/verify-with-microsoft-learn/SKILL.md`의 `verify-with-microsoft-learn` skill을 반드시 사용한다.
+- Microsoft Learn MCP 검색 뒤 선택한 원문 전체를 조회하고, 주장과 적용 범위를 비교한다.
+- `official_sources`, `sources_checked_at`, `verification_status`는 실제 검증 결과와 일치시킨다. URL만 추가한 것은 검증이 아니다.
+- Microsoft Learn이 최종 권위가 아닌 Kubernetes·CNCF 세부 동작은 upstream 공식 문서도 함께 확인한다.
+- 의미 검증을 완료하지 못하면 `verification_status: needs-review`로 남기고 완료했다고 표현하지 않는다.
+
+## Public safety
+
+- 고객·조직·사용자 실명, 구독·테넌트 ID, 비밀, 연결 문자열, 내부 URL·IP·호스트명, 개인정보가 담긴 로그와 승인되지 않은 화면을 공개 문서에 넣지 않는다.
+- 실제 식별자는 문서 전체에서 일관된 가상 값으로 치환한다.
+
+## Required validation
+
+문서 CI는 `tests/docs`와 공개 문서·사이트 검증을 대상으로 한다. SRE 실습 등 `samples/`의 애플리케이션 테스트나 의존성을 문서 CI에 묶지 않는다. 게시 스크립트나 사이트 동작을 변경하면 `python -m pytest tests/docs -q`도 실행한다.
+
+문서 또는 사이트 구성을 변경한 뒤 저장소 루트에서 실행한다.
+
+```powershell
+python scripts/docs/validate_metadata.py
+python scripts/docs/validate_sources.py
+python scripts/docs/validate_links.py
+python scripts/docs/validate_public_safety.py
+mkdocs build --strict
+python scripts/docs/validate_search_index.py
+```
+
+테스트나 검증 실패를 무시하거나 생성된 `site/` 및 검색 인덱스를 커밋하지 않는다.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..a3ccb131
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,18 @@
+# 기여하기
+
+새 공개 문서는 `docs////index.md`에 추가합니다. 올바른 폴더와 front matter를 사용하면 메뉴와 색인은 빌드 시 자동 생성됩니다.
+
+문서 유형 선택, 메타데이터, 본문 구조, 태그, 이미지와 공개 안전성의 기준 문서는 [상세 기여 지침](docs/contributing/index.md)입니다.
+
+Microsoft 또는 Azure 기술 내용을 새로 쓰거나 바꿀 때는 repository skill `verify-with-microsoft-learn`을 사용해 Microsoft Learn 원문과 대조하고 출처 메타데이터를 갱신해야 합니다.
+
+제출 전 다음을 실행하세요.
+
+```powershell
+python scripts/docs/validate_metadata.py
+python scripts/docs/validate_sources.py
+python scripts/docs/validate_links.py
+python scripts/docs/validate_public_safety.py
+mkdocs build --strict
+python scripts/docs/validate_search_index.py
+```
diff --git a/README.md b/README.md
index 5fc354c1..65944a3f 100644
--- a/README.md
+++ b/README.md
@@ -1,85 +1,30 @@
# DevGuideSample
-> Microsoft CSA(Customer Success Architect) 팀을 위한 Azure 기술 가이드 및 이슈 해결 사례 저장소
+실제 Azure 문제 해결 이력과 지속적으로 갱신하는 기술 가이드를 외부에 공개하는 문서 저장소입니다.
-## 📌 저장소 소개
+## 문서 사이트
-이 저장소는 한국 지역에서 발생하는 다양한 Azure 관련 기술 이슈와 솔루션을 체계적으로 정리하고 공유하기 위한 목적으로 만들어졌습니다. Microsoft CSA 팀이 고객 지원 과정에서 경험한 실제 사례와 베스트 프랙티스를 문서화하여, 팀원들 간의 지식 공유와 빠른 문제 해결을 돕습니다.
+**[DevGuideSample GitHub Pages에서 검색하기](https://hellices.github.io/devguidesample/)**
-## 🎯 활용 플랜
+사이트에서는 한국어·영어 전체 텍스트, 제품명, 오류 메시지와 태그로 모든 공개 문서를 검색할 수 있습니다.
-### 1. 지식 베이스로 활용
-- 과거에 해결했던 이슈를 빠르게 검색하고 참고
-- 유사한 문제 발생 시 검증된 솔루션 적용
-- 신규 팀원 온보딩 시 학습 자료로 활용
+| 모음 | 용도 |
+|---|---|
+| 문제 해결 사례 | 특정 시점의 증상, 조사, 근본 원인과 해결 결과를 보존합니다. |
+| 일반 가이드 | 현재 재사용할 수 있는 절차를 제품 변화에 따라 계속 검증하고 갱신합니다. |
+| 실습 | 배포, 실행, 검증과 정리를 재현할 수 있는 시나리오입니다. |
+| 리서치 | 비교, 벤치마크와 아키텍처 조사를 기준 시점과 함께 기록합니다. |
-### 2. 베스트 프랙티스 공유
-- 실제 프로덕션 환경에서 검증된 구성 및 설정 공유
-- Azure 서비스별 최적화 전략 문서화
-- 성능 튜닝 사례 및 트러블슈팅 가이드 제공
+전체 문서 목록은 파일로 중복 관리하지 않습니다. 올바른 폴더와 front matter를 사용하면 Pages 메뉴, 서비스 색인과 태그 색인에 자동으로 포함됩니다.
-### 3. 협업 및 확장
-- 팀원들이 새로운 이슈 해결 사례를 지속적으로 추가
-- 코드 예제와 함께 상세한 설명 제공
-- 한국 고객 환경에 특화된 가이드 작성
+## 로컬 미리보기
-## 🧪 실습 랩
-
-문서만 읽는 가이드와 달리, 실제 Azure 리소스를 배포해 직접 돌려 보는 실습입니다. 각 랩은 자체 `azure.yaml`을 가지고 있어 `azd up` 한 번으로 환경이 만들어집니다.
-
-| 랩 | 무엇을 확인하나 | 소요 시간 | 과금 |
-|---|---|---|---|
-| [Azure SRE Agent 이벤트 기반 장애 분석](monitor/sre-agent-event-lab/README.md) | 장애를 세 번 주입하고 Azure Monitor 경고를 받은 SRE Agent가 원인을 짚어내는지 | 배포 5분 + 시나리오당 30~40분 | 있음 (Container Apps, Log Analytics, Storage 등) |
-
-각 랩의 README가 사전 조건, 배포, 정리 절차를 안내합니다. **실습을 마치면 반드시 각 랩의 정리 절차를 따라 리소스를 삭제하세요.**
-
-새 랩을 추가할 때는 `azure.yaml`과 README를 갖춘 디렉터리를 만들고 위 표에 행을 추가합니다.
-
-## 📝 기여 방법
-
-### 새로운 가이드 추가하기
-
-1. 적절한 카테고리 폴더 선택 (aks, automation, cosmosdb, mysql, develop, architect)
-2. 필요시 하위 폴더 생성 (예: `nodejs/`, `python/` 등)
-3. Markdown 파일 작성 시 다음 항목 포함 권장:
- - 문제 상황 설명
- - 원인 분석
- - 해결 방법 (코드 예제 포함)
- - 참고 링크
-
-### 가이드 작성 예시 구조
-
-```markdown
-# [제목]: 문제 및 해결 방법 간략 설명
-
-## 문제 상황
-실제 발생한 이슈에 대한 설명
-
-## 원인 분석
-문제의 근본 원인 파악
-
-## 해결 방법
-상세한 해결 단계 및 코드 예제
-
-## 참고 링크
-- 관련 Microsoft Learn 문서
-- Kubernetes/Azure 공식 문서
+```powershell
+python -m venv .venv
+.\.venv\Scripts\python -m pip install -r requirements-docs.txt
+.\.venv\Scripts\mkdocs serve
```
-## 🎓 대상 독자
-
-- Microsoft Customer Success Architect (CSA)
-- Azure 기술 지원 엔지니어
-- Azure 클라우드 아키텍트
-- Azure 서비스를 사용하는 개발자
-
-## 🔗 관련 리소스
-
-- [Microsoft Learn](https://learn.microsoft.com/ko-kr/)
-- [Azure Documentation](https://docs.microsoft.com/ko-kr/azure/)
-- [Azure Architecture Center](https://learn.microsoft.com/ko-kr/azure/architecture/)
-이 저장소의 내용은 Microsoft CSA 팀 내부 지식 공유를 목적으로 합니다.
-
----
+자세한 작성·검증 규칙은 [CONTRIBUTING.md](CONTRIBUTING.md)를 확인하세요.
-**Last Updated**: 2025-11-17
+> 이 저장소와 Pages는 공개되어 있습니다. 고객·사용자 식별자, 구독·테넌트 ID, 비밀, 내부 URL 또는 승인되지 않은 화면 캡처를 커밋하지 마세요.
diff --git a/docs-taxonomy.yml b/docs-taxonomy.yml
new file mode 100644
index 00000000..c9a7e400
--- /dev/null
+++ b/docs-taxonomy.yml
@@ -0,0 +1,95 @@
+collections:
+ case:
+ path: cases
+ title: 트러블슈팅
+ description: 느린 응답, 막힌 I/O, 예상과 다른 동작. 관측한 증상에서 시작해 원인 후보를 하나씩 좁혀 간 기록입니다.
+ statuses: [unresolved, resolved, historical]
+ required_fields: [occurred_at]
+ guide:
+ path: guides
+ title: 구현 가이드
+ description: 구성을 연결하고 동작을 확인하는 데 필요한 절차를 정리했습니다. 내 환경에 맞는 전제와 적용 범위부터 살펴보세요.
+ statuses: [current, needs-review, deprecated]
+ required_fields: [last_verified, review_cycle_days, applies_to]
+ lab:
+ path: labs
+ title: 실습
+ description: 읽는 데서 끝내지 않고 직접 재현합니다. 배포할 구성, 확인할 결과, 비용과 정리 절차를 함께 살펴보세요.
+ statuses: [verified, needs-review, broken, archived]
+ required_fields: [last_verified, review_cycle_days, estimated_time, cost, cleanup_required]
+ research:
+ path: research
+ title: 비교·분석
+ description: 어떤 선택이 더 나은지는 조건에 따라 달라집니다. 처리량과 비용, 품질과 복잡도를 비교하고 판단의 근거를 남깁니다.
+ statuses: [current, superseded, archived]
+ required_fields: [published_at]
+
+services:
+ application-development: Application Development
+ azure-application-gateway: Azure Application Gateway
+ azure-ai-search: Azure AI Search
+ azure-architecture: Azure Architecture
+ azure-automation: Azure Automation
+ azure-cosmos-db: Azure Cosmos DB
+ azure-database-for-mysql: Azure Database for MySQL
+ azure-hdinsight: Azure HDInsight
+ azure-kubernetes-service: Azure Kubernetes Service
+ azure-load-testing: Azure Load Testing
+ azure-managed-redis: Azure Managed Redis
+ azure-monitor: Azure Monitor
+ azure-openai: Azure OpenAI
+ azure-storage: Azure Storage
+ microsoft-foundry: Microsoft Foundry
+
+technologies:
+ azure-cli: Azure CLI
+ bicep: Bicep
+ cosmos-db: Azure Cosmos DB
+ docker: Docker
+ dotnet: .NET
+ gitops: GitOps
+ go: Go
+ grafana: Grafana
+ java: Java
+ kafka: Apache Kafka
+ kubernetes: Kubernetes
+ mysql: MySQL
+ nodejs: Node.js
+ open-telemetry: OpenTelemetry
+ powershell: PowerShell
+ prometheus: Prometheus
+ python: Python
+ rag: Retrieval-augmented generation
+ redis: Redis
+ rest-api: REST API
+
+tags:
+ ai-agents: AI agents
+ architecture: Architecture
+ authentication: Authentication
+ authorization: Authorization
+ benchmarking: Benchmarking
+ deployment: Deployment
+ development: Development
+ diagnostics: Diagnostics
+ disaster-recovery: Disaster recovery
+ high-availability: High availability
+ kubernetes: Kubernetes
+ latency: Latency
+ migration: Migration
+ monitoring: Monitoring
+ networking: Networking
+ observability: Observability
+ performance: Performance
+ reliability: Reliability
+ security: Security
+ storage: Storage
+ troubleshooting: Troubleshooting
+
+verification_statuses: [verified, needs-review]
+required_source_host: learn.microsoft.com
+official_source_hosts:
+ - learn.microsoft.com
+ - kubernetes.io
+ - www.cncf.io
+ - cncf.io
diff --git a/docs/.nav.yml b/docs/.nav.yml
new file mode 100644
index 00000000..d05f3b30
--- /dev/null
+++ b/docs/.nav.yml
@@ -0,0 +1,11 @@
+nav:
+ - 홈: index.md
+ - 트러블슈팅: cases
+ - 구현 가이드: guides
+ - 실습: labs
+ - 비교·분석: research
+ - 서비스별 찾기: services
+ - 태그: tags.md
+ - 기여하기: contributing
+ - glob: "*"
+ ignore_no_matches: true
diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css
new file mode 100644
index 00000000..50106cef
--- /dev/null
+++ b/docs/assets/stylesheets/extra.css
@@ -0,0 +1,910 @@
+:root,
+[data-md-color-scheme] {
+ --dg-font-body: 0.8rem;
+ --dg-font-h1: 1.6rem;
+ --dg-font-h2: 1.2rem;
+ --dg-font-h3: 1rem;
+ --dg-font-code: 0.68rem;
+ --dg-bg: #f8fafc;
+ --dg-surface: #ffffff;
+ --dg-soft: #eef2f7;
+ --dg-text: #182230;
+ --dg-muted: #566578;
+ --dg-border: #dbe2eb;
+ --dg-accent: #1759c0;
+ --dg-accent-soft: #eaf1ff;
+ --dg-on-accent: #ffffff;
+ --dg-case: #b4522d;
+ --dg-guide: #1759c0;
+ --dg-lab: #087568;
+ --dg-research: #7450a3;
+ --md-default-bg-color: var(--dg-bg);
+ --md-default-fg-color: var(--dg-text);
+ --md-default-fg-color--light: var(--dg-muted);
+ --md-default-fg-color--lighter: #8693a5;
+ --md-default-fg-color--lightest: var(--dg-border);
+ --md-primary-fg-color: var(--dg-accent);
+ --md-primary-bg-color: var(--dg-on-accent);
+ --md-accent-fg-color: var(--dg-accent);
+ --md-accent-fg-color--transparent: var(--dg-accent-soft);
+ --md-typeset-a-color: var(--dg-accent);
+ --md-code-bg-color: #edf2f8;
+ --md-code-fg-color: #24354c;
+}
+
+[data-md-color-scheme="slate"] {
+ --dg-bg: #111720;
+ --dg-surface: #18212d;
+ --dg-soft: #1e2a39;
+ --dg-text: #e7edf5;
+ --dg-muted: #a4b2c6;
+ --dg-border: #2c394b;
+ --dg-accent: #9bbcff;
+ --dg-accent-soft: #202f49;
+ --dg-on-accent: #101b2c;
+ --dg-case: #f1ad88;
+ --dg-guide: #9bbcff;
+ --dg-lab: #7dd6c3;
+ --dg-research: #c3acf0;
+ --md-default-fg-color--lighter: #7e90aa;
+ --md-code-bg-color: #1c2839;
+ --md-code-fg-color: #d5e3f7;
+}
+
+body {
+ -webkit-font-smoothing: antialiased;
+}
+
+.md-grid {
+ max-width: 74rem;
+}
+
+.md-header {
+ background: var(--dg-bg);
+ color: var(--dg-text);
+ border-bottom: 1px solid var(--dg-border);
+}
+
+.md-header {
+ box-shadow: none;
+}
+
+.md-header__title {
+ font-weight: 700;
+ letter-spacing: -0.035em;
+}
+
+.md-search__form {
+ background: var(--dg-soft);
+ border: 1px solid var(--dg-border);
+ border-radius: 0.35rem;
+}
+
+.md-search__input,
+.md-search__input + .md-search__icon {
+ color: var(--dg-text);
+}
+
+.md-search__input::placeholder {
+ color: var(--dg-muted);
+}
+
+.md-nav {
+ font-size: 0.65rem;
+ line-height: 1.7;
+}
+
+.md-nav__link--active {
+ font-weight: 600;
+}
+
+.md-nav--primary > .md-nav__list > .md-nav__item {
+ margin-bottom: 0.3rem;
+}
+
+.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link {
+ font-size: 0.7rem;
+ font-weight: 700;
+}
+
+.md-nav--primary .md-nav[data-md-level="1"] > .md-nav__list > .md-nav__item > .md-nav__link {
+ font-size: 0.65rem;
+ font-weight: 600;
+}
+
+.md-nav--primary .md-nav[data-md-level="2"] .md-nav__link:not(.md-nav__link--active) {
+ color: var(--dg-muted);
+ font-size: 0.65rem;
+ font-weight: 400;
+}
+
+.md-nav--primary .md-nav__link {
+ border-radius: 0.2rem;
+ line-height: 1.6;
+}
+
+.md-nav--primary .md-nav__link--active {
+ color: var(--dg-accent);
+ background: var(--dg-accent-soft);
+ box-shadow: inset 2px 0 var(--dg-accent);
+}
+
+@media (min-width: 1220px) {
+ .md-nav--primary .md-nav[data-md-level="1"],
+ .md-nav--primary .md-nav[data-md-level="2"] {
+ border-left: 1px solid var(--dg-border);
+ margin-left: 0.3rem;
+ padding-left: 0.5rem;
+ }
+}
+
+.md-main__inner {
+ margin-top: 1.25rem;
+}
+
+.md-content {
+ min-width: 0;
+}
+
+.md-content__inner {
+ max-width: 40rem;
+ margin-inline: auto;
+ padding-inline: 1rem;
+}
+
+.md-content__inner:has(.dg-landing) {
+ max-width: none;
+ margin-inline: 0;
+ padding-inline: 1.25rem;
+}
+
+.md-content__inner:has(.dg-landing) > .md-content__button {
+ display: none;
+}
+
+.md-typeset {
+ font-size: var(--dg-font-body);
+ line-height: 1.5;
+ letter-spacing: -0.02em;
+ word-break: keep-all;
+ overflow-wrap: anywhere;
+}
+
+.md-typeset h1,
+.md-typeset h2,
+.md-typeset h3 {
+ color: var(--dg-text);
+ font-weight: 600;
+ letter-spacing: -0.035em;
+}
+
+.md-typeset h1 {
+ margin-bottom: 0.8rem;
+ font-size: var(--dg-font-h1);
+ line-height: 1.25;
+}
+
+.md-typeset h2 {
+ margin-top: 1.5rem;
+ font-size: var(--dg-font-h2);
+ line-height: 1.25;
+}
+
+.md-typeset h3 {
+ font-size: var(--dg-font-h3);
+ line-height: 1.25;
+}
+
+.md-typeset :is(h1, h2, h3)[id] {
+ scroll-margin-top: 6rem;
+}
+
+.md-typeset a {
+ text-underline-offset: 0.2em;
+}
+
+.md-typeset a:focus-visible,
+.md-header a:focus-visible {
+ outline: 2px solid var(--dg-accent);
+ outline-offset: 4px;
+ border-radius: 2px;
+}
+
+.md-typeset code,
+.md-typeset pre {
+ font-size: var(--dg-font-code);
+ letter-spacing: 0;
+ word-break: normal;
+}
+
+.md-typeset pre {
+ line-height: 1.5;
+}
+
+.md-typeset .highlight,
+.md-typeset .highlighttable {
+ border: 1px solid var(--dg-border);
+ border-radius: 0.4rem;
+ overflow: hidden;
+}
+
+.md-typeset .highlight > pre {
+ margin: 0;
+}
+
+.md-typeset pre > code {
+ padding: 1rem;
+}
+
+.md-typeset blockquote {
+ color: var(--dg-muted);
+ border-left-color: var(--dg-border);
+}
+
+.md-typeset table:not([class]) {
+ background: var(--dg-surface);
+ border-color: var(--dg-border);
+ border-radius: 0.35rem;
+ font-size: 0.72rem;
+ line-height: 1.75;
+}
+
+.md-typeset table:not([class]) th {
+ background: var(--dg-soft);
+ color: var(--dg-text);
+}
+
+.md-typeset .admonition,
+.md-typeset details {
+ font-size: 0.74rem;
+ line-height: 1.8;
+ box-shadow: none;
+}
+
+.md-typeset .dg-article-lead {
+ color: var(--dg-muted);
+ font-size: var(--dg-font-body);
+ line-height: 1.6;
+ margin: 1rem 0 1.5rem;
+}
+
+.md-typeset details.doc-sources {
+ background: var(--dg-surface);
+ border-color: var(--dg-border);
+ margin-top: 2rem;
+ font-size: 0.7rem;
+}
+
+.md-typeset details.doc-sources > summary {
+ background: var(--dg-soft);
+ color: var(--dg-text);
+}
+
+.dg-landing {
+ max-width: 60rem;
+ margin-inline: auto;
+ padding-block: 0.5rem 3rem;
+}
+
+.md-typeset .dg-eyebrow {
+ color: var(--dg-muted);
+ font-family: var(--md-code-font-family);
+ font-size: 0.55rem;
+ font-weight: 500;
+ line-height: 1.8;
+ letter-spacing: 0.12em;
+ margin: 0 0 0.8rem;
+}
+
+.md-typeset .dg-lead {
+ color: var(--dg-muted);
+ font-size: var(--dg-font-body);
+ line-height: 1.6;
+ max-width: 44rem;
+ margin: 1rem 0 0;
+}
+
+.dg-hero {
+ display: grid;
+ grid-template-columns: 1.25fr 0.85fr;
+ gap: 2rem;
+ align-items: center;
+ padding-block: 1.2rem 1.4rem;
+}
+
+.md-typeset .dg-hero h1 {
+ font-size: var(--dg-font-h1);
+ line-height: 1.25;
+ letter-spacing: -0.035em;
+ margin: 0.6rem 0 0.8rem;
+}
+
+.dg-actions {
+ margin-top: 1.2rem;
+}
+
+.dg-actions p {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.55rem;
+ margin: 0;
+}
+
+.md-typeset .dg-button {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 2.2rem;
+ padding: 0.55rem 0.9rem;
+ border: 1px solid var(--dg-border);
+ border-radius: 0.35rem;
+ font-size: 0.7rem;
+ font-weight: 600;
+ line-height: 1.6;
+ transition: background 160ms ease, border-color 160ms ease;
+}
+
+.md-typeset .dg-button--primary {
+ background: var(--dg-accent);
+ border-color: var(--dg-accent);
+ color: var(--dg-on-accent);
+}
+
+.md-typeset .dg-button--secondary {
+ background: var(--dg-surface);
+ color: var(--dg-text);
+}
+
+.md-typeset .dg-button:hover {
+ border-color: var(--dg-accent);
+ filter: brightness(0.95);
+}
+
+.dg-hero-topics {
+ border-left: 1px solid var(--dg-border);
+ padding-left: 1.6rem;
+}
+
+.dg-hero-topics p {
+ margin: 0;
+}
+
+.md-typeset .dg-topic-link {
+ display: block;
+ color: var(--dg-muted);
+ border-top: 1px solid var(--dg-border);
+ padding: 0.9rem 0;
+ font-size: 0.74rem;
+ line-height: 1.8;
+}
+
+.dg-topic-link strong {
+ color: var(--dg-text);
+ font-size: var(--dg-font-body);
+}
+
+.md-typeset .dg-topic-link:hover strong {
+ color: var(--dg-accent);
+}
+
+.dg-stats {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1.5rem 3rem;
+ border-block: 1px solid var(--dg-border);
+ padding-block: 0.8rem;
+}
+
+.dg-stat {
+ display: flex;
+ gap: 0.65rem;
+ align-items: baseline;
+}
+
+.dg-stat strong {
+ font-family: var(--md-code-font-family);
+ font-size: 1.1rem;
+ line-height: 1.3;
+ font-weight: 500;
+ letter-spacing: -0.07em;
+}
+
+.dg-stat span {
+ color: var(--dg-muted);
+ font-size: 0.65rem;
+}
+
+.dg-section-heading {
+ margin-top: 2rem;
+ margin-bottom: 0.9rem;
+}
+
+.md-typeset .dg-section-heading h2 {
+ margin: 0;
+ font-size: var(--dg-font-h2);
+}
+
+.dg-section-heading > p:not(.dg-eyebrow) {
+ color: var(--dg-muted);
+ font-size: 0.78rem;
+ margin: 0.35rem 0 0;
+}
+
+.dg-page-heading {
+ border-bottom: 1px solid var(--dg-border);
+ padding-block: 1.1rem 1.2rem;
+ margin-bottom: 1.4rem;
+}
+
+.md-typeset .dg-page-heading h1 {
+ margin: 0;
+ font-size: var(--dg-font-h1);
+ line-height: 1.25;
+}
+
+.dg-jump-links {
+ margin-block: 1.2rem 2rem;
+}
+
+.dg-jump-links p {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.45rem;
+}
+
+.md-typeset .dg-jump-links a {
+ display: inline-flex;
+ align-items: center;
+ min-height: 1.9rem;
+ padding: 0.3rem 0.7rem;
+ background: var(--dg-surface);
+ color: var(--dg-muted);
+ border: 1px solid var(--dg-border);
+ border-radius: 2rem;
+ font-size: 0.65rem;
+ line-height: 1.5;
+}
+
+.md-typeset .dg-jump-links a:hover {
+ background: var(--dg-accent-soft);
+ border-color: var(--dg-accent);
+ color: var(--dg-accent);
+}
+
+.dg-doc-grid,
+.dg-feature-grid,
+.dg-collection-grid,
+.dg-service-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 0.9rem;
+}
+
+.dg-doc-card,
+.dg-collection-card,
+.dg-service-card {
+ --dg-card-accent: var(--dg-accent);
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ padding: 1rem;
+ background: var(--dg-surface);
+ border: 1px solid var(--dg-border);
+ border-radius: 0.5rem;
+ transition: border-color 160ms ease, transform 160ms ease;
+}
+
+.dg-doc-card:hover,
+.dg-collection-card:hover,
+.dg-service-card:hover {
+ border-color: var(--dg-card-accent);
+ transform: translateY(-2px);
+}
+
+.dg-doc-card--case,
+.dg-collection-card--case {
+ --dg-card-accent: var(--dg-case);
+}
+
+.dg-doc-card--guide,
+.dg-collection-card--guide {
+ --dg-card-accent: var(--dg-guide);
+}
+
+.dg-doc-card--lab,
+.dg-collection-card--lab {
+ --dg-card-accent: var(--dg-lab);
+}
+
+.dg-doc-card--research,
+.dg-collection-card--research {
+ --dg-card-accent: var(--dg-research);
+}
+
+.dg-doc-meta {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: baseline;
+ gap: 0.35rem 0.75rem;
+ color: var(--dg-muted);
+ font-family: var(--md-code-font-family);
+ font-size: 0.6rem;
+ line-height: 1.8;
+}
+
+.dg-doc-meta > :first-child,
+.dg-collection-card .dg-eyebrow {
+ color: var(--dg-card-accent);
+}
+
+.md-typeset :is(.dg-doc-card, .dg-collection-card, .dg-service-card) :is(h2, h3) {
+ font-size: 0.9rem;
+ line-height: 1.4;
+ margin: 0.65rem 0;
+}
+
+.md-typeset :is(.dg-doc-card, .dg-collection-card, .dg-service-card) :is(h2, h3) a {
+ color: var(--dg-text);
+}
+
+.md-typeset :is(.dg-doc-card, .dg-collection-card, .dg-service-card) :is(h2, h3) a::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ border-radius: 0.5rem;
+}
+
+.md-typeset :is(.dg-doc-card, .dg-collection-card, .dg-service-card) :is(h2, h3) .headerlink {
+ display: none;
+}
+
+.md-typeset .dg-doc-summary {
+ color: var(--dg-muted);
+ font-size: 0.7rem;
+ line-height: 1.6;
+ margin: 0 0 0.95rem;
+}
+
+.dg-doc-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.35rem;
+ margin-top: 0.3rem;
+}
+
+.dg-tag {
+ color: var(--dg-muted);
+ background: var(--dg-soft);
+ border-radius: 0.2rem;
+ padding: 0.13rem 0.4rem;
+ font-family: var(--md-code-font-family);
+ font-size: 0.6rem;
+ line-height: 1.75;
+ letter-spacing: 0;
+}
+
+.dg-doc-details {
+ color: var(--dg-muted);
+ font-size: 0.62rem;
+ line-height: 1.85;
+ margin-top: auto;
+ padding-top: 0.8rem;
+}
+
+.dg-doc-details > span {
+ display: inline-block;
+ margin-right: 0.65rem;
+}
+
+.dg-feature-grid {
+ grid-template-columns: 1.15fr 1fr;
+}
+
+.dg-feature-card:first-child {
+ grid-row: span 2;
+ padding: 1.2rem;
+ border-top: 3px solid var(--dg-card-accent);
+}
+
+.md-typeset .dg-feature-card:first-child h3 {
+ font-size: var(--dg-font-h3);
+ line-height: 1.4;
+ margin-block: 0.7rem;
+}
+
+.md-typeset .dg-feature-card:first-child .dg-doc-summary {
+ font-size: var(--dg-font-body);
+}
+
+.dg-feature-card:first-child .dg-doc-tags {
+ margin-top: auto;
+}
+
+.dg-feature-card:first-child .dg-doc-details {
+ margin-top: 0;
+}
+
+.dg-collection-grid {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+}
+
+.dg-collection-card {
+ padding: 1.1rem;
+}
+
+.dg-card-count {
+ color: var(--dg-muted);
+ font-family: var(--md-code-font-family);
+ font-size: 0.65rem;
+ margin-top: auto;
+ padding-top: 0.6rem;
+}
+
+.md-typeset .dg-collection > h2,
+.md-typeset .dg-service > h2 {
+ font-size: var(--dg-font-h3);
+ margin-top: 2rem;
+}
+
+.dg-collection--guide .dg-doc-grid {
+ grid-template-columns: minmax(0, 1fr);
+ gap: 0;
+}
+
+.dg-collection--guide .dg-doc-card {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) 12rem;
+ gap: 0.3rem 1.6rem;
+ padding: 1.25rem 0;
+ background: transparent;
+ border-width: 0 0 1px;
+ border-radius: 0;
+}
+
+.dg-collection--guide .dg-doc-card:hover {
+ transform: none;
+}
+
+.dg-collection--guide .dg-doc-meta,
+.dg-collection--guide .dg-doc-card h3,
+.dg-collection--guide .dg-doc-summary,
+.dg-collection--guide .dg-doc-details {
+ grid-column: 1;
+ margin-block: 0;
+}
+
+.dg-collection--guide .dg-doc-tags {
+ grid-column: 2;
+ grid-row: 2 / span 2;
+ align-content: start;
+ justify-content: flex-end;
+}
+
+.dg-collection--lab .dg-doc-details {
+ margin-top: 0.6rem;
+ padding: 0.65rem;
+ border-radius: 0.25rem;
+ background: var(--dg-soft);
+}
+
+.dg-collection--research .dg-doc-grid,
+.dg-service-grid {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.dg-service-card {
+ padding: 1.1rem 1.3rem;
+}
+
+.dg-service-card p,
+.dg-service-card ul {
+ color: var(--dg-muted);
+ font-size: 0.65rem;
+}
+
+.dg-service-card ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.dg-service-card li {
+ margin-left: 0;
+}
+
+.dg-tags > h2 {
+ border-top: 1px solid var(--dg-border);
+ padding-top: 1.25rem;
+}
+
+.dg-tags > ul {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 0.4rem 1.5rem;
+ list-style: none;
+}
+
+.dg-tags > ul > li {
+ padding-block: 0.4rem;
+ margin-left: 0;
+ font-size: 0.76rem;
+}
+
+.dg-contribute {
+ border-top: 1px solid var(--dg-border);
+ margin-top: 2.5rem;
+ padding-top: 1.6rem;
+}
+
+.dg-contribute p,
+.dg-contribution-steps {
+ font-size: 0.78rem;
+}
+
+.dg-contribute p:not(:first-child) {
+ color: var(--dg-muted);
+ max-width: 40rem;
+}
+
+.md-typeset .dg-text-link {
+ font-weight: 600;
+}
+
+.dg-contribution-steps {
+ background: var(--dg-surface);
+ border: 1px solid var(--dg-border);
+ border-radius: 0.4rem;
+ padding: 0.5rem 1rem;
+ margin-block: 1.5rem;
+}
+
+.dg-contribution-steps li {
+ padding-block: 0.25rem;
+}
+
+.md-footer,
+.md-footer-meta {
+ background: var(--dg-bg);
+ color: var(--dg-muted);
+}
+
+.md-footer {
+ border-top: 1px solid var(--dg-border);
+}
+
+.md-copyright,
+.md-copyright__highlight {
+ color: var(--dg-muted);
+}
+
+@media (max-width: 1219px) {
+ .md-nav--primary .md-nav__title[for="__drawer"] {
+ height: auto;
+ padding: 0.8rem;
+ background: var(--dg-surface);
+ color: var(--dg-text);
+ font-size: 0.8rem;
+ line-height: 1.5;
+ box-shadow: none;
+ }
+
+ .md-nav--primary .md-nav__title .md-logo {
+ display: none;
+ }
+
+ .md-nav--primary .md-nav__source {
+ background: var(--dg-soft);
+ color: var(--dg-text);
+ }
+}
+
+@media (max-width: 1100px) {
+ .dg-hero {
+ grid-template-columns: 1.1fr 0.9fr;
+ gap: 1.5rem;
+ }
+
+ .dg-collection-grid,
+ .dg-collection--research .dg-doc-grid,
+ .dg-service-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+@media (max-width: 760px) {
+ .md-content__inner,
+ .md-content__inner:has(.dg-landing) {
+ padding-inline: 0.8rem;
+ }
+
+ .dg-landing {
+ padding-top: 0;
+ }
+
+ .dg-hero {
+ grid-template-columns: minmax(0, 1fr);
+ gap: 1.5rem;
+ padding-block: 1.4rem 1.8rem;
+ }
+
+ .dg-hero-topics {
+ display: none;
+ }
+
+ .dg-stats {
+ gap: 0.8rem 1.25rem;
+ }
+
+ .dg-stat {
+ gap: 0.4rem;
+ }
+
+ .dg-doc-grid,
+ .dg-feature-grid,
+ .dg-collection--research .dg-doc-grid,
+ .dg-service-grid,
+ .dg-tags > ul {
+ grid-template-columns: minmax(0, 1fr);
+ }
+
+ .dg-feature-card:first-child {
+ grid-row: auto;
+ padding: 1.3rem;
+ }
+
+ .dg-collection--guide .dg-doc-card {
+ grid-template-columns: minmax(0, 1fr);
+ gap: 0.45rem;
+ }
+
+ .dg-collection--guide .dg-doc-card > * {
+ grid-column: 1;
+ grid-row: auto;
+ }
+
+ .dg-collection--guide .dg-doc-tags {
+ justify-content: flex-start;
+ }
+
+ .dg-page-heading {
+ padding-top: 1rem;
+ }
+
+}
+
+@media (max-width: 480px) {
+ .dg-collection-grid {
+ grid-template-columns: minmax(0, 1fr);
+ }
+
+ .dg-actions p {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .dg-stats {
+ justify-content: space-between;
+ gap: 0.75rem;
+ }
+
+ .dg-stat {
+ flex-direction: column;
+ gap: 0.1rem;
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .dg-doc-card,
+ .dg-collection-card,
+ .dg-service-card,
+ .md-typeset .dg-button {
+ transition: none;
+ }
+
+ .dg-doc-card:hover,
+ .dg-collection-card:hover,
+ .dg-service-card:hover {
+ transform: none;
+ }
+}
diff --git a/aisearch/eventual_consistency_reindex.md b/docs/cases/azure-ai-search/eventual-consistency-reindex/index.md
similarity index 93%
rename from aisearch/eventual_consistency_reindex.md
rename to docs/cases/azure-ai-search/eventual-consistency-reindex/index.md
index 9ca93f61..ab12d5ed 100644
--- a/aisearch/eventual_consistency_reindex.md
+++ b/docs/cases/azure-ai-search/eventual-consistency-reindex/index.md
@@ -1,3 +1,23 @@
+---
+services:
+- azure-ai-search
+official_sources:
+- title: Azure AI Search documentation
+ url: https://learn.microsoft.com/azure/search/
+document_type: case
+status: resolved
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: 버전 기반 재색인의 Eventual Consistency 이슈
+description: Azure AI Search 버전 기반 재색인에서 관측한 eventual consistency 문제와 대응을 기록합니다.
+technologies:
+- python
+tags:
+- reliability
+- troubleshooting
+occurred_at: 2026-04-17
+---
+
# Azure AI Search 버전 기반 재색인의 Eventual Consistency 이슈
## 개요
@@ -151,7 +171,7 @@ Step 3가 완전히 결정적이 되고 replica lag의 영향을 받지 않습
## 직접 재현해 보기
-자급식 재현 스크립트: [repro.py](./repro.py). Azure AI Search 서비스가 미리 준비되어 있어야 합니다.
+자급식 재현 스크립트: [repro.py](https://github.com/hellices/devguidesample/blob/main/samples/azure-ai-search/source-material/repro.py). Azure AI Search 서비스가 미리 준비되어 있어야 합니다.
```bash
# 1. Azure AI Search 서비스 생성 (35k 문서면 Basic 도 충분.
diff --git a/aks/file_io_throttling.md b/docs/cases/azure-kubernetes-service/file-io-throttling/index.md
similarity index 79%
rename from aks/file_io_throttling.md
rename to docs/cases/azure-kubernetes-service/file-io-throttling/index.md
index dd94cb08..ad2c273d 100644
--- a/aks/file_io_throttling.md
+++ b/docs/cases/azure-kubernetes-service/file-io-throttling/index.md
@@ -1,3 +1,24 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: case
+status: resolved
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: AKS Pod File I/O Throttling 분석
+description: AKS Pod에서 관측한 파일 I/O throttling의 증상과 분석 결과를 기록합니다.
+technologies:
+- kubernetes
+tags:
+- storage
+- performance
+- troubleshooting
+occurred_at: 2025-11-05
+---
+
# AKS Pod File I/O Throttling 분석
## 개요
diff --git a/aks/file_io_throttling2.md b/docs/cases/azure-kubernetes-service/netapp-files-cpu-io-wait/index.md
similarity index 96%
rename from aks/file_io_throttling2.md
rename to docs/cases/azure-kubernetes-service/netapp-files-cpu-io-wait/index.md
index 3e8092f3..3fadfbf9 100644
--- a/aks/file_io_throttling2.md
+++ b/docs/cases/azure-kubernetes-service/netapp-files-cpu-io-wait/index.md
@@ -1,8 +1,29 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: case
+status: resolved
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: Azure NetApp Files 환경 CPU 급증과 I/O 대기
+description: AKS와 Azure NetApp Files 환경의 CPU 급증 및 파일 I/O 대기 이력을 기록합니다.
+technologies:
+- kubernetes
+tags:
+- storage
+- performance
+- troubleshooting
+occurred_at: 2025-11-07
+---
+
# AKS NetApp Files 환경에서의 CPU 급증 및 File I/O 대기 이슈
## 개요
-AKS 환경에서 NetApp Files를 사용하는 Node.js 애플리케이션의 트래픽 증가 시 CPU 급증과 File I/O 대기 현상을 분석한 사례입니다. 이전 용량 증설로 NFS write 지연 문제를 해결했으나([file_io_throttling.md](./file_io_throttling.md) 참조), 추가적인 병목 현상이 발견되었습니다.
+AKS 환경에서 NetApp Files를 사용하는 Node.js 애플리케이션의 트래픽 증가 시 CPU 급증과 File I/O 대기 현상을 분석한 사례입니다. 이전 용량 증설로 NFS write 지연 문제를 해결했으나([파일 I/O 스로틀링 사례](../file-io-throttling/index.md) 참조), 추가적인 병목 현상이 발견되었습니다.
## 환경 구성
diff --git a/aks/pod_db_query_latency/01_query_latency.png b/docs/cases/azure-kubernetes-service/pod-database-query-latency/images/01_query_latency.png
similarity index 100%
rename from aks/pod_db_query_latency/01_query_latency.png
rename to docs/cases/azure-kubernetes-service/pod-database-query-latency/images/01_query_latency.png
diff --git a/aks/pod_db_query_latency/02_pod_runtime.png b/docs/cases/azure-kubernetes-service/pod-database-query-latency/images/02_pod_runtime.png
similarity index 100%
rename from aks/pod_db_query_latency/02_pod_runtime.png
rename to docs/cases/azure-kubernetes-service/pod-database-query-latency/images/02_pod_runtime.png
diff --git a/aks/pod_db_query_latency/pod_db_query_latency.png b/docs/cases/azure-kubernetes-service/pod-database-query-latency/images/pod_db_query_latency.png
similarity index 100%
rename from aks/pod_db_query_latency/pod_db_query_latency.png
rename to docs/cases/azure-kubernetes-service/pod-database-query-latency/images/pod_db_query_latency.png
diff --git a/aks/pod_db_query_latency/result_01.png b/docs/cases/azure-kubernetes-service/pod-database-query-latency/images/result_01.png
similarity index 100%
rename from aks/pod_db_query_latency/result_01.png
rename to docs/cases/azure-kubernetes-service/pod-database-query-latency/images/result_01.png
diff --git a/aks/pod_db_query_latency/result_02.png b/docs/cases/azure-kubernetes-service/pod-database-query-latency/images/result_02.png
similarity index 100%
rename from aks/pod_db_query_latency/result_02.png
rename to docs/cases/azure-kubernetes-service/pod-database-query-latency/images/result_02.png
diff --git a/aks/pod_db_query_latency/result_pod_runtime.png b/docs/cases/azure-kubernetes-service/pod-database-query-latency/images/result_pod_runtime.png
similarity index 100%
rename from aks/pod_db_query_latency/result_pod_runtime.png
rename to docs/cases/azure-kubernetes-service/pod-database-query-latency/images/result_pod_runtime.png
diff --git a/aks/pod_db_query_latency.md b/docs/cases/azure-kubernetes-service/pod-database-query-latency/index.md
similarity index 94%
rename from aks/pod_db_query_latency.md
rename to docs/cases/azure-kubernetes-service/pod-database-query-latency/index.md
index 4e711dda..9c9e17a5 100644
--- a/aks/pod_db_query_latency.md
+++ b/docs/cases/azure-kubernetes-service/pod-database-query-latency/index.md
@@ -1,15 +1,38 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: case
+status: resolved
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: 'AKS 쿼리 지연: DB 밖에서 병목 찾기'
+description: P95는 안정적인데 P99가 튀는 상황에서 시작합니다. CPU throttling, 커넥션 풀, 네트워크를 차례로 확인하며 원인을 좁혀 간 기록입니다.
+featured: true
+technologies:
+- kubernetes
+- nodejs
+tags:
+- latency
+- networking
+- troubleshooting
+occurred_at: 2026-06-08
+---
+
# AKS Pod → Database 쿼리 지연 디버깅
DB 쿼리 응답이 **30ms를 초과하면 fail 처리**되는 시나리오에서,
지연의 원인을 단계별로 좁혀가는 방법.
-
+
## 현재 상황: 메트릭 분석
### DB 쿼리 지연
-
+
| 메트릭 | 관측 값 | 판단 |
|---|---|---|
@@ -21,7 +44,7 @@ P95는 SLA 내인데 P99부터 30ms를 넘고, max는 300ms까지 치솟는다.
### Pod 런타임 상태
-
+
| 메트릭 | 관측 값 |
|---|---|
@@ -57,7 +80,7 @@ resources:
- P99가 내려감 → throttling이 기여하고 있었음. limit 조정 또는 제거로 대응.
- P99가 안 내려감 → throttling은 원인이 아님. **Step 2로.**
-> CFS throttling이 평균 CPU가 낮은데도 왜 발생하는지, requests/limits 중 무엇을 조정해야 하는지에 대한 심층 분석은 [Appendix C](#appendix-c-cfs-throttling-심층-분석-nodejs-burst-모델)를 참고.
+> CFS throttling이 평균 CPU가 낮은데도 왜 발생하는지, requests/limits 중 무엇을 조정해야 하는지에 대한 심층 분석은 [Appendix C](#appendix-c-cfs-throttling-nodejs-burst)를 참고.
### Step 2: 커넥션 풀 대기 배제
@@ -146,7 +169,7 @@ nohup kubectl logs -f -n -c debugger-XXXXX \
## 적용 결과: CPU limit 2 core 상향
Step 1 가설 검증 — `limits.cpu`를 `1` → `2`로 상향하고 `requests.cpu`는 `1` 유지.
-QoS는 Guaranteed → **Burstable** 로 강등. Appendix [C.5](#c5-권장-조치) 옵션 A(`req=lim=2`)와 옵션 B(`req=500m / lim=2`)의 중간 형태로, 노드 capacity 부담을 늘리지 않으면서 burst 천장만 2배 확보하는 선택.
+QoS는 Guaranteed → **Burstable** 로 강등. Appendix [C.5](#c5) 옵션 A(`req=lim=2`)와 옵션 B(`req=500m / lim=2`)의 중간 형태로, 노드 capacity 부담을 늘리지 않으면서 burst 천장만 2배 확보하는 선택.
```yaml
resources:
@@ -158,13 +181,13 @@ resources:
memory: 1Gi
```
-
+
### 변화 전후 비교
-
+
-
+
| 지표 | Before (limit 1 core) | After (limit 2 core) | 판정 |
|---|---|---|---|
@@ -176,7 +199,7 @@ resources:
| GC pause P95 | 1~2 ms | 5~8 ms | **소폭 증가** (아래 참고) |
| heap used | ~128 MB | ~110 MB | 변화 없음 |
-P99가 SLA(30 ms) 내로 안정화되고 max도 ~28 ms로 떨어져 **fail 처리 구간이 사라짐**. throttle이 거의 사라졌으므로 Appendix [C.3.2 / C.3.4](#c32-수정된-가설)의 가설 — "burst가 1 core quota를 자주 초과해 큐가 누적되며 tail이 비선형으로 증폭된다" — 가 본 케이스의 지배적 원인이었음이 확인됨.
+P99가 SLA(30 ms) 내로 안정화되고 max도 ~28 ms로 떨어져 **fail 처리 구간이 사라짐**. throttle이 거의 사라졌으므로 Appendix [C.3.2 / C.3.4](#c32)의 가설 — "burst가 1 core quota를 자주 초과해 큐가 누적되며 tail이 비선형으로 증폭된다" — 가 본 케이스의 지배적 원인이었음이 확인됨.
### 관전 포인트
diff --git a/redis/nodejs/cluster_failover_recovery.md b/docs/cases/azure-managed-redis/cluster-failover-recovery/index.md
similarity index 92%
rename from redis/nodejs/cluster_failover_recovery.md
rename to docs/cases/azure-managed-redis/cluster-failover-recovery/index.md
index ef6d9406..208a9bcb 100644
--- a/redis/nodejs/cluster_failover_recovery.md
+++ b/docs/cases/azure-managed-redis/cluster-failover-recovery/index.md
@@ -1,3 +1,25 @@
+---
+services:
+- azure-managed-redis
+official_sources:
+- title: Azure Managed Redis documentation
+ url: https://learn.microsoft.com/azure/redis/
+document_type: case
+status: resolved
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: Azure Managed Redis Cluster Failover 분석
+description: Azure Managed Redis cluster failover 장애의 분석과 복구 전략을 기록합니다.
+technologies:
+- nodejs
+- redis
+tags:
+- disaster-recovery
+- high-availability
+- troubleshooting
+occurred_at: 2026-02-22
+---
+
# Azure Managed Redis Cluster Failover 장애 분석 및 복구 전략
## 문제 정의
@@ -215,7 +237,7 @@ async function safeRedisGet(key) {
## 코드 샘플
-이 이슈를 검증하기 위한 예제 코드는 [`cluster_example/`](cluster_example/) 디렉토리에 포함되어 있습니다.
+이 이슈를 검증하기 위한 예제 코드는 [`cluster_example/`](https://github.com/hellices/devguidesample/tree/main/samples/azure-managed-redis/source-material/nodejs/cluster_example) 디렉토리에 포함되어 있습니다.
- OSS Cluster(`createCluster`) vs Enterprise(`createClient`) 연결 방식 비교
- Cluster topology 조회 및 모니터링
diff --git a/docs/contributing/case-template.md b/docs/contributing/case-template.md
new file mode 100644
index 00000000..b9281345
--- /dev/null
+++ b/docs/contributing/case-template.md
@@ -0,0 +1,44 @@
+---
+title: 문제 해결 사례 템플릿
+description: 시점 고정 문제 해결 이력을 작성하는 형식입니다.
+---
+
+# 문제 해결 사례 템플릿
+
+## Front matter
+
+```yaml
+---
+title: 사례 제목
+description: 증상, 영향과 해결을 요약한 한 문장
+document_type: case
+services: [azure-kubernetes-service]
+technologies: [kubernetes]
+tags: [troubleshooting]
+status: resolved
+verification_status: verified
+sources_checked_at: 2026-09-12
+official_sources:
+ - title: 관련 Microsoft Learn 원문 제목
+ url: https://learn.microsoft.com/azure/aks/
+occurred_at: 2026-09-01
+resolved_at: 2026-09-02
+related_guides: []
+---
+```
+
+## 본문 순서
+
+```markdown
+# 사례 제목
+## 요약
+## 발생 환경과 영향
+## 증상과 관측 데이터
+## 조사 과정과 타임라인
+## 근본 원인
+## 해결 방법
+## 검증 결과
+## 재발 방지와 교훈
+## 관련 최신 가이드
+## 참고 자료
+```
diff --git a/docs/contributing/guide-template.md b/docs/contributing/guide-template.md
new file mode 100644
index 00000000..f952bf91
--- /dev/null
+++ b/docs/contributing/guide-template.md
@@ -0,0 +1,45 @@
+---
+title: 일반 가이드 템플릿
+description: 계속 검증하고 갱신하는 기술 가이드 형식입니다.
+---
+
+# 일반 가이드 템플릿
+
+## Front matter
+
+```yaml
+---
+title: 가이드 제목
+description: 목표와 적용 범위를 요약한 한 문장
+document_type: guide
+services: [azure-kubernetes-service]
+technologies: [kubernetes]
+tags: [diagnostics]
+status: current
+verification_status: verified
+sources_checked_at: 2026-09-12
+official_sources:
+ - title: 관련 Microsoft Learn 원문 제목
+ url: https://learn.microsoft.com/azure/aks/
+last_verified: 2026-09-12
+review_cycle_days: 180
+applies_to: [AKS 1.34+]
+related_cases: []
+---
+```
+
+## 본문 순서
+
+```markdown
+# 가이드 제목
+## 목표
+## 적용 범위와 지원 버전
+## 사전 조건
+## 권장 아키텍처와 선택 근거
+## 구성과 운영 절차
+## 검증 방법
+## 롤백과 트러블슈팅
+## 제약 사항과 버전별 차이
+## 관련 사례
+## 공식 참고 자료
+```
diff --git a/docs/contributing/index.md b/docs/contributing/index.md
new file mode 100644
index 00000000..a96d3ed0
--- /dev/null
+++ b/docs/contributing/index.md
@@ -0,0 +1,126 @@
+---
+title: 기여하기
+description: 재현할 수 있는 환경과 코드, 판단의 근거를 갖춘 기술 기록을 기여하는 방법
+---
+
+
CONTRIBUTING
+
+# 코드와 근거를 함께 남겨주세요
+
+어떤 환경에서 무엇을 관측했고, 왜 그 방법을 선택했는지까지 적어주세요. 다음 사람이 같은 조건을 재현하고, 자신의 환경에도 적용할 수 있는지 판단하는 데 도움이 됩니다.
+
+
+
+1. **글의 성격을 고릅니다.** 특정 시점의 문제 해결, 재사용할 절차, 직접 해보는 실습, 선택지를 비교한 분석 중 어디에 해당하는지 정합니다.
+2. **환경과 근거를 남깁니다.** 코드·관측값·공식 출처를 정리하고, 확인하지 못한 부분은 구분합니다.
+3. **공개 전에 검증합니다.** 링크와 빌드 결과를 확인하고 실제 환경의 식별자나 비밀이 남아 있지 않은지 살펴봅니다.
+
+
+
+이 페이지가 공개 문서 작성 규칙의 기준입니다. 루트 `CONTRIBUTING.md`와 `AGENTS.md`는 핵심 규칙과 실행할 검증 명령을 안내합니다.
+
+## 문서 유형 선택
+
+| 질문 | 모음 | 수명주기 |
+|---|---|---|
+| 특정 시점에 무엇이 발생했고 어떻게 해결했나? | 트러블슈팅 (`cases`) | 당시 사실을 보존하고 필요하면 `historical`로 표시 |
+| 지금 같은 문제를 어떻게 진단·구성해야 하나? | 구현 가이드 (`guides`) | 제품 변화에 맞춰 같은 문서를 갱신 |
+| 독자가 리소스를 배포해 재현할 수 있나? | 실습 (`labs`) | 비용, 검증, 정리 절차까지 재검증 |
+| 선택지·성능·아키텍처를 어떤 기준으로 비교했나? | 비교·분석 (`research`) | 조사 기준일과 한계를 보존 |
+
+실제 장애 이력과 재사용 가능한 절차가 섞여 있으면 두 문서로 분리합니다. 사례에는 당시 환경·관측·결과를, 가이드에는 현재 지원 범위·권장 절차·검증·롤백을 두고 `related_cases`와 `related_guides`로 연결합니다.
+
+## 폴더만으로 자동 게시하기
+
+```text
+docs////
+├── index.md
+└── images/
+```
+
+URL에 쓰이는 폴더 이름은 소문자 kebab-case 영문으로 작성합니다. Azure 제품의 ``는 `azure-`와 공식 전체 제품명을 조합합니다(예: `azure-kubernetes-service`, `azure-database-for-mysql`). Microsoft 제품은 공식 명칭을 보존하므로 이름이 `Microsoft`로 시작하면 `microsoft-` slug를 사용합니다(예: `microsoft-foundry`). 오픈소스와 그 밖의 제품은 임의의 공급자 접두사를 붙이지 않고 공식 프로젝트·제품명을 사용합니다.
+
+문서를 위 경로에 넣고 유효한 front matter를 작성하면 다음 빌드에서 자동으로 Pages에 포함됩니다.
+
+- Awesome Nav가 폴더에서 메뉴를 발견합니다.
+- 생성기가 문서 유형별·서비스별 색인에 추가합니다.
+- Material tags가 태그를 페이지와 태그 색인에 표시하고 검색 미리보기에 포함합니다.
+- Material search가 한국어와 영어 제목·본문·섹션을 전체 텍스트로 색인합니다.
+
+메뉴는 **문서 유형 → 서비스 → 문서** 순서의 트리로 만들어집니다. 문서 이름은 front matter의 `title`을 사용하므로, 폴더 이름을 바꾸지 않고도 읽기 좋은 제목을 표시할 수 있습니다. 각 그룹은 접고 펼칠 수 있고, 현재 읽는 문서의 경로만 기본으로 열립니다. 메뉴 데이터는 빌드 결과에 포함되므로 브라우저가 Markdown을 다시 읽어 구성하지 않습니다.
+
+개별 문서 추가를 위해 `mkdocs.yml`, `docs/.nav.yml`, README 또는 수동 목록을 수정하지 않습니다. 새 서비스·기술·태그 식별자가 필요할 때만 `docs-taxonomy.yml`을 같은 PR에서 한 번 갱신합니다.
+
+| 추가하거나 바꾸려는 것 | 작성자가 수정할 곳 |
+|---|---|
+| 기존 서비스·태그를 사용하는 새 글 | 해당 bundle의 `index.md` |
+| 글에서 보여줄 이미지 | 해당 bundle의 `images/` |
+| 처음 사용하는 서비스·기술·태그 | 새 글과 `docs-taxonomy.yml` |
+| 메뉴·목록·검색에 새 글 노출 | 별도 수정 없음 — 빌드가 처리 |
+
+홈에 소개할 글은 해당 문서의 front matter에 `featured: true`를 지정합니다. 홈의 대표 글은 이 메타데이터에서 최대 세 편을 고르며, 별도 문서 목록은 관리하지 않습니다. 지정한 글이 없으면 문서 유형별로 글을 골라 보여줍니다.
+
+## 공통 front matter
+
+```yaml
+---
+title: AKS 네트워크 진단
+description: AKS 네트워크 문제를 진단하는 현재 절차
+document_type: guide
+services: [azure-kubernetes-service]
+technologies: [kubernetes]
+tags: [networking, troubleshooting]
+status: current
+verification_status: verified
+sources_checked_at: 2026-09-12
+official_sources:
+ - title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+last_verified: 2026-09-12
+review_cycle_days: 180
+applies_to: [AKS 1.34+]
+---
+```
+
+`services`, `technologies`, `tags`와 유형별 `status`는 `docs-taxonomy.yml`의 값을 사용합니다. 제목은 한국어여도 제품명, API, 명령과 오류 메시지는 공식 영문 표기를 함께 써 검색 가능하게 합니다.
+
+유형별 전체 형식은 [사례 템플릿](case-template.md), [가이드 템플릿](guide-template.md), [실습 템플릿](lab-template.md), [리서치 템플릿](research-template.md)을 사용합니다.
+
+## Microsoft Learn MCP로 기술 주장 검증하기
+
+워크스페이스의 `.vscode/mcp.json`은 공식 Microsoft Learn MCP 서버를 연결합니다. Microsoft 또는 Azure의 제품 동작, 지원 상태, 제한, 버전, 구성 단계나 CLI/API 사용법을 작성할 때 repository skill `verify-with-microsoft-learn`을 사용합니다.
+
+1. 변경한 문장에서 검증 가능한 주장을 나눕니다.
+2. MCP가 현재 제공하는 도구 설명을 조회하고 Microsoft Learn을 검색합니다.
+3. 검색 요약으로 끝내지 않고 관련 원문 전체를 가져옵니다.
+4. 적용 범위, 전제 조건, 버전, 지원 상태와 제한을 본문의 주장과 비교합니다.
+5. 실제 사용한 원문의 제목과 정규 URL을 `official_sources`에 기록하고 `sources_checked_at`을 확인일로 갱신합니다.
+6. 모든 중요한 주장이 맞을 때만 `verification_status: verified`로 표시합니다.
+
+Kubernetes나 CNCF 프로젝트 구현처럼 Microsoft Learn이 최종 권위가 아닌 세부 사항은 `kubernetes.io`, `cncf.io` 또는 해당 프로젝트 공식 원문도 추가합니다. 검증을 끝내지 못한 문서는 `verification_status: needs-review`로 표시합니다. 자동 CI는 필드와 도메인을 검사하지만 본문의 의미를 대신 판단하지 않습니다.
+
+## 본문과 파일 규칙
+
+- 페이지마다 하나의 H1을 사용하고 H2/H3 순서를 건너뛰지 않습니다.
+- 코드 블록에는 언어를 지정하고 비밀·실제 식별자를 넣지 않습니다.
+- 문서 간 링크는 `.md` 소스 상대 경로를, 페이지 이미지는 `images/` 상대 경로를 사용합니다.
+- 모든 이미지에 내용을 설명하는 대체 텍스트를 작성합니다.
+- 실행 코드와 배포 파일은 `samples///`에 두고 GitHub 파일 링크로 연결합니다.
+- 원시 로그, 캡처 타임라인과 생성 결과는 문서가 아니라 sample/evidence로 보관합니다.
+
+## 공개 안전성
+
+고객·조직·사용자 실명, 구독·테넌트 ID, 키·토큰·인증서·연결 문자열, 내부 URL·IP·호스트명, 개인정보가 포함된 로그와 승인되지 않은 고객 화면을 게시하지 않습니다. `validate_public_safety.py`가 환경 고유 식별자의 대표 패턴을 검사하지만, 자동 검사와 별개로 사람이 원문과 이미지를 확인해야 합니다.
+
+## 로컬 검증
+
+```powershell
+python scripts/docs/validate_metadata.py
+python scripts/docs/validate_sources.py
+python scripts/docs/validate_links.py
+python scripts/docs/validate_public_safety.py
+mkdocs build --strict
+python scripts/docs/validate_search_index.py
+```
+
+`main`에 병합되면 GitHub Actions가 같은 검사를 다시 실행하고 생성된 `site/`을 Pages artifact로 배포합니다. 생성 HTML과 검색 인덱스는 Git에 커밋하지 않습니다.
diff --git a/docs/contributing/lab-template.md b/docs/contributing/lab-template.md
new file mode 100644
index 00000000..f1bd5304
--- /dev/null
+++ b/docs/contributing/lab-template.md
@@ -0,0 +1,46 @@
+---
+title: 실습 템플릿
+description: 재현 가능한 배포·검증·정리 실습 형식입니다.
+---
+
+# 실습 템플릿
+
+## Front matter
+
+```yaml
+---
+title: 실습 제목
+description: 배포하고 확인할 동작을 요약한 한 문장
+document_type: lab
+services: [azure-monitor]
+technologies: [bicep]
+tags: [deployment, monitoring]
+status: verified
+verification_status: verified
+sources_checked_at: 2026-09-12
+official_sources:
+ - title: 관련 Microsoft Learn 원문 제목
+ url: https://learn.microsoft.com/azure/azure-monitor/
+last_verified: 2026-09-12
+review_cycle_days: 90
+estimated_time: 45m
+cost: paid
+cleanup_required: true
+---
+```
+
+## 본문 순서
+
+```markdown
+# 실습 제목
+## 목표
+## 사전 조건
+## 비용과 안전 경계
+## 배포
+## 시나리오 실행
+## 예상 결과
+## 검증
+## 정리
+## 문제 해결
+## 공식 참고 자료
+```
diff --git a/docs/contributing/research-template.md b/docs/contributing/research-template.md
new file mode 100644
index 00000000..ecd9285f
--- /dev/null
+++ b/docs/contributing/research-template.md
@@ -0,0 +1,39 @@
+---
+title: 리서치 템플릿
+description: 비교·벤치마크·아키텍처 조사 형식입니다.
+---
+
+# 리서치 템플릿
+
+## Front matter
+
+```yaml
+---
+title: 리서치 제목
+description: 질문, 비교 대상과 결론을 요약한 한 문장
+document_type: research
+services: [azure-ai-search]
+technologies: [rag]
+tags: [benchmarking]
+status: current
+verification_status: verified
+sources_checked_at: 2026-09-12
+official_sources:
+ - title: 관련 Microsoft Learn 원문 제목
+ url: https://learn.microsoft.com/azure/search/
+published_at: 2026-09-12
+---
+```
+
+## 본문 순서
+
+```markdown
+# 리서치 제목
+## 질문
+## 조사 범위와 기준일
+## 조사 방법
+## 결과
+## 권고
+## 한계
+## 공식 출처
+```
diff --git a/develop/nodejs/fileio_issue_cpu_overhead.md b/docs/guides/application-development/nodejs-file-io-cpu/index.md
similarity index 82%
rename from develop/nodejs/fileio_issue_cpu_overhead.md
rename to docs/guides/application-development/nodejs-file-io-cpu/index.md
index 113f4af3..60327b2c 100644
--- a/develop/nodejs/fileio_issue_cpu_overhead.md
+++ b/docs/guides/application-development/nodejs-file-io-cpu/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- application-development
+official_sources:
+- title: JavaScript on Azure documentation
+ url: https://learn.microsoft.com/azure/developer/javascript/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Node.js 파일 I/O CPU 오버헤드 분석
+description: Node.js 서버의 파일 I/O로 인한 CPU 오버헤드를 분석하고 개선합니다.
+technologies:
+- nodejs
+tags:
+- performance
+- diagnostics
+- development
+---
+
# Node.js 서버 CPU 오버헤드 분석 및 개선 방안
## **문제 상황**
diff --git a/aisearch/custom_vectorization/images/indexer_vs_pushapi.png b/docs/guides/azure-ai-search/custom-embedding-ingestion/images/indexer_vs_pushapi.png
similarity index 100%
rename from aisearch/custom_vectorization/images/indexer_vs_pushapi.png
rename to docs/guides/azure-ai-search/custom-embedding-ingestion/images/indexer_vs_pushapi.png
diff --git a/aisearch/custom_vectorization/01_custom_embedding_guide.md b/docs/guides/azure-ai-search/custom-embedding-ingestion/index.md
similarity index 95%
rename from aisearch/custom_vectorization/01_custom_embedding_guide.md
rename to docs/guides/azure-ai-search/custom-embedding-ingestion/index.md
index 64bc97e2..a5969582 100644
--- a/aisearch/custom_vectorization/01_custom_embedding_guide.md
+++ b/docs/guides/azure-ai-search/custom-embedding-ingestion/index.md
@@ -1,8 +1,33 @@
+---
+services:
+- azure-ai-search
+official_sources:
+- title: Azure AI Search documentation
+ url: https://learn.microsoft.com/azure/search/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Custom 임베딩 적재 설계
+description: Azure AI Search의 SKU, 적재 방식과 GPU 임베딩 서빙 엔진 선택 기준을 설명합니다.
+technologies:
+- python
+- rag
+tags:
+- architecture
+- performance
+- deployment
+---
+
# Custom 임베딩 적재 가이드: SKU 선택부터 서빙 엔진까지
**Azure AI Search에 벡터를 적재하는 두 가지 경로(Indexer Pull vs Push API)와, GPU 임베딩 서빙 엔진(TEI vs vLLM) 선택 기준**
-> 관련 문서: [기본 가이드 (CPU, Indexer)](02_custom_vectorization.md) | [GPU vLLM RAG 가이드](03_gpu_vllm_rag_guide.md) | [청킹 전략 리서치](ref_chunking_strategies_research.md)
+> 관련 문서: [기본 가이드 (CPU, Indexer)](../custom-web-api-vectorization/index.md) | [GPU vLLM RAG 가이드](../gpu-vllm-rag/index.md) | [청킹 전략 리서치](../../../research/azure-ai-search/rag-chunking-strategies/index.md)
>
> 작성일: 2026-05-22
@@ -133,7 +158,7 @@ AI Search의 [Push API](https://learn.microsoft.com/en-us/azure/search/search-wh
#### 아키텍처 비교
-
+
#### Push API 성능이 높은 이유
@@ -155,7 +180,7 @@ Indexer: Push Pipeline:
4. **네트워크 오버헤드 감소**: 동일 클러스터 내부 통신 시 네트워크 hop이 줄어 지연 감소 (TLS 적용 여부는 보안/서비스 메시 구성에 따라 달라진다)
5. **실행 시간 제한 없음**: 인덱서의 실행 시간 제한(공용 2h / 전용 24h)이 없어 대량 적재 가능
-> Push API 파이프라인 코드 예시는 [Appendix A](#appendix-a-push-api-파이프라인-코드-예시) 참고.
+> Push API 파이프라인 코드 예시는 [Appendix A](#appendix-a-push-api) 참고.
#### 쿼리 시점: Custom Vectorizer (변경 없음)
@@ -268,7 +293,7 @@ TEI / vLLM (추론 서버)
(어댑터 필요: 쿼리 시점)
```
-> 어댑터 구현 예시: [tei-adapter](tei-adapter/) 디렉토리 참고
+> 어댑터 구현 예시: [tei-adapter](https://github.com/hellices/devguidesample/tree/main/samples/azure-ai-search/source-material/custom_vectorization/tei-adapter) 디렉토리 참고
---
diff --git a/aisearch/custom_vectorization/images/architecture.png b/docs/guides/azure-ai-search/custom-web-api-vectorization/images/architecture.png
similarity index 100%
rename from aisearch/custom_vectorization/images/architecture.png
rename to docs/guides/azure-ai-search/custom-web-api-vectorization/images/architecture.png
diff --git a/aisearch/custom_vectorization/02_custom_vectorization.md b/docs/guides/azure-ai-search/custom-web-api-vectorization/index.md
similarity index 91%
rename from aisearch/custom_vectorization/02_custom_vectorization.md
rename to docs/guides/azure-ai-search/custom-web-api-vectorization/index.md
index 34b48a9e..8a9d486e 100644
--- a/aisearch/custom_vectorization/02_custom_vectorization.md
+++ b/docs/guides/azure-ai-search/custom-web-api-vectorization/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-ai-search
+official_sources:
+- title: Azure AI Search documentation
+ url: https://learn.microsoft.com/azure/search/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Custom Web API 기반 외부 임베딩 통합
+description: Azure AI Search Custom Web API skill로 외부 임베딩 모델을 연결하는 방법을 설명합니다.
+technologies:
+- python
+- rest-api
+- rag
+tags:
+- deployment
+- architecture
+---
+
# Azure AI Search Custom Web API를 활용한 외부 임베딩 모델 통합 벡터화 가이드
**Azure OpenAI 없이, 자체 호스팅한 오픈소스 임베딩 모델을 Custom Web API Skill/Vectorizer로 AI Search Integrated Vectorization에 연동하는 방법**
@@ -12,7 +37,7 @@
| 검증 모델 | [BAAI/bge-m3](https://huggingface.co/BAAI/bge-m3), [Qwen/Qwen3-Embedding-0.6B](https://huggingface.co/Qwen/Qwen3-Embedding-0.6B) |
| 호스팅 | FastAPI 서버를 Container Apps (TLS 자동) 또는 AKS + cert-manager (Let's Encrypt)로 HTTPS 노출 |
| 핵심 검증 | Custom Web API Skill(인덱싱) + Custom Web API Vectorizer(쿼리) 동작 확인 |
-| 모델 비교 | [BGE-M3 vs Qwen3-Embedding-0.6B](ref_bge_m3_vs_qwen3_comparison.md) |
+| 모델 비교 | [BGE-M3 vs Qwen3-Embedding-0.6B](../../../research/azure-ai-search/bge-m3-vs-qwen3-embedding/index.md) |
| 인덱서 결과 | 5건 처리 / 0건 실패 |
---
@@ -54,12 +79,12 @@ Azure Blob Storage → Indexer → Custom Web API Skill → BG
| 구성 요소 | 리소스 | 세부 사항 |
|-----------|--------|-----------|
-| AI Search | `ais-aiplay-krc-01` (Standard) | 인덱스, 스킬셋, 인덱서, 벡터라이저 |
+| AI Search | `search-example-koreacentral-01` (Standard) | 인덱스, 스킬셋, 인덱서, 벡터라이저 |
| 임베딩 API | FastAPI (`embedding-api/app.py`) | Custom Web API Skill 계약 준수 |
-| HTTPS 엔드포인트 (A) | Container Apps `ca-bge-m3-embed` | TLS 자동 적용, 설정 최소 |
+| HTTPS 엔드포인트 (A) | Container Apps `ca-embedding-example-01` | TLS 자동 적용, 설정 최소 |
| HTTPS 엔드포인트 (B) | AKS Ingress `embed.{IP}.nip.io` | ingress-nginx + cert-manager + Let's Encrypt |
-| 컨테이너 레지스트리 | `acrcustomvec01` (Basic) | Docker 이미지 저장소 |
-| 스토리지 | `sacustomvecsrc01` | Blob 컨테이너 `sample-docs` (샘플 문서) |
+| 컨테이너 레지스트리 | `acrexamplekrc01` (Basic) | Docker 이미지 저장소 |
+| 스토리지 | `stexamplekrc01` | Blob 컨테이너 `sample-docs` (샘플 문서) |
| Region | koreacentral | 모든 리소스 동일 리전 |
---
@@ -71,7 +96,7 @@ Azure Blob Storage → Indexer → Custom Web API Skill → BG
ACR Tasks를 사용하여 로컬 Docker 없이 클라우드에서 빌드한다. BGE-M3 모델 가중치(~2.3GB)를 빌드 타임에 다운로드하여 Cold start를 방지한다.
```bash
-az acr build --registry acrcustomvec01 \
+az acr build --registry acrexamplekrc01 \
--image bge-m3-embedding:latest \
--file embedding-api/Dockerfile \
embedding-api/
@@ -92,24 +117,24 @@ Container Apps는 이미지를 배포하면 HTTPS가 자동 적용된다.
```bash
# Container Apps 환경 생성
-az containerapp env create --name cae-customvec \
- --resource-group rg-aiplay-krc-01 --location koreacentral
+az containerapp env create --name cae-example-koreacentral-01 \
+ --resource-group rg-example-koreacentral-01 --location koreacentral
# 임베딩 API 배포 (외부 HTTPS ingress)
-az containerapp create --name ca-bge-m3-embed \
- --resource-group rg-aiplay-krc-01 --environment cae-customvec \
- --image acrcustomvec01.azurecr.io/bge-m3-embedding:latest \
- --registry-server acrcustomvec01.azurecr.io \
+az containerapp create --name ca-embedding-example-01 \
+ --resource-group rg-example-koreacentral-01 --environment cae-example-koreacentral-01 \
+ --image acrexamplekrc01.azurecr.io/bge-m3-embedding:latest \
+ --registry-server acrexamplekrc01.azurecr.io \
--target-port 8000 --ingress external \
--cpu 2 --memory 4Gi --min-replicas 1 --max-replicas 1
```
```bash
# FQDN 확인
-az containerapp show --name ca-bge-m3-embed \
- --resource-group rg-aiplay-krc-01 \
+az containerapp show --name ca-embedding-example-01 \
+ --resource-group rg-example-koreacentral-01 \
--query properties.configuration.ingress.fqdn -o tsv
-# ca-bge-m3-embed.icycliff-31a3d588.koreacentral.azurecontainerapps.io
+# ca-embedding-example-01.example.koreacentral.azurecontainerapps.io
```
#### Option B. AKS + ingress-nginx + cert-manager (Let's Encrypt)
@@ -149,7 +174,7 @@ Ingress LoadBalancer IP를 확인하여 nip.io 도메인을 구성한다. nip.io
INGRESS_IP=$(kubectl get svc -n ingress-nginx ingress-nginx-controller \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "Domain: embed.${INGRESS_IP}.nip.io"
-# embed.20.249.162.81.nip.io
+# Domain: embed..nip.io
```
`k8s/ingress.yaml`의 host를 위 도메인으로 설정한 뒤 적용한다.
@@ -173,10 +198,10 @@ kubectl get certificate
```bash
# Option A (Container Apps)
-curl -s https://ca-bge-m3-embed.icycliff-31a3d588.koreacentral.azurecontainerapps.io/health
+curl -s https://ca-embedding-example-01.example.koreacentral.azurecontainerapps.io/health
# Option B (AKS + Let's Encrypt)
-curl -s https://embed.20.249.162.81.nip.io/health
+curl -s "https://embed.${INGRESS_IP}.nip.io/health"
# {"status":"ok","model":"BAAI/bge-m3"}
```
@@ -207,11 +232,11 @@ KEY=""
# AI Search MI에 Storage Blob Data Reader 역할 부여
az role assignment create \
--role "Storage Blob Data Reader" \
- --assignee-object-id $(az search service show --name ais-aiplay-krc-01 \
- --resource-group rg-aiplay-krc-01 --query identity.principalId -o tsv) \
+ --assignee-object-id $(az search service show --name search-example-koreacentral-01 \
+ --resource-group rg-example-koreacentral-01 --query identity.principalId -o tsv) \
--assignee-principal-type ServicePrincipal \
- --scope $(az storage account show --name sacustomvecsrc01 \
- --resource-group rg-aiplay-krc-01 --query id -o tsv)
+ --scope $(az storage account show --name stexamplekrc01 \
+ --resource-group rg-example-koreacentral-01 --query id -o tsv)
```
```bash
@@ -222,7 +247,7 @@ curl -X POST "$SEARCH_URL/datasources?api-version=2024-07-01" \
"name": "sample-docs-ds",
"type": "azureblob",
"credentials": {
- "connectionString": "ResourceId=/subscriptions/{sub}/resourceGroups/rg-aiplay-krc-01/providers/Microsoft.Storage/storageAccounts/sacustomvecsrc01/;"
+ "connectionString": "ResourceId=/subscriptions/{sub}/resourceGroups/rg-example-koreacentral-01/providers/Microsoft.Storage/storageAccounts/stexamplekrc01/;"
},
"container": {"name": "sample-docs"}
}'
@@ -239,9 +264,10 @@ curl -X POST "$SEARCH_URL/datasources?api-version=2024-07-01" \
```bash
# Option A: Container Apps FQDN
-# EMBED_URL="https://ca-bge-m3-embed.icycliff-31a3d588.koreacentral.azurecontainerapps.io"
+# EMBED_URL="https://ca-embedding-example-01.example.koreacentral.azurecontainerapps.io"
# Option B: AKS Ingress
-EMBED_URL="https://embed.20.249.162.81.nip.io"
+: "${INGRESS_IP:?Set INGRESS_IP to the Ingress LoadBalancer IP}"
+EMBED_URL="https://embed.${INGRESS_IP}.nip.io"
curl -X PUT "$SEARCH_URL/indexes/sample-vector-idx?api-version=2024-07-01" \
-H "Content-Type: application/json" -H "api-key: $KEY" \
@@ -492,7 +518,7 @@ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
다른 모델로 빌드하려면 `--build-arg`를 사용한다:
```bash
-az acr build --registry acrcustomvec01 \
+az acr build --registry acrexamplekrc01 \
--image qwen3-embedding:latest \
--build-arg EMBEDDING_MODEL=Qwen/Qwen3-Embedding-0.6B \
--file embedding-api/Dockerfile embedding-api/
@@ -794,7 +820,7 @@ curl -X POST "$SEARCH_URL/indexes/sample-chunk-idx/docs/search?api-version=2024-
### sentence-transformers → TEI 전환 시 차이
-TEI가 sentence-transformers보다 유리한 구조적 이유(dynamic batching, Rust 네이티브 동시성, GPU 최적화)는 [Custom 임베딩 적재 가이드 — 서빙 엔진 비교](01_custom_embedding_guide.md#3-gpu-임베딩-서빙-엔진-tei-vs-vllm) 참고. 아래는 이 가이드(CPU 기본 구성) 기준의 실용적 차이:
+TEI가 sentence-transformers보다 유리한 구조적 이유(dynamic batching, Rust 네이티브 동시성, GPU 최적화)는 [Custom 임베딩 적재 가이드 — 서빙 엔진 비교](../custom-embedding-ingestion/index.md#3-gpu-tei-vs-vllm) 참고. 아래는 이 가이드(CPU 기본 구성) 기준의 실용적 차이:
| | sentence-transformers (현재) | TEI |
|---|---|---|
@@ -819,7 +845,7 @@ Adapter와 TEI를 **같은 Pod의 sidecar**로 구성하면 네트워크 홉 없
어댑터는 모델을 포함하지 않으므로 빌드가 빠르다 (~30초).
```bash
-az acr build --registry acrcustomvec01 \
+az acr build --registry acrexamplekrc01 \
--image tei-adapter:latest \
--file tei-adapter/Dockerfile \
tei-adapter/
@@ -897,10 +923,10 @@ Ingress의 backend 서비스를 `bge-m3-embedding`으로 되돌리면 즉시 sen
---
## 📋 관련 문서
-- [GPU vLLM RAG 가이드](03_gpu_vllm_rag_guide.md) — T4 GPU에서 vLLM + Push API 대량 적재 + 하이브리드 검색
-- [BGE-M3 vs Qwen3-Embedding-0.6B 비교](ref_bge_m3_vs_qwen3_comparison.md) — 동일 파이프라인에서의 검색 품질 비교 결과
-- [Custom 임베딩 적재 가이드](01_custom_embedding_guide.md) — SKU 선택부터 서빙 엔진까지 의사결정 가이드
-- [청킹 전략 리서치](ref_chunking_strategies_research.md) — 7가지 최신 RAG 청킹 전략 비교 분석
+- [GPU vLLM RAG 가이드](../gpu-vllm-rag/index.md) — T4 GPU에서 vLLM + Push API 대량 적재 + 하이브리드 검색
+- [BGE-M3 vs Qwen3-Embedding-0.6B 비교](../../../research/azure-ai-search/bge-m3-vs-qwen3-embedding/index.md) — 동일 파이프라인에서의 검색 품질 비교 결과
+- [Custom 임베딩 적재 가이드](../custom-embedding-ingestion/index.md) — SKU 선택부터 서빙 엔진까지 의사결정 가이드
+- [청킹 전략 리서치](../../../research/azure-ai-search/rag-chunking-strategies/index.md) — 7가지 최신 RAG 청킹 전략 비교 분석
## 📋 참고
diff --git a/aisearch/custom_vectorization/images/gpu_vllm_rag_architecture.png b/docs/guides/azure-ai-search/gpu-vllm-rag/images/gpu_vllm_rag_architecture.png
similarity index 100%
rename from aisearch/custom_vectorization/images/gpu_vllm_rag_architecture.png
rename to docs/guides/azure-ai-search/gpu-vllm-rag/images/gpu_vllm_rag_architecture.png
diff --git a/aisearch/custom_vectorization/03_gpu_vllm_rag_guide.md b/docs/guides/azure-ai-search/gpu-vllm-rag/index.md
similarity index 90%
rename from aisearch/custom_vectorization/03_gpu_vllm_rag_guide.md
rename to docs/guides/azure-ai-search/gpu-vllm-rag/index.md
index 390ff3cc..53336852 100644
--- a/aisearch/custom_vectorization/03_gpu_vllm_rag_guide.md
+++ b/docs/guides/azure-ai-search/gpu-vllm-rag/index.md
@@ -1,8 +1,34 @@
+---
+services:
+- azure-ai-search
+official_sources:
+- title: Azure AI Search documentation
+ url: https://learn.microsoft.com/azure/search/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: GPU vLLM 기반 RAG 적재와 검색
+description: GPU vLLM 임베딩, Push API 대량 적재와 실시간 하이브리드 검색 구성을 설명합니다.
+technologies:
+- python
+- kubernetes
+- rag
+tags:
+- performance
+- deployment
+- architecture
+---
+
# GPU vLLM RAG 가이드: Push API 대량 적재 + 실시간 하이브리드 검색
**T4 GPU에서 vLLM 임베딩 + PIC 청킹을 통합 서빙하고, Push API로 대량 적재 + Custom Vectorizer로 실시간 하이브리드 검색을 수행하는 구성 가이드**
-> 관련 문서: [기본 가이드 (CPU, Indexer)](02_custom_vectorization.md) | [Custom 임베딩 적재 가이드](01_custom_embedding_guide.md) | [청킹 전략 리서치](ref_chunking_strategies_research.md)
+> 관련 문서: [기본 가이드 (CPU, Indexer)](../custom-web-api-vectorization/index.md) | [Custom 임베딩 적재 가이드](../custom-embedding-ingestion/index.md) | [청킹 전략 리서치](../../../research/azure-ai-search/rag-chunking-strategies/index.md)
>
> 작성일: 2026-05-22
@@ -21,7 +47,7 @@
| 청킹 전략 | PIC (Pseudo-Instruction Chunking) |
| 전환 방식 | Ingress backend 교체 — AI Search URI 변경 불필요 |
-> 모델·엔진·청킹 전략의 선택 근거는 [Appendix A](#appendix-a-모델엔진청킹-선택-근거), 벤치마크 결과는 [Appendix B](#appendix-b-성능-벤치마크) 참고.
+> 모델·엔진·청킹 전략의 선택 근거는 [Appendix A](#appendix-a), 벤치마크 결과는 [Appendix B](#appendix-b) 참고.
---
@@ -83,7 +109,7 @@ Qwen3-Embedding-4B의 출력 차원은 **2560**이다 (BGE-M3는 1024). Custom V
인덱스 생성 curl
```bash
-SEARCH_URL="https://ais-aiplay-krc-01.search.windows.net"
+SEARCH_URL="https://search-example-koreacentral-01.search.windows.net"
KEY=""
curl -X PUT "$SEARCH_URL/indexes/prod-chunk-idx?api-version=2024-07-01" \
@@ -125,7 +151,7 @@ curl -X PUT "$SEARCH_URL/indexes/prod-chunk-idx?api-version=2024-07-01" \
## 2. Push API 파이프라인
-인덱서 대신 Push API로 적재한다. 인덱서의 구조적 한계(deg≤10, 순차 배치, 공용 2h/전용 24h 제한)를 우회하여 GPU 활용률을 극대화한다. ([상세 비교](01_custom_embedding_guide.md))
+인덱서 대신 Push API로 적재한다. 인덱서의 구조적 한계(deg≤10, 순차 배치, 공용 2h/전용 24h 제한)를 우회하여 GPU 활용률을 극대화한다. ([상세 비교](../custom-embedding-ingestion/index.md))
파이프라인 흐름: **데이터 소스 → PIC 청킹(vLLM-chunk) → 임베딩(vLLM-embed) → Push API(AI Search)**
@@ -134,13 +160,13 @@ curl -X PUT "$SEARCH_URL/indexes/prod-chunk-idx?api-version=2024-07-01" \
- 적재: Push API 배치 제한 (요청당 최대 1000건 또는 16MB)
- Fallback: PIC 실패 시 원본 텍스트를 단일 청크로 적재
-> Indexer vs Push API의 개념적 비교와 하이브리드 운영 패턴은 [Custom 임베딩 적재 가이드 — 적재 방식](01_custom_embedding_guide.md#2-적재-방식-indexer-vs-push-api) 참고. 실측치(T4 Spot 3대, vLLM 3 replica): 500 docs 적재 147.9s (embed 37.71 c/s). 상세 결과는 [Appendix B](#appendix-b-성능-벤치마크) 참고.
+> Indexer vs Push API의 개념적 비교와 하이브리드 운영 패턴은 [Custom 임베딩 적재 가이드 — 적재 방식](../custom-embedding-ingestion/index.md#2-indexer-vs-push-api) 참고. 실측치(T4 Spot 3대, vLLM 3 replica): 500 docs 적재 147.9s (embed 37.71 c/s). 상세 결과는 [Appendix B](#appendix-b) 참고.
---
## 3. AKS GPU 노드풀
-실제 구성: `aks-customvec-krc` 클러스터, `rg-aiplay-krc-01` 리소스 그룹.
+실제 구성: `aks-example-koreacentral-01` 클러스터, `rg-example-koreacentral-01` 리소스 그룹.
노드풀 생성 CLI
@@ -148,8 +174,8 @@ curl -X PUT "$SEARCH_URL/indexes/prod-chunk-idx?api-version=2024-07-01" \
```bash
# GPU Spot 노드풀 (T4 × 1)
az aks nodepool add \
- --resource-group rg-aiplay-krc-01 \
- --cluster-name aks-customvec-krc \
+ --resource-group rg-example-koreacentral-01 \
+ --cluster-name aks-example-koreacentral-01 \
--name gpuspot \
--node-count 1 \
--node-vm-size Standard_NC16as_T4_v3 \
@@ -329,7 +355,7 @@ spec:
# Adapter — 쿼리 시점 Custom Vectorizer용 (AI Search 계약 변환)
- name: adapter
- image: acrcustomvec01.azurecr.io/vllm-adapter:latest
+ image: acrexamplekrc01.azurecr.io/vllm-adapter:latest
env:
- name: VLLM_URL
value: "http://localhost:8081"
@@ -560,9 +586,9 @@ curl localhost:8081/metrics | grep -E "vllm:(num_requests|gpu_cache)"
- [vLLM Embedding Models](https://docs.vllm.ai/en/latest/models/pooling_models.html)
- [Qwen3-Embedding 모델 라인업](https://huggingface.co/collections/Qwen/qwen3-embedding-67e5253e22bb421b4fa0ed10)
- [PIC — Pseudo-Instruction Chunking](https://aclanthology.org/2025.findings-acl.422/) (ACL-Findings 2025)
-- [기본 가이드 (CPU, Indexer)](02_custom_vectorization.md)
-- [Custom 임베딩 적재 가이드](01_custom_embedding_guide.md)
-- [청킹 전략 리서치](ref_chunking_strategies_research.md)
+- [기본 가이드 (CPU, Indexer)](../custom-web-api-vectorization/index.md)
+- [Custom 임베딩 적재 가이드](../custom-embedding-ingestion/index.md)
+- [청킹 전략 리서치](../../../research/azure-ai-search/rag-chunking-strategies/index.md)
---
@@ -576,13 +602,13 @@ curl localhost:8081/metrics | grep -E "vllm:(num_requests|gpu_cache)"
| vLLM + BGE-M3 | 0.57B 모델에서 PyTorch overhead가 크다 (23.85 c/s) |
| TEI + BGE-M3 | **51.11 c/s로 가장 빠르지만**, MTEB 성능이 Qwen3-4B 대비 낮아 품질·속도 트레이드오프 |
| vLLM + Qwen3-Embedding-8B | 8B(16GB)이면 T4 VRAM 전체를 소비, 청킹 LLM 공간 없음 |
-| sentence-transformers | 서버 레벨 dynamic batching 미지원, Python 단일 프로세스 동시성 제한 ([상세](01_custom_embedding_guide.md)) |
+| sentence-transformers | 서버 레벨 dynamic batching 미지원, Python 단일 프로세스 동시성 제한 ([상세](../custom-embedding-ingestion/index.md)) |
-vLLM은 PyTorch 기반이라 **Qwen3 아키텍처를 HuggingFace 가중치에서 직접 로딩** 가능하다. TEI(Rust/candle)는 모델별 커널을 별도 구현해야 하므로 신규 아키텍처 지원이 늦다. 단, BERT 계열(BGE-M3)에서는 TEI가 2.1배 빠르다 ([Appendix B](#appendix-b-성능-벤치마크) 참고).
+vLLM은 PyTorch 기반이라 **Qwen3 아키텍처를 HuggingFace 가중치에서 직접 로딩** 가능하다. TEI(Rust/candle)는 모델별 커널을 별도 구현해야 하므로 신규 아키텍처 지원이 늦다. 단, BERT 계열(BGE-M3)에서는 TEI가 2.1배 빠르다 ([Appendix B](#appendix-b) 참고).
### 청킹: PIC (Pseudo-Instruction Chunking)
-[청킹 전략 리서치](ref_chunking_strategies_research.md)에서 분석한 7가지 전략 중 PIC를 선택한 이유:
+[청킹 전략 리서치](../../../research/azure-ai-search/rag-chunking-strategies/index.md)에서 분석한 7가지 전략 중 PIC를 선택한 이유:
| 전략 | LLM 호출 | GPU 적합도 | 검색 품질 | 인덱싱 속도 | 선택 |
|------|---------|-----------|----------|-----------|------|
@@ -602,7 +628,7 @@ vLLM은 PyTorch 기반이라 **Qwen3 아키텍처를 HuggingFace 가중치에서
## Appendix B. 성능 벤치마크
-> **테스트 환경**: AKS (`aks-customvec-krc`, koreacentral), GPU 노드풀 Standard_NC16as_T4_v3 Spot × 3, AI Search Standard tier. 500개 Azure Docs .md 파일 (평균 ~8KB). Push API는 bench_runner의 section-based chunking, Indexer는 AI Search SplitSkill(pages, 2000자)을 사용하여 **chunk 수가 다를 수 있다**.
+> **테스트 환경**: AKS (`aks-example-koreacentral-01`, koreacentral), GPU 노드풀 Standard_NC16as_T4_v3 Spot × 3, AI Search Standard tier. 500개 Azure Docs .md 파일 (평균 ~8KB). Push API는 bench_runner의 section-based chunking, Indexer는 AI Search SplitSkill(pages, 2000자)을 사용하여 **chunk 수가 다를 수 있다**.
>
> **벤치마크 조건**: vLLM `--gpu-memory-utilization=0.95 --max-num-seqs=256 --max-model-len=2048`, GPU당 단독 실행. TEI `turing-latest` (Candle backend).
diff --git a/aisearch-v2/images/portal_ko_microsoft.png b/docs/guides/azure-ai-search/korean-analyzer-comparison/images/portal_ko_microsoft.png
similarity index 100%
rename from aisearch-v2/images/portal_ko_microsoft.png
rename to docs/guides/azure-ai-search/korean-analyzer-comparison/images/portal_ko_microsoft.png
diff --git a/aisearch-v2/images/portal_standard_lucene.png b/docs/guides/azure-ai-search/korean-analyzer-comparison/images/portal_standard_lucene.png
similarity index 100%
rename from aisearch-v2/images/portal_standard_lucene.png
rename to docs/guides/azure-ai-search/korean-analyzer-comparison/images/portal_standard_lucene.png
diff --git a/aisearch-v2/README.md b/docs/guides/azure-ai-search/korean-analyzer-comparison/index.md
similarity index 91%
rename from aisearch-v2/README.md
rename to docs/guides/azure-ai-search/korean-analyzer-comparison/index.md
index 270033ca..3178adbb 100644
--- a/aisearch-v2/README.md
+++ b/docs/guides/azure-ai-search/korean-analyzer-comparison/index.md
@@ -1,8 +1,31 @@
+---
+services:
+- azure-ai-search
+official_sources:
+- title: Azure AI Search documentation
+ url: https://learn.microsoft.com/azure/search/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Azure AI Search 한국어 분석기 비교
+description: Microsoft 한국어 분석기와 표준 Lucene 분석기의 동작을 비교합니다.
+technologies:
+- python
+tags:
+- diagnostics
+- performance
+---
+
# Azure AI Search 한국어 분석기(Analyzer) 비교 가이드
**필드에 지정하는 분석기(Analyzer)에 따라 한국어 복합명사/조사 검색 성능(recall)이 어떻게 달라지는지 실제 리소스로 재현하고, `ko.microsoft`가 가장 잘 검색되는 것을 정답/오답 데이터로 검증한 가이드**
-> **고객 증상 예시**: "특정 한국어 단어(예: `온누리상품권`)가 AI Search에서 검색되지 않는다", "인덱스 필드의 analyzer 설정에 따라 같은 검색어가 되기도 하고 안 되기도 한다". → 원인·해결·검증 절차는 [🛠️ 고객 적용 가이드](#️-고객-적용-가이드-진단--조치--검증) 참고.
+> **고객 증상 예시**: "특정 한국어 단어(예: `온누리상품권`)가 AI Search에서 검색되지 않는다", "인덱스 필드의 analyzer 설정에 따라 같은 검색어가 되기도 하고 안 되기도 한다". → 원인·해결·검증 절차는 [🛠️ 고객 적용 가이드](#_9) 참고.
---
@@ -14,7 +37,7 @@
| 결론 | **`ko.microsoft`만** 모든 쿼리 변형에서 기대정답을 완벽 회수(recall 5/5) |
| 근본 원인 | 기본값 `standard.lucene`은 복합명사 미분해 + 조사(은/는/도/과) 미제거 |
| 해결 | 한국어 필드에 `ko.microsoft` 분석기 지정 후 **재색인** |
-| 검증 리소스 | RG `aisearchtest` / AI Search `onnuri-search-59018` (Free, koreacentral) |
+| 검증 리소스 | RG `rg-search-example-koreacentral` / AI Search `search-example-koreacentral-02` (Free, koreacentral) |
| 검증 방법 | 정답 6건 + distractor 4건 데이터로 분석기별 recall/precision 비교 |
> `온누리상품권`은 분석기 동작을 보여주기 위한 **샘플 검색 키워드**일 뿐이며, 이 가이드는 AI Search 분석기 기능 자체에 초점을 둔다.
@@ -47,8 +70,8 @@
| 구성 요소 | 리소스 | 세부 사항 |
|-----------|--------|-----------|
-| Resource Group | `aisearchtest` | koreacentral |
-| AI Search | `onnuri-search-59018` | **Free** tier (비용 0) |
+| Resource Group | `rg-search-example-koreacentral` | koreacentral |
+| AI Search | `search-example-koreacentral-02` | **Free** tier (비용 0) |
| Index | `analyzer-compare-idx` | 동일 텍스트를 4개 분석기 필드로 색인 (모두 retrievable) |
| 샘플 데이터 | `sample_data.json` | 정답 6건 + distractor 4건 = 10건 |
| 테스트 스크립트 | `analyzer_test.py` | 인덱스 생성 → 업로드 → Analyze 비교 → 검색/ recall 비교 |
@@ -143,7 +166,7 @@ distractor(7~10)는 **어떤 분석기에서도 오탐되지 않았다**(precisi
## 🖥️ 포탈에서 확인하기
-Azure Portal → `onnuri-search-59018` → **Indexes → `analyzer-compare-idx` → Search explorer** → 우측 상단 **View → `JSON`** 으로 전환하면 JSON query editor가 열린다.
+Azure Portal → `search-example-koreacentral-02` → **Indexes → `analyzer-compare-idx` → Search explorer** → 우측 상단 **View → `JSON`** 으로 전환하면 JSON query editor가 열린다.
Search explorer는 기본적으로 모든 searchable 필드를 검색하므로, **`searchFields`로 분석기 필드를 지정**해 비교한다. 결과 본문(`content`)까지 보려면 `select`에 해당 필드를 넣는데, **`select`에는 retrievable(=검색결과 반환 허용) 필드만** 넣을 수 있다.
@@ -350,16 +373,17 @@ curl -s -X POST "https://{service}.search.windows.net/indexes/{index}-v2/docs/se
① 동의어(Synonym Map)로 표기 변형 흡수, ② 벡터/하이브리드 검색으로 의미 기반 보완, ③ 필요한 도메인 용어는 사용자 사전이 필요한 경우 커스텀 분석기 설계를 검토합니다.
**Q. 동의어 맵을 쓰면 분석기는 안 바꿔도 되나요?**
-아니요. 동의어는 분석기를 **대체하지 않고 보완**합니다([재현 3](#-재현-3--동의어synonym-map로-정확도-더-높이기) 참고). 조사를 못 떼는 `standard.lucene` 위에서는 동의어를 붙여도 회수에 실패할 수 있고, `ko.microsoft` 위에서 가장 잘 동작합니다. 또한 동의어 맵은 **쿼리 시점 적용**이라 필드에 연결하면 재색인 없이 반영되지만, 별칭이 형태소로 분해되면(예: `컬처랜드`→`컬처`/`랜드`) 발동하지 않을 수 있어 **분해되지 않는 단일 명사 형태**로 등록하는 것이 안전합니다.
+아니요. 동의어는 분석기를 **대체하지 않고 보완**합니다([재현 3](#3-synonym-map) 참고). 조사를 못 떼는 `standard.lucene` 위에서는 동의어를 붙여도 회수에 실패할 수 있고, `ko.microsoft` 위에서 가장 잘 동작합니다. 또한 동의어 맵은 **쿼리 시점 적용**이라 필드에 연결하면 재색인 없이 반영되지만, 별칭이 형태소로 분해되면(예: `컬처랜드`→`컬처`/`랜드`) 발동하지 않을 수 있어 **분해되지 않는 단일 명사 형태**로 등록하는 것이 안전합니다.
---
## ▶️ 재현 실행 방법
```powershell
-# 리소스는 이미 생성됨 (RG aisearchtest / onnuri-search-59018)
+# 아래 리소스 이름은 예시입니다. 사용할 리소스 그룹과 Azure AI Search 서비스를
+# 먼저 준비한 뒤 실제 이름으로 바꾸십시오.
# .env.example 을 .env 로 복사하고 SEARCH_ADMIN_KEY 채우기
-# az search admin-key show --service-name onnuri-search-59018 -g aisearchtest --query primaryKey -o tsv
+# az search admin-key show --service-name search-example-koreacentral-02 -g rg-search-example-koreacentral --query primaryKey -o tsv
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
@@ -372,7 +396,7 @@ python -m venv .venv
## 🧹 리소스 정리
```powershell
-az group delete -n aisearchtest --yes --no-wait
+az group delete -n rg-search-example-koreacentral --yes --no-wait
```
---
diff --git a/appgw/sse_response_buffer_disable.md b/docs/guides/azure-application-gateway/sse-response-buffering/index.md
similarity index 88%
rename from appgw/sse_response_buffer_disable.md
rename to docs/guides/azure-application-gateway/sse-response-buffering/index.md
index 5c1f3bf1..70d8ffb9 100644
--- a/appgw/sse_response_buffer_disable.md
+++ b/docs/guides/azure-application-gateway/sse-response-buffering/index.md
@@ -1,3 +1,26 @@
+---
+services:
+- azure-application-gateway
+official_sources:
+- title: Azure Application Gateway documentation
+ url: https://learn.microsoft.com/azure/application-gateway/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Application Gateway SSE 응답 버퍼링 비활성화
+description: Server-Sent Events 통신을 위해 Application Gateway 응답 버퍼링을 조정합니다.
+technologies:
+- rest-api
+tags:
+- networking
+- performance
+---
+
# Application Gateway SSE 통신 시 Response Buffer 비활성화 가이드
## 문제 상황
diff --git a/appgw/waf_custom_rule_ip_whitelist.md b/docs/guides/azure-application-gateway/waf-path-ip-allowlist/index.md
similarity index 95%
rename from appgw/waf_custom_rule_ip_whitelist.md
rename to docs/guides/azure-application-gateway/waf-path-ip-allowlist/index.md
index 35e965dd..63d6d14d 100644
--- a/appgw/waf_custom_rule_ip_whitelist.md
+++ b/docs/guides/azure-application-gateway/waf-path-ip-allowlist/index.md
@@ -1,3 +1,26 @@
+---
+services:
+- azure-application-gateway
+official_sources:
+- title: Azure Application Gateway documentation
+ url: https://learn.microsoft.com/azure/application-gateway/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Application Gateway WAF 경로 기반 IP 허용
+description: Application Gateway WAF custom rule로 특정 경로의 IP 허용 목록을 구성합니다.
+technologies:
+- rest-api
+tags:
+- security
+- networking
+---
+
# Application Gateway WAF: 경로 기반 IP 화이트리스트 설정 가이드
> Azure Application Gateway WAF v2에서 커스텀 룰을 사용하여 특정 경로에 대해 허용된 IP만 접근 가능하도록 설정하는 방법을 정리한 문서. AGW 레벨(전체 적용)과 리스너별 적용 두 가지 방식을 모두 다룬다.
diff --git a/architect/request_in_second.md b/docs/guides/azure-architecture/response-time-optimization/index.md
similarity index 73%
rename from architect/request_in_second.md
rename to docs/guides/azure-architecture/response-time-optimization/index.md
index c45df76a..1221d37b 100644
--- a/architect/request_in_second.md
+++ b/docs/guides/azure-architecture/response-time-optimization/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- azure-architecture
+official_sources:
+- title: Azure Architecture Center
+ url: https://learn.microsoft.com/azure/architecture/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Azure 응답 시간 최적화 설계 고려사항
+description: 초 단위 응답 시간을 줄이기 위한 Azure 아키텍처 고려사항을 정리합니다.
+technologies:
+- rest-api
+tags:
+- architecture
+- latency
+- performance
+---
+
# 응답속도 최적화를 위한 azure architect 고려사항
> 모든 azure의 제품을 고려할 때 네트워크의 홉이 증가한다는 사실을 고려해야 함
diff --git a/automation/portal-cli-limitations.md b/docs/guides/azure-automation/portal-cli-limitations/index.md
similarity index 90%
rename from automation/portal-cli-limitations.md
rename to docs/guides/azure-automation/portal-cli-limitations/index.md
index d996736a..07cc0db3 100644
--- a/automation/portal-cli-limitations.md
+++ b/docs/guides/azure-automation/portal-cli-limitations/index.md
@@ -1,7 +1,31 @@
+---
+services:
+- azure-automation
+official_sources:
+- title: Azure Automation documentation
+ url: https://learn.microsoft.com/azure/automation/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Azure Automation 포털과 CLI 제한사항
+description: Azure Automation의 포털 및 CLI 제약과 우회 방법을 정리합니다.
+technologies:
+- azure-cli
+- powershell
+tags:
+- troubleshooting
+- development
+---
+
# Azure Automation - 포탈/CLI 제한사항 및 우회 방법
> 작성일: 2026-03-08
-> 대상: Automation Account `autorecovery` (RG: `rg-hellices-krc-01`)
+> 대상: Automation Account `` (RG: `rg-example-koreacentral-01`)
---
diff --git a/cosmosdb/nodejs/client.md b/docs/guides/azure-cosmos-db/nodejs-client-optimization/index.md
similarity index 93%
rename from cosmosdb/nodejs/client.md
rename to docs/guides/azure-cosmos-db/nodejs-client-optimization/index.md
index e41ea323..f7aa0e11 100644
--- a/cosmosdb/nodejs/client.md
+++ b/docs/guides/azure-cosmos-db/nodejs-client-optimization/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- azure-cosmos-db
+official_sources:
+- title: Azure Cosmos DB documentation
+ url: https://learn.microsoft.com/azure/cosmos-db/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Azure Cosmos DB Node.js Client 최적화
+description: Node.js 애플리케이션에서 Cosmos DB Client 연결과 사용을 최적화합니다.
+technologies:
+- nodejs
+- cosmos-db
+tags:
+- performance
+- development
+---
+
# CosmosDB Client 최적화 방안
## 개요
diff --git a/cosmosdb/nodejs/query_thread_with_low_core.md b/docs/guides/azure-cosmos-db/nodejs-dns-lookup-bottleneck/index.md
similarity index 82%
rename from cosmosdb/nodejs/query_thread_with_low_core.md
rename to docs/guides/azure-cosmos-db/nodejs-dns-lookup-bottleneck/index.md
index d7885e94..f864ad5f 100644
--- a/cosmosdb/nodejs/query_thread_with_low_core.md
+++ b/docs/guides/azure-cosmos-db/nodejs-dns-lookup-bottleneck/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-cosmos-db
+official_sources:
+- title: Azure Cosmos DB documentation
+ url: https://learn.microsoft.com/azure/cosmos-db/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Cosmos DB 연속 쿼리 DNS Lookup 병목 진단
+description: 낮은 CPU 환경의 연속 쿼리에서 발생하는 DNS lookup 병목을 진단하고 완화합니다.
+technologies:
+- nodejs
+- cosmos-db
+tags:
+- networking
+- performance
+- troubleshooting
+---
+
# **Cosmos DB 연속 쿼리 시 DNS Lookup 병목 최적화 가이드**
## ✅ **문제 상황**
@@ -35,7 +60,7 @@ const CacheableLookup = require('cacheable-lookup');
const cacheable = new CacheableLookup();
cacheable.install(http);
-http.get('http://db-neu-prd-cosmos-northeurope.documents.azure.com', (res) => {
+http.get('http://cosmos-example-northeurope.documents.azure.com', (res) => {
console.log('Status:', res.statusCode);
});
```
diff --git a/cosmosdb/nodejs/point_read.md b/docs/guides/azure-cosmos-db/point-read-optimization/index.md
similarity index 95%
rename from cosmosdb/nodejs/point_read.md
rename to docs/guides/azure-cosmos-db/point-read-optimization/index.md
index fb63019f..bec7471f 100644
--- a/cosmosdb/nodejs/point_read.md
+++ b/docs/guides/azure-cosmos-db/point-read-optimization/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- azure-cosmos-db
+official_sources:
+- title: Azure Cosmos DB documentation
+ url: https://learn.microsoft.com/azure/cosmos-db/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Cosmos DB Point Read 최적화
+description: Point Read를 활용해 Azure Cosmos DB 요청량과 지연 시간을 줄입니다.
+technologies:
+- nodejs
+- cosmos-db
+tags:
+- performance
+- latency
+---
+
# CosmosDB Point Read를 활용한 트래픽 및 Latency 최적화 전략
## 문제 정의
diff --git a/mysql/nodejs/db_upgrade_zero_downtime.md b/docs/guides/azure-database-for-mysql/blue-green-upgrade/index.md
similarity index 97%
rename from mysql/nodejs/db_upgrade_zero_downtime.md
rename to docs/guides/azure-database-for-mysql/blue-green-upgrade/index.md
index d2b88ff8..94b0420d 100644
--- a/mysql/nodejs/db_upgrade_zero_downtime.md
+++ b/docs/guides/azure-database-for-mysql/blue-green-upgrade/index.md
@@ -1,3 +1,29 @@
+---
+services:
+- azure-database-for-mysql
+official_sources:
+- title: Azure Database for MySQL documentation
+ url: https://learn.microsoft.com/azure/mysql/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Azure MySQL Blue/Green 무중단 업그레이드
+description: AKS와 Node.js mysql2 PoolCluster를 이용한 Azure MySQL Blue/Green 전환을 설명합니다.
+technologies:
+- nodejs
+- mysql
+- kubernetes
+tags:
+- migration
+- high-availability
+- reliability
+---
+
# Azure MySQL 무중단 업그레이드: Blue/Green 전략 구현 (AKS + Node.js mysql2 PoolCluster)
## 개요
diff --git a/mysql/nodejs/read_write_routing.md b/docs/guides/azure-database-for-mysql/nodejs-read-write-routing/index.md
similarity index 88%
rename from mysql/nodejs/read_write_routing.md
rename to docs/guides/azure-database-for-mysql/nodejs-read-write-routing/index.md
index e4261de1..217cde12 100644
--- a/mysql/nodejs/read_write_routing.md
+++ b/docs/guides/azure-database-for-mysql/nodejs-read-write-routing/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-database-for-mysql
+official_sources:
+- title: Azure Database for MySQL documentation
+ url: https://learn.microsoft.com/azure/mysql/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Azure MySQL Node.js 읽기/쓰기 라우팅
+description: MySQL Flexible Server와 Node.js mysql2의 읽기/쓰기 연결 라우팅을 설명합니다.
+technologies:
+- nodejs
+- mysql
+tags:
+- high-availability
+- performance
+- development
+---
+
아래는 **Node.js에서 mysql2를 사용해 Azure Database for MySQL Flexible Server를 Primary(쓰기) + Replica(읽기) 구성 시 적용할 수 있는 한글 가이드**입니다. Microsoft Learn 공식 문서 링크도 포함했습니다.
***
diff --git a/aks/argocd_image_updater.md b/docs/guides/azure-kubernetes-service/argocd-image-updater-acr/index.md
similarity index 96%
rename from aks/argocd_image_updater.md
rename to docs/guides/azure-kubernetes-service/argocd-image-updater-acr/index.md
index 1bdaa838..4560d148 100644
--- a/aks/argocd_image_updater.md
+++ b/docs/guides/azure-kubernetes-service/argocd-image-updater-acr/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Argo CD Image Updater와 ACR 연동
+description: AKS에서 Argo CD Image Updater가 Azure Container Registry 이미지를 갱신하도록 구성합니다.
+technologies:
+- kubernetes
+- gitops
+tags:
+- deployment
+- authentication
+---
+
# ✅ ArgoCD Image Updater + ACR on AKS 설정 가이드
**AKS에서 ArgoCD Image Updater v2를 사용하여 Azure Container Registry(ACR)의 이미지 태그를 자동으로 감지하고 업데이트하는 전체 과정을 정리한 문서.**
@@ -124,8 +148,8 @@ az identity create \
--location
# 출력에서 clientId, principalId 기록
-# clientId: 예) 4baa8b8b-e2db-4c10-9043-168edc8466a0
-# principalId: 예) 8eb24516-2c4d-4217-9239-353ec59ae24a
+# clientId: 예)
+# principalId: 예)
# 2. ACR에 AcrPull 역할 부여
ACR_ID=$(az acr show --name --query id -o tsv)
@@ -515,8 +539,8 @@ level=debug msg="Image already on latest allowed version"
**해결**: `imageName`에서 태그 제거.
```yaml
-imageName: acrrubiconkrc01.azurecr.io/test-app:1.0.0 # ❌
-imageName: acrrubiconkrc01.azurecr.io/test-app # ✅
+imageName: acrexamplekrc01.azurecr.io/test-app:1.0.0 # ❌
+imageName: acrexamplekrc01.azurecr.io/test-app # ✅
```
### 오류 5: AZURE 환경변수 미주입
diff --git a/aks/authorization-troubleshooting.md b/docs/guides/azure-kubernetes-service/authorization-troubleshooting/index.md
similarity index 94%
rename from aks/authorization-troubleshooting.md
rename to docs/guides/azure-kubernetes-service/authorization-troubleshooting/index.md
index 0fc01328..5a7f340b 100644
--- a/aks/authorization-troubleshooting.md
+++ b/docs/guides/azure-kubernetes-service/authorization-troubleshooting/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: AKS 배포 Authorization 오류 진단
+description: AKS 배포 과정의 Azure 권한 오류를 분류하고 진단하는 절차를 설명합니다.
+technologies:
+- kubernetes
+- azure-cli
+tags:
+- authorization
+- troubleshooting
+---
+
# ✅ AKS 배포 시 Authorization 오류 트러블슈팅 가이드
**Pod 배포 시 LinkedAuthorizationFailed 오류 디버깅 및 해결 방법**
diff --git a/aks/cni-overlay-nsg.md b/docs/guides/azure-kubernetes-service/cni-overlay-nsg/index.md
similarity index 93%
rename from aks/cni-overlay-nsg.md
rename to docs/guides/azure-kubernetes-service/cni-overlay-nsg/index.md
index f2545303..50f75c21 100644
--- a/aks/cni-overlay-nsg.md
+++ b/docs/guides/azure-kubernetes-service/cni-overlay-nsg/index.md
@@ -1,3 +1,26 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: AKS CNI Overlay와 NSG 구성
+description: AKS CNI Overlay를 사용할 때 NSG 규칙과 트래픽 경로의 주의점을 설명합니다.
+technologies:
+- kubernetes
+tags:
+- networking
+- security
+---
+
# ✅ AKS CNI Overlay 사용 시 NSG 설정 주의사항
**CNI Overlay에서 Pod IP 대역을 NSG에 허용해야 하는 이유**
diff --git a/aks/kaito_opensource_model.md b/docs/guides/azure-kubernetes-service/kaito-open-source-model/index.md
similarity index 93%
rename from aks/kaito_opensource_model.md
rename to docs/guides/azure-kubernetes-service/kaito-open-source-model/index.md
index a7f07ab3..70e83614 100644
--- a/aks/kaito_opensource_model.md
+++ b/docs/guides/azure-kubernetes-service/kaito-open-source-model/index.md
@@ -1,3 +1,26 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: AKS와 KAITO로 오픈소스 LLM 서빙
+description: AKS에서 KAITO를 이용해 오픈소스 언어 모델을 배포하고 서빙합니다.
+technologies:
+- kubernetes
+tags:
+- ai-agents
+- deployment
+---
+
# AKS + KAITO로 오픈소스 LLM 서빙하기
KAITO(Kubernetes AI Toolchain Operator)를 사용해 AKS 위에 오픈소스 LLM을 배포하는 전체 과정을 정리한다.
diff --git a/aks/affinity.md b/docs/guides/azure-kubernetes-service/pod-affinity-distribution/index.md
similarity index 82%
rename from aks/affinity.md
rename to docs/guides/azure-kubernetes-service/pod-affinity-distribution/index.md
index 62aa927c..4e37e14a 100644
--- a/aks/affinity.md
+++ b/docs/guides/azure-kubernetes-service/pod-affinity-distribution/index.md
@@ -1,3 +1,26 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Pod Affinity를 이용한 AKS 워크로드 분산
+description: AKS에서 Pod affinity와 anti-affinity로 워크로드를 분산하는 예제를 설명합니다.
+technologies:
+- kubernetes
+tags:
+- kubernetes
+- reliability
+---
+
# ✅ AKS에서 Pod 분산 예제
**PodAntiAffinity + TopologySpreadConstraints + HPA 예시**
diff --git a/aks/agent-pool.md b/docs/guides/azure-kubernetes-service/pod-scheduling-agent-pools/index.md
similarity index 82%
rename from aks/agent-pool.md
rename to docs/guides/azure-kubernetes-service/pod-scheduling-agent-pools/index.md
index 8f5120f3..9efd8e39 100644
--- a/aks/agent-pool.md
+++ b/docs/guides/azure-kubernetes-service/pod-scheduling-agent-pools/index.md
@@ -1,3 +1,26 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: AKS Agent Pool 기반 Pod 스케줄링
+description: AKS agent pool, label, taint와 affinity를 이용한 스케줄링 패턴을 설명합니다.
+technologies:
+- kubernetes
+tags:
+- kubernetes
+- deployment
+---
+
# ✅ AKS에서 Pod 스케줄링 제어 Best Practice
**taint + toleration, affinity, nodeSelector 비교 및 조합**
diff --git a/aks/pyroscope-chat-profiling/images/anf-create-bucket.png b/docs/guides/azure-kubernetes-service/pyroscope-anf-s3/images/anf-create-bucket.png
similarity index 100%
rename from aks/pyroscope-chat-profiling/images/anf-create-bucket.png
rename to docs/guides/azure-kubernetes-service/pyroscope-anf-s3/images/anf-create-bucket.png
diff --git a/aks/pyroscope-chat-profiling/images/anf-create-certificate.png b/docs/guides/azure-kubernetes-service/pyroscope-anf-s3/images/anf-create-certificate.png
similarity index 100%
rename from aks/pyroscope-chat-profiling/images/anf-create-certificate.png
rename to docs/guides/azure-kubernetes-service/pyroscope-anf-s3/images/anf-create-certificate.png
diff --git a/aks/pyroscope-chat-profiling/images/architecture.png b/docs/guides/azure-kubernetes-service/pyroscope-anf-s3/images/architecture.png
similarity index 100%
rename from aks/pyroscope-chat-profiling/images/architecture.png
rename to docs/guides/azure-kubernetes-service/pyroscope-anf-s3/images/architecture.png
diff --git a/aks/pyroscope-chat-profiling/images/pyroscope_ui.png b/docs/guides/azure-kubernetes-service/pyroscope-anf-s3/images/pyroscope_ui.png
similarity index 100%
rename from aks/pyroscope-chat-profiling/images/pyroscope_ui.png
rename to docs/guides/azure-kubernetes-service/pyroscope-anf-s3/images/pyroscope_ui.png
diff --git a/aks/pyroscope_anf_s3_deployment.md b/docs/guides/azure-kubernetes-service/pyroscope-anf-s3/index.md
similarity index 90%
rename from aks/pyroscope_anf_s3_deployment.md
rename to docs/guides/azure-kubernetes-service/pyroscope-anf-s3/index.md
index c42f6025..9c943a7d 100644
--- a/aks/pyroscope_anf_s3_deployment.md
+++ b/docs/guides/azure-kubernetes-service/pyroscope-anf-s3/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: AKS Pyroscope와 Azure NetApp Files S3 배포
+description: Pyroscope을 AKS에 배포하고 Azure NetApp Files S3를 백엔드로 구성합니다.
+technologies:
+- kubernetes
+- python
+tags:
+- observability
+- deployment
+- storage
+---
+
# Pyroscope을 AKS에 배포하기 (S3 백엔드를 Azure NetApp Files로)
> **Pyroscope란?** Grafana의 오픈소스 지속프로파일링(continuous profiling) 플랫폼입니다.
@@ -10,16 +35,16 @@
> S3 호환 API**로 구현하는 것입니다. (프로파일링 대상 예시로 Python pod를 사용)
## 목차
-0. [목표 & 시나리오](#목표--시나리오)
-1. [아키텍처 개요](#아키텍처-개요)
-2. [필수 사전 조건](#필수-사전-조건)
-3. [1단계: ANF 구성 (S3 백엔드)](#1단계-anf-구성-s3-백엔드)
-4. [2단계: ANF S3 Bucket 설정](#2단계-anf-s3-bucket-설정)
-5. [3단계: Pyroscope 배포](#3단계-pyroscope-배포)
-6. [4단계: 검증](#4단계-검증)
-7. [5단계: 애플리케이션 프로파일링 (예제)](#5단계-애플리케이션-프로파일링-예제)
-8. [프로파일 수집 방식 & 언어별 지원](#프로파일-수집-방식--언어별-지원)
-9. [설정값 정리](#설정값-정리)
+0. [목표 & 시나리오](#_2)
+1. [아키텍처 개요](#_3)
+2. [필수 사전 조건](#_4)
+3. [1단계: ANF 구성 (S3 백엔드)](#1-anf-s3)
+4. [2단계: ANF S3 Bucket 설정](#2-anf-s3-bucket)
+5. [3단계: Pyroscope 배포](#3-pyroscope)
+6. [4단계: 검증](#4)
+7. [5단계: 애플리케이션 프로파일링 (예제)](#5)
+8. [프로파일 수집 방식 & 언어별 지원](#_5)
+9. [설정값 정리](#_7)
---
@@ -40,24 +65,24 @@ Python Pod (앱 + SDK) ──push──▶ Pyroscope Server ──S3 API─
```
> **왜 ANF인가**: MinIO 운영 불필요, ANF 용량으로 자동 스케일, 엔터프라이즈 SLA·스냅샷·3-way replica.
-> **이미 떠있는 앱 프로파일링**은 이미지 재빌드 없이 SDK 초기화 몇 줄만 추가 → [5단계](#5단계-애플리케이션-프로파일링-예제).
+> **이미 떠있는 앱 프로파일링**은 이미지 재빌드 없이 SDK 초기화 몇 줄만 추가 → [5단계](#5).
---
## 아키텍처 개요
-
+
**핵심 포인트:**
- MinIO 제거: `enabled: false`
- S3 저장소: Azure NetApp Files S3-compatible API
- 네트워킹: Private HTTPS (self-signed cert)
- 자격증명: AWS SigV4 (AccessKey + SecretKey)
-- 애플리케이션 프로파일: SDK가 Pyroscope로 직접 push (Python 예제는 [5단계](#5단계-애플리케이션-프로파일링-예제) 참고)
+- 애플리케이션 프로파일: SDK가 Pyroscope로 직접 push (Python 예제는 [5단계](#5) 참고)
Pyroscope UI 플레임그래프 예시:
-
+
---
@@ -169,18 +194,18 @@ ANF는 버킷을 NFS/SMB 볼륨 위에 얹고 S3 접근에 self-signed 인증서
인증서 생성 옵션:
-
+
버킷 생성 메뉴 (Name / Path / UID·GID / Permissions / Certificate):
-
+
> 위 스크린샷은 Microsoft Learn 문서
> [Configure object REST API in Azure NetApp Files](https://learn.microsoft.com/en-us/azure/azure-netapp-files/object-rest-api-access-configure)
> (최종 갱신 2026-05-20)에서 인용했습니다. 최신 UI는 원문을 참고하세요.
> 포털 가이드: [Configure object REST API in Azure NetApp Files](https://learn.microsoft.com/en-us/azure/azure-netapp-files/object-rest-api-access-configure)
-> 여기서 얻은 `endpoint`(`https://`), `accessKey`, `secretKey`를 [3단계](#3단계-pyroscope-배포)에 사용합니다.
+> 여기서 얻은 `endpoint`(`https://`), `accessKey`, `secretKey`를 [3단계](#3-pyroscope)에 사용합니다.
### 2.B ARM REST API로 생성 (자동화용 대안)
@@ -378,8 +403,8 @@ kubectl port-forward -n observability svc/pyroscope 4040:4040
아래는 동작을 바로 확인할 수 있는 **데모**입니다. Azure AI Foundry를 호출하는 FastAPI 앱에
Pyroscope Python SDK를 붙여 콜스택을 수집합니다.
-> 예제 코드: [pyroscope-chat-profiling/](pyroscope-chat-profiling/)
-> ([app.py](pyroscope-chat-profiling/app.py) · [deployment.yaml](pyroscope-chat-profiling/deployment.yaml) · [deploy.sh](pyroscope-chat-profiling/deploy.sh) · [test.py](pyroscope-chat-profiling/test.py))
+> 예제 코드: [pyroscope-chat-profiling/](https://github.com/hellices/devguidesample/tree/main/samples/azure-kubernetes-service/source-material/pyroscope-chat-profiling)
+> ([app.py](https://github.com/hellices/devguidesample/blob/main/samples/azure-kubernetes-service/source-material/pyroscope-chat-profiling/app.py) · [deployment.yaml](https://github.com/hellices/devguidesample/blob/main/samples/azure-kubernetes-service/source-material/pyroscope-chat-profiling/deployment.yaml) · [deploy.sh](https://github.com/hellices/devguidesample/blob/main/samples/azure-kubernetes-service/source-material/pyroscope-chat-profiling/deploy.sh) · [test.py](https://github.com/hellices/devguidesample/blob/main/samples/azure-kubernetes-service/source-material/pyroscope-chat-profiling/test.py))
5.1 핵심 동작 (펼치기)
@@ -430,7 +455,7 @@ kubectl port-forward -n observability svc/pyroscope 4040:4040
# → http://localhost:4040 (service: ai-foundry-chat)
```
-
+
**플레임그래프 읽는 법 (분석):**
- 가로 폭 = 해당 함수가 점유한 CPU 시간 비율. **넓은 박스 = bottleneck 후보**.
diff --git a/aks/memray-leak-profiling/reports/leak-leaks.png b/docs/guides/azure-kubernetes-service/python-memory-leak-memray/images/leak-leaks.png
similarity index 100%
rename from aks/memray-leak-profiling/reports/leak-leaks.png
rename to docs/guides/azure-kubernetes-service/python-memory-leak-memray/images/leak-leaks.png
diff --git a/aks/memray_leak_profiling.md b/docs/guides/azure-kubernetes-service/python-memory-leak-memray/index.md
similarity index 88%
rename from aks/memray_leak_profiling.md
rename to docs/guides/azure-kubernetes-service/python-memory-leak-memray/index.md
index 8c1cd137..103ed0a5 100644
--- a/aks/memray_leak_profiling.md
+++ b/docs/guides/azure-kubernetes-service/python-memory-leak-memray/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: AKS Python Pod 메모리 누수 분석
+description: kubectl debug와 Memray attach를 이용해 Python Pod 메모리 누수를 분석합니다.
+technologies:
+- kubernetes
+- python
+tags:
+- diagnostics
+- performance
+- troubleshooting
+---
+
# AKS Python Pod 메모리 누수 — `kubectl debug` + Memray attach
앱 이미지를 건드리지 않고, 재시작 없이, **memray가 설치된 디버그 이미지를
@@ -21,7 +46,7 @@
## 사전 준비: 디버그 이미지
-gdb + procps + memray를 담은 이미지를 레지스트리에 상비 ([debug/Dockerfile](./memray-leak-profiling/debug/Dockerfile)):
+gdb + procps + memray를 담은 이미지를 레지스트리에 상비 ([debug/Dockerfile](https://github.com/hellices/devguidesample/blob/main/samples/azure-kubernetes-service/source-material/memray-leak-profiling/debug/Dockerfile)):
```dockerfile
# ⚠️ 베이스는 앱과 동일 Python 버전 — memray attach 는 "타깃 프로세스 안"에서
@@ -143,9 +168,9 @@ kubectl cp memray-demo/$POD:/tmp/leak-leaks.html reports/leak-leaks.html
`--leaks` 플레임그래프 — 프레임 hover 시 파일/라인/크기/횟수 표시
(`_remember_turn_context`, app.py:50 — 5.4MB / 2,544 allocations):
-
+
-- 원본 HTML(인터랙티브): [`reports/leak-leaks.html`](./memray-leak-profiling/reports/leak-leaks.html) · [`reports/leak-flamegraph.html`](./memray-leak-profiling/reports/leak-flamegraph.html)
+- 원본 HTML 파일(내려받아 브라우저에서 열기): [`reports/leak-leaks.html`](https://github.com/hellices/devguidesample/blob/main/samples/azure-kubernetes-service/source-material/memray-leak-profiling/reports/leak-leaks.html) · [`reports/leak-flamegraph.html`](https://github.com/hellices/devguidesample/blob/main/samples/azure-kubernetes-service/source-material/memray-leak-profiling/reports/leak-flamegraph.html)
- 절대 수치는 캡처 시점/부하에 따라 상이 (tree와 스크린샷은 별도 60s 캡처) — 핵심은 **비율 + 콜스택**
- 대조군 `_synthesize_answer`(요청 종료 시 해제)는 leaks 리포트 **미등장** → 오탐 없음
- 상단 노란 배너 = pymalloc 안내: 소형 객체는 풀 잔류 노이즈 가능 →
@@ -176,7 +201,7 @@ kubectl rollout restart deploy/leaky-agent -n memray-demo
| attach 권한 | 앱 파드에 SYS_PTRACE 불필요. 단 RBAC `pods/ephemeralcontainers` + privileged 허용 정책 필요 |
| 멀티워커 (gunicorn) | `ps`로 워커 PID 확인 → 워커별 attach (`--follow-fork`는 run 모드 전용) |
| 오버헤드 | attach 추적 중 수 배 감속 가능 — 카나리아/단일 파드에 짧게 |
-| 상시 프로파일링 | memray = 스팟 조사용. 상시는 [Pyroscope](./pyroscope_anf_s3_deployment.md) 등 continuous profiler 병행 |
+| 상시 프로파일링 | memray = 스팟 조사용. 상시는 [Pyroscope](../pyroscope-anf-s3/index.md) 등 continuous profiler 병행 |
- **잘 잡는 것**: Python 힙 상주 객체 증가형 누수, C 확장 malloc 누수(`--native`)
- **한계**: macOS는 allocator 패치 불가 → 사실상 Linux 전용 (로컬 재현도 컨테이너에서), attach는 attach 이후 할당만 추적
@@ -185,7 +210,7 @@ kubectl rollout restart deploy/leaky-agent -n memray-demo
## Appendix
-재현 환경 전체 코드: [`memray-leak-profiling/`](./memray-leak-profiling/)
+재현 환경 전체 코드: [`memray-leak-profiling/`](https://github.com/hellices/devguidesample/tree/main/samples/azure-kubernetes-service/source-material/memray-leak-profiling)
```
memray-leak-profiling/
@@ -215,7 +240,7 @@ memray-leak-profiling/
(agent 서비스에서 대화 메모리/툴 로그 무제한 축적 시 동일 증상)
- `/stats`로 RSS/세션 수/히스토리 수 노출 → 관찰용
-앱 이미지는 clean 유지 ([Dockerfile](./memray-leak-profiling/Dockerfile)):
+앱 이미지는 clean 유지 ([Dockerfile](https://github.com/hellices/devguidesample/blob/main/samples/azure-kubernetes-service/source-material/memray-leak-profiling/Dockerfile)):
```dockerfile
FROM python:3.12-slim
@@ -244,7 +269,7 @@ az aks get-credentials -g rg-memray-demo -n aks-memray-demo
이미지 빌드 — 로컬 docker 불필요, ACR 클라우드 빌드 (Apple Silicon 크로스빌드 이슈도 회피):
```bash
-cd aks/memray-leak-profiling
+cd samples/azure-kubernetes-service/source-material/memray-leak-profiling
az acr build --registry --image leaky-agent:v2 --platform linux/amd64 . # 24s
az acr build --registry --image memray-debug:v1 --platform linux/amd64 ./debug # 33s
```
diff --git a/aks/local_dev_loop.md b/docs/guides/azure-kubernetes-service/remote-cluster-local-development/index.md
similarity index 88%
rename from aks/local_dev_loop.md
rename to docs/guides/azure-kubernetes-service/remote-cluster-local-development/index.md
index 14ebec7b..a9bf9325 100644
--- a/aks/local_dev_loop.md
+++ b/docs/guides/azure-kubernetes-service/remote-cluster-local-development/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: AKS 원격 클러스터와 로컬 개발 루프
+description: Telepresence와 mirrord를 이용해 AKS 트래픽을 로컬 개발 환경으로 연결합니다.
+technologies:
+- kubernetes
+- python
+tags:
+- development
+- networking
+---
+
# AKS 원격 클러스터 + 로컬 개발 루프 (Telepresence / mirrord)
AKS에 배포된 서비스를 대상으로, **코드를 이미지로 빌드/배포하지 않고**
@@ -12,7 +36,7 @@ AKS에 배포된 서비스를 대상으로, **코드를 이미지로 빌드/배
- [Use Telepresence to develop and test microservices locally — MS Learn](https://learn.microsoft.com/en-us/azure/aks/use-telepresence-aks)
- [Local Development on AKS with mirrord — AKS Engineering Blog](https://blog.aks.azure.com/2024/12/04/mirrord-on-aks)
-예제 파일: [`local_dev_loop/`](./local_dev_loop/)
+예제 파일: [`local_dev_loop/`](https://github.com/hellices/devguidesample/tree/main/samples/azure-kubernetes-service/source-material/local_dev_loop)
```
local_dev_loop/
@@ -26,7 +50,7 @@ local_dev_loop/
## 📌 사전 요구사항
-- Azure CLI, `kubectl`, AKS 클러스터 (예시: `aks-customvec-krc` @ `rg-aiplay-krc-01`)
+- Azure CLI, `kubectl`, AKS 클러스터 (예시: `aks-example-koreacentral-01` @ `rg-example-koreacentral-01`)
- Telepresence: `brew install telepresenceio/telepresence/telepresence-oss`
- mirrord: `brew install metalbear-co/mirrord/mirrord`
- (UI 사용 시) VS Code + `code --install-extension MetalBear.mirrord`
@@ -36,8 +60,8 @@ local_dev_loop/
## 1. 대상 서비스 배포
```bash
-az aks get-credentials -g rg-aiplay-krc-01 -n aks-customvec-krc
-kubectl apply -f local_dev_loop/k8s/echo-service.yaml
+az aks get-credentials -g rg-example-koreacentral-01 -n aks-example-koreacentral-01
+kubectl apply -f samples/azure-kubernetes-service/source-material/local_dev_loop/k8s/echo-service.yaml
kubectl -n tp-demo rollout status deploy/echo-server
```
@@ -180,7 +204,7 @@ F5(Run/Debug)만으로 mirrord가 적용된다. **브레이크포인트를 찍
"name": "mirrord demo: local-server (echo-server steal)",
"type": "debugpy",
"request": "launch",
- "program": "${workspaceFolder}/aks/local_dev_loop/local/local-server.py",
+ "program": "${workspaceFolder}/samples/azure-kubernetes-service/source-material/local_dev_loop/local/local-server.py",
"console": "integratedTerminal",
"env": {
"MIRRORD_ACTIVE": "1",
@@ -234,10 +258,10 @@ telepresence helm uninstall # Traffic Manager 제거
# mirrord — agent pod는 세션 종료 시 자동 삭제됨
# 샘플 서비스 제거
-kubectl delete -f local_dev_loop/k8s/echo-service.yaml
+kubectl delete -f samples/azure-kubernetes-service/source-material/local_dev_loop/k8s/echo-service.yaml
# 비용 절약: 클러스터 중지
-az aks stop -g rg-aiplay-krc-01 -n aks-customvec-krc
+az aks stop -g rg-example-koreacentral-01 -n aks-example-koreacentral-01
```
> ⚠️ 예시 클러스터는 시작 시 `gpuspot` 노드풀(NC16as_T4_v3 spot ×3)에
diff --git a/aks/spot_gpu_kaito_llm.md b/docs/guides/azure-kubernetes-service/spot-h100-kaito/index.md
similarity index 95%
rename from aks/spot_gpu_kaito_llm.md
rename to docs/guides/azure-kubernetes-service/spot-h100-kaito/index.md
index 22633311..3828c5e6 100644
--- a/aks/spot_gpu_kaito_llm.md
+++ b/docs/guides/azure-kubernetes-service/spot-h100-kaito/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: AKS Spot H100 GPU와 KAITO LLM 서빙
+description: AKS Spot H100 GPU 노드에서 KAITO 기반 모델을 배포하는 절차를 설명합니다.
+technologies:
+- kubernetes
+- azure-cli
+tags:
+- ai-agents
+- deployment
+- performance
+---
+
# ✅ AKS Spot H100 GPU + KAITO LLM 서빙 가이드
**AKS에서 Azure Spot H100 GPU 노드와 KAITO(AI Toolchain Operator)로 `phi-4-mini-instruct`를 서빙한 End-to-End 검증 사례**
@@ -232,7 +257,7 @@ AKS에서 Azure Spot H100 GPU 노드를 사용하고, KAITO(AI Toolchain Operato
| GPU 노드풀 (Spot) | `gpuspot`, `Standard_NC40ads_H100_v5` × 1 (H100 94GB, Spot, max-price -1), autoscaler 0-1 |
| GPU 노드 Taint | `sku=gpu:NoSchedule` + AKS 자동 `kubernetes.azure.com/scalesetpriority=spot:NoSchedule` |
| 모델 | `phi-4-mini-instruct` (KAITO preset, vLLM runtime) |
-| Workspace CR | [workspace-phi4-mini.yaml](workspace-phi4-mini.yaml) |
+| Workspace CR | [workspace-phi4-mini.yaml](#4-kaito-workspace) |
| Service | `workspace-phi-4-mini` ClusterIP:80 (OpenAI 호환 API) |
> Spot VM은 Spot Core 쿼터가 설정되어 있지 않아도 배포 가능 (정규 H100 쿼터와 무관).
diff --git a/aks/workload_identity_databricks_keyless.md b/docs/guides/azure-kubernetes-service/workload-identity-databricks/index.md
similarity index 87%
rename from aks/workload_identity_databricks_keyless.md
rename to docs/guides/azure-kubernetes-service/workload-identity-databricks/index.md
index c8ecce48..2871c68e 100644
--- a/aks/workload_identity_databricks_keyless.md
+++ b/docs/guides/azure-kubernetes-service/workload-identity-databricks/index.md
@@ -1,8 +1,34 @@
+---
+services:
+- azure-kubernetes-service
+official_sources:
+- title: Azure Kubernetes Service documentation
+ url: https://learn.microsoft.com/azure/aks/
+- title: Authenticate with managed identity
+ url: https://learn.microsoft.com/azure/api-management/authentication-managed-identity-policy
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: AKS Workload Identity로 Databricks 키리스 호출
+description: AKS Workload Identity 토큰으로 Databricks Model Serving을 비밀 없이 호출합니다.
+technologies:
+- kubernetes
+- nodejs
+tags:
+- authentication
+- security
+---
+
# AKS Workload Identity로 Databricks Model Serving 키리스(Keyless) 호출
> 시나리오: AKS Pod → Databricks Foundation Model API (`databricks-meta-llama-3-1-8b-instruct`)
> 어떤 PAT/시크릿/Databricks OAuth secret도 사용하지 않고, **AKS Workload Identity**가 발급한 Entra ID(AAD) 액세스 토큰을 그대로 Databricks Bearer 토큰으로 사용합니다.
-> APIM 가이드(`apim/databricks_keyless_managed_identity.md`)와 같은 인증 모델을 Pod-측에서 구현한 패턴.
+> [APIM `authentication-managed-identity` 정책](https://learn.microsoft.com/azure/api-management/authentication-managed-identity-policy)과 같은 인증 모델을 Pod 측에서 구현한 패턴입니다.
---
@@ -195,7 +221,7 @@ POST {DBX_HOST}/serving-endpoints/{ENDPOINT}/invocations → 200 + predictions
- HTTP keep-alive / HTTP/2 풀 (`undici Pool`)
- 타임아웃 / AbortSignal / 재시도
-> 인증 모델은 [apim/databricks_keyless_managed_identity.md](../apim/databricks_keyless_managed_identity.md) 의 APIM 정책(`authentication-managed-identity`)과 동일. APIM에서는 게이트웨이가 토큰을 받아 붙여주지만, 여기서는 앱 코드가 같은 일을 두 줄로 합니다.
+> 인증 모델은 [APIM `authentication-managed-identity` 정책](https://learn.microsoft.com/azure/api-management/authentication-managed-identity-policy)과 동일합니다. APIM에서는 게이트웨이가 토큰을 받아 붙여주지만, 여기서는 앱 코드가 같은 일을 두 줄로 합니다.
---
@@ -357,7 +383,7 @@ Client → Application Gateway (WAF, TLS) → Internal Service / Ingress → Pod
- Pod 자체 노출 금지: Service를 `ClusterIP`로 바꾸고 AGIC/NGINX Ingress를 Application Gateway 백엔드로.
- AppGW WAF_v2로 외부 인입 보호, 클라이언트는 자체 도메인(`api.contoso.com`)으로 호출.
-- 필요하면 Pod 앞에 APIM(Internal VNet)을 추가해 `apim/databricks_keyless_managed_identity.md` 의 4계층 패턴(Client → AppGW → APIM → 백엔드) 적용 가능. 단, 이 경우 인증 부착 책임을 APIM 정책으로 옮길지(Pod에서 제거), 양쪽 다 둘지(이중 keyless) 결정 필요.
+- 필요하면 Pod 앞에 APIM(Internal VNet)을 추가해 Client → AppGW → APIM → 백엔드의 4계층 패턴을 적용할 수 있습니다. 이 경우 인증 부착 책임을 [APIM `authentication-managed-identity` 정책](https://learn.microsoft.com/azure/api-management/authentication-managed-identity-policy)으로 옮길지(Pod에서 제거), 양쪽에 둘지 결정해야 합니다.
---
@@ -381,4 +407,4 @@ Client → Application Gateway (WAF, TLS) → Internal Service / Ingress → Pod
- AKS Workload Identity: https://learn.microsoft.com/azure/aks/workload-identity-overview
- Databricks AAD audience: https://learn.microsoft.com/azure/databricks/dev-tools/api/latest/aad/service-prin-aad-token
- Databricks Serving Endpoints REST: https://docs.databricks.com/api/workspace/servingendpoints
-- 자매 가이드 (게이트웨이 측 keyless): `apim/databricks_keyless_managed_identity.md`
+- 게이트웨이 측 keyless 참고: [APIM `authentication-managed-identity` 정책](https://learn.microsoft.com/azure/api-management/authentication-managed-identity-policy)
diff --git a/loadtest/images/01-test-list.png b/docs/guides/azure-load-testing/locust-appgw-aks-private/images/01-test-list.png
similarity index 100%
rename from loadtest/images/01-test-list.png
rename to docs/guides/azure-load-testing/locust-appgw-aks-private/images/01-test-list.png
diff --git a/loadtest/images/02-run-summary.png b/docs/guides/azure-load-testing/locust-appgw-aks-private/images/02-run-summary.png
similarity index 100%
rename from loadtest/images/02-run-summary.png
rename to docs/guides/azure-load-testing/locust-appgw-aks-private/images/02-run-summary.png
diff --git a/loadtest/images/03-request-statistics.png b/docs/guides/azure-load-testing/locust-appgw-aks-private/images/03-request-statistics.png
similarity index 100%
rename from loadtest/images/03-request-statistics.png
rename to docs/guides/azure-load-testing/locust-appgw-aks-private/images/03-request-statistics.png
diff --git a/loadtest/images/04-client-side-metrics.png b/docs/guides/azure-load-testing/locust-appgw-aks-private/images/04-client-side-metrics.png
similarity index 100%
rename from loadtest/images/04-client-side-metrics.png
rename to docs/guides/azure-load-testing/locust-appgw-aks-private/images/04-client-side-metrics.png
diff --git a/loadtest/images/05-server-side-metrics.png b/docs/guides/azure-load-testing/locust-appgw-aks-private/images/05-server-side-metrics.png
similarity index 100%
rename from loadtest/images/05-server-side-metrics.png
rename to docs/guides/azure-load-testing/locust-appgw-aks-private/images/05-server-side-metrics.png
diff --git a/loadtest/images/06-engine-health.png b/docs/guides/azure-load-testing/locust-appgw-aks-private/images/06-engine-health.png
similarity index 100%
rename from loadtest/images/06-engine-health.png
rename to docs/guides/azure-load-testing/locust-appgw-aks-private/images/06-engine-health.png
diff --git a/loadtest/images/07-compare-select.png b/docs/guides/azure-load-testing/locust-appgw-aks-private/images/07-compare-select.png
similarity index 100%
rename from loadtest/images/07-compare-select.png
rename to docs/guides/azure-load-testing/locust-appgw-aks-private/images/07-compare-select.png
diff --git a/loadtest/images/08-compare-result.png b/docs/guides/azure-load-testing/locust-appgw-aks-private/images/08-compare-result.png
similarity index 100%
rename from loadtest/images/08-compare-result.png
rename to docs/guides/azure-load-testing/locust-appgw-aks-private/images/08-compare-result.png
diff --git a/loadtest/loadtest_locust_appgw_aks.md b/docs/guides/azure-load-testing/locust-appgw-aks-private/index.md
similarity index 96%
rename from loadtest/loadtest_locust_appgw_aks.md
rename to docs/guides/azure-load-testing/locust-appgw-aks-private/index.md
index bcf569cf..802a2716 100644
--- a/loadtest/loadtest_locust_appgw_aks.md
+++ b/docs/guides/azure-load-testing/locust-appgw-aks-private/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-load-testing
+official_sources:
+- title: Azure Load Testing documentation
+ url: https://learn.microsoft.com/azure/load-testing/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Private 환경 Locust 부하 테스트 구성
+description: Application Gateway와 AKS를 대상으로 Private 환경에서 Locust 부하 테스트를 구성합니다.
+technologies:
+- python
+- kubernetes
+tags:
+- benchmarking
+- networking
+- performance
+---
+
# Korea Central Private 환경의 Locust 부하테스트 구성 가이드
## 📌 문제 상황
@@ -7,7 +32,7 @@ Azure Load Testing(현 Azure App Testing)은 Korea Central을 지원하지 않
> ⚠️ **Azure Load Testing은 2026년 기준 Korea Central / Korea South에서 사용 불가**하며, 가장 가까운 지원 리전은 **Japan East**이다.
-> 📌 이 가이드는 **AKS + AGIC + Private AppGW가 이미 구성**되어 있다고 가정한다. 테스트 타깃이 없는 경우 [부록 A](#-부록-a-테스트-타깃-구성-aks--agic--backend)를 먼저 수행한다.
+> 📌 이 가이드는 **AKS + AGIC + Private AppGW가 이미 구성**되어 있다고 가정한다. 테스트 타깃이 없는 경우 [부록 A](#a-aks-agic-backend)를 먼저 수행한다.
## 🔍 구성 개요
@@ -502,7 +527,7 @@ backend-app-ingress * 10.0.1.10 80 16s
| AppGW 404 Not Found | AGIC가 ARM으로 AppGW를 비동기 생성 | 권한 부여 → pod 재시작 → 5~10분 대기 |
| Ingress ADDRESS 비어 있음 | Private frontend IP 추가 전 상태 | Private IP 추가 후 Ingress 재생성 |
-부록 A 완료 후 본문 [Step 1](#step-1-부하테스트용-vnet-생성-japan-east)부터 진행한다.
+부록 A 완료 후 본문 [Step 1](#step-1-vnet-japan-east)부터 진행한다.
---
diff --git a/monitor/otel-monitor-setup.md b/docs/guides/azure-monitor/aks-private-opentelemetry/index.md
similarity index 84%
rename from monitor/otel-monitor-setup.md
rename to docs/guides/azure-monitor/aks-private-opentelemetry/index.md
index ab660142..329d34de 100644
--- a/monitor/otel-monitor-setup.md
+++ b/docs/guides/azure-monitor/aks-private-opentelemetry/index.md
@@ -1,21 +1,46 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: AKS 폐쇄망 OpenTelemetry와 Azure Monitor 구성
+description: 폐쇄망 AKS에서 OpenTelemetry와 Azure Monitor 메트릭 파이프라인을 구축합니다.
+technologies:
+- kubernetes
+- open-telemetry
+tags:
+- observability
+- monitoring
+- networking
+---
+
# AKS 폐쇄망 환경 OpenTelemetry + Azure Monitor 메트릭 파이프라인 구축
## 1. 환경 개요
| 항목 | 값 |
|------|-----|
-| AKS 클러스터 | `aks-rubicon-koreacentral-01` (Private Cluster) |
-| 리소스 그룹 | `rg-rubicon-koreacentral-01` |
-| PRD 리소스 그룹 | `rg-rubicon-koreacentral-prd-01` |
-| 구독 | `f752aff6-b20c-4973-b32b-0a60ba2c6764` |
+| AKS 클러스터 | `aks-example-koreacentral-01` (Private Cluster) |
+| 리소스 그룹 | `rg-example-koreacentral-01` |
+| PRD 리소스 그룹 | `rg-example-koreacentral-prd-01` |
+| 구독 | `` |
| 리전 | Korea Central |
-| VNet (기존) | `vnet-rubicon-koreacentral-01` (`10.0.0.0/10`) |
-| VNet (PRD) | `vnet-rubicon-koreacentral-prd-01` (`10.100.0.0/16`) |
+| VNet (기존) | `vnet-example-koreacentral-01` (`10.0.0.0/10`) |
+| VNet (PRD) | `vnet-example-koreacentral-prd-01` (`10.100.0.0/16`) |
| AKS 서브넷 | `aks-subnet` (`10.1.0.0/24`) |
| PE 서브넷 | `pe-subnet` (`10.2.0.0/22`) |
-| Azure Firewall | `fw-rubicon-koreacentral-prd-01` (Private IP: `10.100.0.4`) |
-| Azure Monitor Workspace | `azuremonitor-workspace-rubicon-krc-01` |
-| Managed Grafana | `grafanaworkspacerubicon` |
+| Azure Firewall | `fw-example-koreacentral-prd-01` (Private IP: `10.100.0.4`) |
+| Azure Monitor Workspace | `azuremonitor-workspace-example-krc-01` |
+| Managed Grafana | `grafanaworkspaceexample` |
| 노드 Taint | `workload=general:NoSchedule`, `CriticalAddonsOnly=true:NoSchedule` |
| 네트워크 특성 | **폐쇄망** (방화벽 TLS Inspection, 아웃바운드 제한) |
| DNS 구성 | 양쪽 VNet → Firewall DNS Proxy (`10.100.0.4`) → Azure DNS |
@@ -51,11 +76,11 @@ flowchart TB
end
subgraph AZURE["Azure (Private Link)"]
- subgraph AMPLS_SCOPE["AMPLS: ampls-rubicon-krc-01"]
- DCE["DCE MSProm-koreacentral- aks-rubicon-koreacentral"]
- DCE2["DCE azuremonitor-workspace- rubicon-krc-01"]
+ subgraph AMPLS_SCOPE["AMPLS: ampls-example-krc-01"]
+ DCE["DCE MSProm-koreacentral- aks-example-koreacentral"]
+ DCE2["DCE azuremonitor-workspace- example-krc-01"]
end
- PE["Private Endpoint pe-ampls-rubicon-krc-01 (pe-subnet)"]
+ PE["Private Endpoint pe-ampls-example-krc-01 (pe-subnet)"]
AMW["Azure Monitor Workspace"]
GRAFANA["Managed Grafana"]
end
@@ -75,9 +100,9 @@ flowchart TB
DNS -.->|"PRD VNet에 링크됨"| AKS
subgraph NET["네트워크 / DNS"]
- EXISTING_VNET["vnet-rubicon-koreacentral-01 10.0.0.0/10"]
- PRD_VNET["vnet-rubicon-koreacentral-prd-01 10.100.0.0/16"]
- FIREWALL["Azure Firewall fw-rubicon-koreacentral-prd-01 DNS Proxy: 10.100.0.4"]
+ EXISTING_VNET["vnet-example-koreacentral-01 10.0.0.0/10"]
+ PRD_VNET["vnet-example-koreacentral-prd-01 10.100.0.0/16"]
+ FIREWALL["Azure Firewall fw-example-koreacentral-prd-01 DNS Proxy: 10.100.0.4"]
EXISTING_VNET <-->|"VNet Peering"| PRD_VNET
PRD_VNET --- FIREWALL
FIREWALL -->|"DNS Proxy → Azure DNS"| DNS
@@ -239,12 +264,12 @@ kubectl apply -f otel-collector.yaml
**포털에서 생성:**
1. Azure Portal → **Azure Monitor Private Link Scope** → 만들기
-2. 이름: `ampls-rubicon-krc-01`
+2. 이름: `ampls-example-krc-01`
3. 연결된 리소스 (DCE 2개 추가):
- - `MSProm-koreacentral-aks-rubicon-koreacentral` (RG: `rg-rubicon-koreacentral-01`)
- - `azuremonitor-workspace-rubicon-krc-01` (RG: `MA_azuremonitor-workspace-rubicon-krc-01_koreacentral_managed`)
+ - `MSProm-koreacentral-aks-example-koreacentral` (RG: `rg-example-koreacentral-01`)
+ - `azuremonitor-workspace-example-krc-01` (RG: `MA_azuremonitor-workspace-example-krc-01_koreacentral_managed`)
4. Private Endpoint 생성:
- - 이름: `pe-ampls-rubicon-krc-01`
+ - 이름: `pe-ampls-example-krc-01`
- 서브넷: `pe-subnet`
- Private DNS Zone 통합: 사용
@@ -258,13 +283,13 @@ AMPLS 생성 시 자동으로 5개 DNS Zone이 생성됨.
| Private DNS Zone | 용도 | VNet 링크 |
|---|---|---|
-| `privatelink.monitor.azure.com` | 메트릭 수집 엔드포인트 | `vnet-rubicon-koreacentral-prd-01` |
-| `privatelink.ods.opinsights.azure.com` | ODS 데이터 채널 | `vnet-rubicon-koreacentral-prd-01` |
-| `privatelink.oms.opinsights.azure.com` | OMS 포털 | `vnet-rubicon-koreacentral-prd-01` |
-| `privatelink.agentsvc.azure-automation.net` | 에이전트 서비스 | `vnet-rubicon-koreacentral-prd-01` |
-| `privatelink.blob.core.windows.net` | Blob 스토리지 | `vnet-rubicon-koreacentral-prd-01` |
-| `*.privatelink.koreacentral.azmk8s.io` | AKS API Server | `vnet-rubicon-koreacentral-prd-01` |
-| `privatelink.redis.azure.net` | Redis Cache | `vnet-rubicon-koreacentral-prd-01` |
+| `privatelink.monitor.azure.com` | 메트릭 수집 엔드포인트 | `vnet-example-koreacentral-prd-01` |
+| `privatelink.ods.opinsights.azure.com` | ODS 데이터 채널 | `vnet-example-koreacentral-prd-01` |
+| `privatelink.oms.opinsights.azure.com` | OMS 포털 | `vnet-example-koreacentral-prd-01` |
+| `privatelink.agentsvc.azure-automation.net` | 에이전트 서비스 | `vnet-example-koreacentral-prd-01` |
+| `privatelink.blob.core.windows.net` | Blob 스토리지 | `vnet-example-koreacentral-prd-01` |
+| `*.privatelink.koreacentral.azmk8s.io` | AKS API Server | `vnet-example-koreacentral-prd-01` |
+| `privatelink.redis.azure.net` | Redis Cache | `vnet-example-koreacentral-prd-01` |
**DNS 해석 경로:**
```
@@ -278,7 +303,7 @@ VM/AKS Pod → Firewall DNS Proxy (10.100.0.4) → Azure DNS (168.63.129.16)
**DNS 해석 확인:**
```bash
# AKS 파드 내부에서
-nslookup msprom-koreacentral-aks-rubicon-koreacentral-ruja.koreacentral-1.metrics.ingest.monitor.azure.com
+nslookup msprom-koreacentral-aks-example-koreacentral-ruja.koreacentral-1.metrics.ingest.monitor.azure.com
# → 10.2.0.6 (Private IP ✅)
nslookup global.handler.control.monitor.azure.com
@@ -296,8 +321,8 @@ nslookup global.handler.control.monitor.azure.com
| DCR 이름 | 리소스 그룹 | 연결할 DCE |
|---|---|---|
-| `MSProm-koreacentral-aks-rubicon-koreacentral-01` | `rg-rubicon-koreacentral-01` | `MSProm-koreacentral-aks-rubicon-koreacentral` |
-| `azuremonitor-workspace-rubicon-krc-01` | `MA_..._managed` | `azuremonitor-workspace-rubicon-krc-01` |
+| `MSProm-koreacentral-aks-example-koreacentral-01` | `rg-example-koreacentral-01` | `MSProm-koreacentral-aks-example-koreacentral` |
+| `azuremonitor-workspace-example-krc-01` | `MA_..._managed` | `azuremonitor-workspace-example-krc-01` |
### 3.6 ⭐ configurationAccessEndpoint DCRA 생성 (핵심!)
@@ -329,7 +354,7 @@ nslookup global.handler.control.monitor.azure.com
#### 방법 1: 포털에서 설정
1. Azure Portal → **Monitor** → **데이터 수집 규칙 (Data Collection Rules)**
-2. Prometheus DCR 선택 (예: `MSProm-koreacentral-aks-rubicon-koreacentral-01`)
+2. Prometheus DCR 선택 (예: `MSProm-koreacentral-aks-example-koreacentral-01`)
3. 왼쪽 메뉴 → **리소스 (Resources)** 탭
4. AKS 클러스터 리소스의 **데이터 수집 엔드포인트** 열에서 DCE 선택
5. 저장 → `configurationAccessEndpoint` DCRA가 자동 생성됨
@@ -338,14 +363,14 @@ nslookup global.handler.control.monitor.azure.com
```bash
az rest --method put \
- --url "/subscriptions/f752aff6-b20c-4973-b32b-0a60ba2c6764/resourceGroups/rg-rubicon-koreacentral-01/providers/Microsoft.ContainerService/managedClusters/aks-rubicon-koreacentral-01/providers/Microsoft.Insights/dataCollectionRuleAssociations/configurationAccessEndpoint?api-version=2023-03-11" \
- --body '{"properties":{"dataCollectionEndpointId":"/subscriptions/f752aff6-b20c-4973-b32b-0a60ba2c6764/resourceGroups/rg-rubicon-koreacentral-01/providers/Microsoft.Insights/dataCollectionEndpoints/MSProm-koreacentral-aks-rubicon-koreacentral"}}'
+ --url "/subscriptions//resourceGroups/rg-example-koreacentral-01/providers/Microsoft.ContainerService/managedClusters/aks-example-koreacentral-01/providers/Microsoft.Insights/dataCollectionRuleAssociations/configurationAccessEndpoint?api-version=2023-03-11" \
+ --body '{"properties":{"dataCollectionEndpointId":"/subscriptions//resourceGroups/rg-example-koreacentral-01/providers/Microsoft.Insights/dataCollectionEndpoints/MSProm-koreacentral-aks-example-koreacentral"}}'
```
**확인:**
```bash
az rest --method get \
- --url "/subscriptions/f752aff6-b20c-4973-b32b-0a60ba2c6764/resourceGroups/rg-rubicon-koreacentral-01/providers/Microsoft.ContainerService/managedClusters/aks-rubicon-koreacentral-01/providers/Microsoft.Insights/dataCollectionRuleAssociations?api-version=2023-03-11" \
+ --url "/subscriptions//resourceGroups/rg-example-koreacentral-01/providers/Microsoft.ContainerService/managedClusters/aks-example-koreacentral-01/providers/Microsoft.Insights/dataCollectionRuleAssociations?api-version=2023-03-11" \
| python3 -c "
import sys,json
data=json.load(sys.stdin)
@@ -363,7 +388,7 @@ for a in data.get('value',[]):
|---|---|---|
| `ContainerInsightsExtension` | `MSCI-koreacentral-...` | N/A |
| `ContainerInsightsMetricsExtension` | `MSProm-koreacentral-...` | N/A |
-| **`configurationAccessEndpoint`** | N/A | **`MSProm-koreacentral-aks-rubicon-koreacentral`** ✅ |
+| **`configurationAccessEndpoint`** | N/A | **`MSProm-koreacentral-aks-example-koreacentral`** ✅ |
---
@@ -495,13 +520,13 @@ DNS를 PRD 환경에서 중앙 관리하기 위해 별도의 PRD VNet을 생성
| 리소스 | 이름 | 설정 |
|---|---|---|
-| Resource Group | `rg-rubicon-koreacentral-prd-01` | Korea Central |
-| VNet | `vnet-rubicon-koreacentral-prd-01` | `10.100.0.0/16` |
+| Resource Group | `rg-example-koreacentral-prd-01` | Korea Central |
+| VNet | `vnet-example-koreacentral-prd-01` | `10.100.0.0/16` |
| Subnet (Firewall) | `AzureFirewallSubnet` | `10.100.0.0/26` |
| Subnet (Default) | `default` | `10.100.1.0/24` |
-| Azure Firewall | `fw-rubicon-koreacentral-prd-01` | Standard SKU, DNS Proxy 활성화 |
+| Azure Firewall | `fw-example-koreacentral-prd-01` | Standard SKU, DNS Proxy 활성화 |
| Firewall Private IP | `10.100.0.4` | DNS Proxy 엔드포인트 |
-| Public IP | `pip-fw-rubicon-koreacentral-prd-01` | Standard SKU |
+| Public IP | `pip-fw-example-koreacentral-prd-01` | Standard SKU |
### 6.3 네트워크 구성
@@ -527,8 +552,8 @@ Custom DNS Server: 10.100.0.4 (Firewall DNS Proxy)
```mermaid
flowchart TB
- VM["VM / AKS Pod (vnet-rubicon-koreacentral-01)"] -->|"DNS Query"| RESOLVER["systemd-resolved 127.0.0.53"]
- RESOLVER -->|"Forward to Custom DNS: 10.100.0.4"| FW["Azure Firewall DNS Proxy (vnet-rubicon-koreacentral-prd-01)"]
+ VM["VM / AKS Pod (vnet-example-koreacentral-01)"] -->|"DNS Query"| RESOLVER["systemd-resolved 127.0.0.53"]
+ RESOLVER -->|"Forward to Custom DNS: 10.100.0.4"| FW["Azure Firewall DNS Proxy (vnet-example-koreacentral-prd-01)"]
FW -->|"Forward"| AZURE_DNS["Azure DNS 168.63.129.16"]
AZURE_DNS -->|"Private DNS Zone (PRD VNet에 링크됨)"| PRIVATE_IP["Private IP 반환 10.2.0.x / 10.1.0.4"]
@@ -539,7 +564,7 @@ flowchart TB
### 6.5 Private DNS Zone VNet 링크 이전
-기존 VNet(`vnet-rubicon-koreacentral-01`)에 연결되어 있던 모든 Private DNS Zone 링크를 PRD VNet으로 이전.
+기존 VNet(`vnet-example-koreacentral-01`)에 연결되어 있던 모든 Private DNS Zone 링크를 PRD VNet으로 이전.
**이전 대상:**
- AMPLS 관련 5개 Zone (`privatelink.monitor.azure.com` 등)
@@ -553,7 +578,7 @@ az network private-dns link vnet create \
--name "link-to-prd-vnet" \
--zone-name "" \
--resource-group "" \
- --virtual-network "/subscriptions/.../vnet-rubicon-koreacentral-prd-01" \
+ --virtual-network "/subscriptions/.../vnet-example-koreacentral-prd-01" \
--registration-enabled false
# 기존 VNet 링크 제거
@@ -567,7 +592,7 @@ az network private-dns link vnet delete \
### 6.6 AMPLS/DCE 영향
Firewall DNS Proxy 구성 후에도 AMPLS/DCE는 영향 없음:
-- Private Endpoint(`pe-ampls-rubicon-krc-01`)는 기존 VNet의 `pe-subnet`에 그대로 위치
+- Private Endpoint(`pe-ampls-example-krc-01`)는 기존 VNet의 `pe-subnet`에 그대로 위치
- DNS 해석 경로만 변경: VM → Firewall(10.100.0.4) → Azure DNS → Private DNS Zone(PRD VNet 링크) → Private IP(10.2.0.x)
- 데이터 경로(ama-metrics → PE → Azure Monitor)는 변경 없음
diff --git a/monitor/sre-agent-event-lab/assets/official/agent-reasoning-flow.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/agent-reasoning-flow.svg
similarity index 97%
rename from monitor/sre-agent-event-lab/assets/official/agent-reasoning-flow.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/agent-reasoning-flow.svg
index 4de43d3e..2b0b0b00 100644
--- a/monitor/sre-agent-event-lab/assets/official/agent-reasoning-flow.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/agent-reasoning-flow.svg
@@ -1,75 +1,75 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/official/azure-sre-agent-networking-vnet.png b/docs/guides/azure-monitor/azure-sre-agent-overview/images/azure-sre-agent-networking-vnet.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/official/azure-sre-agent-networking-vnet.png
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/azure-sre-agent-networking-vnet.png
diff --git a/monitor/sre-agent-event-lab/assets/official/custom-skill-flow.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/custom-skill-flow.svg
similarity index 96%
rename from monitor/sre-agent-event-lab/assets/official/custom-skill-flow.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/custom-skill-flow.svg
index e0cd0dd6..136ef56d 100644
--- a/monitor/sre-agent-event-lab/assets/official/custom-skill-flow.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/custom-skill-flow.svg
@@ -1,44 +1,44 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/official/diagnose-azure-services.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/diagnose-azure-services.svg
similarity index 98%
rename from monitor/sre-agent-event-lab/assets/official/diagnose-azure-services.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/diagnose-azure-services.svg
index e5b51c5b..31cad4ac 100644
--- a/monitor/sre-agent-event-lab/assets/official/diagnose-azure-services.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/diagnose-azure-services.svg
@@ -1,82 +1,82 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/notifications/github-issue.png b/docs/guides/azure-monitor/azure-sre-agent-overview/images/github-issue.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/notifications/github-issue.png
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/github-issue.png
diff --git a/monitor/sre-agent-event-lab/assets/official/incident-platform-flow.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/incident-platform-flow.svg
similarity index 97%
rename from monitor/sre-agent-event-lab/assets/official/incident-platform-flow.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/incident-platform-flow.svg
index 022541a4..d2960e1f 100644
--- a/monitor/sre-agent-event-lab/assets/official/incident-platform-flow.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/incident-platform-flow.svg
@@ -1,59 +1,59 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/official/incident-response-flow.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/incident-response-flow.svg
similarity index 97%
rename from monitor/sre-agent-event-lab/assets/official/incident-response-flow.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/incident-response-flow.svg
index b6102ccc..9d75e04f 100644
--- a/monitor/sre-agent-event-lab/assets/official/incident-response-flow.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/incident-response-flow.svg
@@ -1,80 +1,80 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/official/knowledge-sources.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/knowledge-sources.svg
similarity index 98%
rename from monitor/sre-agent-event-lab/assets/official/knowledge-sources.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/knowledge-sources.svg
index a9d35f47..ef2bb279 100644
--- a/monitor/sre-agent-event-lab/assets/official/knowledge-sources.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/knowledge-sources.svg
@@ -1,48 +1,48 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/official/managed-connectors-icon-grid.png b/docs/guides/azure-monitor/azure-sre-agent-overview/images/managed-connectors-icon-grid.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/official/managed-connectors-icon-grid.png
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/managed-connectors-icon-grid.png
diff --git a/monitor/sre-agent-event-lab/assets/official/memory-auto-learning.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/memory-auto-learning.svg
similarity index 97%
rename from monitor/sre-agent-event-lab/assets/official/memory-auto-learning.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/memory-auto-learning.svg
index 39980ddb..c8e1821f 100644
--- a/monitor/sre-agent-event-lab/assets/official/memory-auto-learning.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/memory-auto-learning.svg
@@ -1,54 +1,54 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/official/memory-unified-search.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/memory-unified-search.svg
similarity index 98%
rename from monitor/sre-agent-event-lab/assets/official/memory-unified-search.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/memory-unified-search.svg
index ec9d4c2f..c370461b 100644
--- a/monitor/sre-agent-event-lab/assets/official/memory-unified-search.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/memory-unified-search.svg
@@ -1,72 +1,72 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/official/notification-paths.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/notification-paths.svg
similarity index 98%
rename from monitor/sre-agent-event-lab/assets/official/notification-paths.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/notification-paths.svg
index 188c09bc..45a7ed07 100644
--- a/monitor/sre-agent-event-lab/assets/official/notification-paths.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/notification-paths.svg
@@ -1,68 +1,68 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/official/operations-hub-overview-tab.png b/docs/guides/azure-monitor/azure-sre-agent-overview/images/operations-hub-overview-tab.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/official/operations-hub-overview-tab.png
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/operations-hub-overview-tab.png
diff --git a/monitor/sre-agent-event-lab/assets/official/permission-flow.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/permission-flow.svg
similarity index 98%
rename from monitor/sre-agent-event-lab/assets/official/permission-flow.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/permission-flow.svg
index f030d35a..f3ef5db3 100644
--- a/monitor/sre-agent-event-lab/assets/official/permission-flow.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/permission-flow.svg
@@ -1,61 +1,61 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/official/portal-sub-agent-canvas-full.png b/docs/guides/azure-monitor/azure-sre-agent-overview/images/portal-sub-agent-canvas-full.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/official/portal-sub-agent-canvas-full.png
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/portal-sub-agent-canvas-full.png
diff --git a/monitor/sre-agent-event-lab/assets/official/root-cause-analysis.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/root-cause-analysis.svg
similarity index 97%
rename from monitor/sre-agent-event-lab/assets/official/root-cause-analysis.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/root-cause-analysis.svg
index f1975f41..fe24fa57 100644
--- a/monitor/sre-agent-event-lab/assets/official/root-cause-analysis.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/root-cause-analysis.svg
@@ -1,71 +1,71 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/official/run-modes-comparison.svg b/docs/guides/azure-monitor/azure-sre-agent-overview/images/run-modes-comparison.svg
similarity index 97%
rename from monitor/sre-agent-event-lab/assets/official/run-modes-comparison.svg
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/run-modes-comparison.svg
index 98f89736..680042a8 100644
--- a/monitor/sre-agent-event-lab/assets/official/run-modes-comparison.svg
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/images/run-modes-comparison.svg
@@ -1,57 +1,57 @@
-
+
diff --git a/monitor/sre-agent-event-lab/assets/briefing/s1-agent-conclusion.png b/docs/guides/azure-monitor/azure-sre-agent-overview/images/s1-agent-conclusion.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/briefing/s1-agent-conclusion.png
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/s1-agent-conclusion.png
diff --git a/monitor/sre-agent-event-lab/assets/notifications/s1-email-preview.png b/docs/guides/azure-monitor/azure-sre-agent-overview/images/s1-email-preview.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/notifications/s1-email-preview.png
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/s1-email-preview.png
diff --git a/monitor/sre-agent-event-lab/assets/briefing/s1-three-panel.png b/docs/guides/azure-monitor/azure-sre-agent-overview/images/s1-three-panel.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/briefing/s1-three-panel.png
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/s1-three-panel.png
diff --git a/monitor/sre-agent-event-lab/assets/briefing/sre-agent-process.png b/docs/guides/azure-monitor/azure-sre-agent-overview/images/sre-agent-process.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/briefing/sre-agent-process.png
rename to docs/guides/azure-monitor/azure-sre-agent-overview/images/sre-agent-process.png
diff --git a/monitor/azure-sre-agent.md b/docs/guides/azure-monitor/azure-sre-agent-overview/index.md
similarity index 93%
rename from monitor/azure-sre-agent.md
rename to docs/guides/azure-monitor/azure-sre-agent-overview/index.md
index 2d9b6036..3dba48fa 100644
--- a/monitor/azure-sre-agent.md
+++ b/docs/guides/azure-monitor/azure-sre-agent-overview/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Azure SRE Agent 개요
+description: Azure SRE Agent의 기능, 구성 요소와 운영 흐름을 설명합니다.
+technologies:
+- rest-api
+tags:
+- ai-agents
+- monitoring
+- troubleshooting
+---
+
# Azure SRE Agent 소개
Azure SRE Agent는 Azure 운영 환경에서 발생한 인시던트를 자동으로 조사하고, 관련 근거를 바탕으로 근본 원인과 조치 방안을 제안하는 AI 기반 운영 도우미입니다.
@@ -20,7 +44,7 @@ Azure SRE Agent는 단순히 오류 로그를 나열하지 않습니다. 어떤
## 인시던트가 발생하면 어떻게 조사하나요?
-
+
> 출처: [인시던트 대응 자동화](https://learn.microsoft.com/azure/sre-agent/incident-response)
@@ -56,7 +80,7 @@ Azure SRE Agent는 다음 순서로 인시던트를 조사합니다.
## 근본 원인은 어떻게 찾나요?
-
+
> 출처: [근본 원인 분석](https://learn.microsoft.com/azure/sre-agent/root-cause-analysis)
@@ -73,7 +97,7 @@ Azure SRE Agent는 관리 ID와 Azure RBAC 권한을 사용해 Azure 리소스
| 소스와 문서 | GitHub, Azure DevOps, 운영 절차서, 기술 문서 |
| 과거 경험 | 유사한 인시던트, 이전의 근본 원인과 해결 방법 |
-
+
> 출처: [Azure 관찰 가능성으로 진단하기](https://learn.microsoft.com/azure/sre-agent/diagnose-azure-observability)
@@ -81,17 +105,17 @@ Azure 내부 원격 분석 데이터는 기본 도구만으로도 조회할 수
## 과거 경험과 운영 문서는 어떻게 활용하나요?
-
+
> 출처: [메모리와 지식 관리](https://learn.microsoft.com/azure/sre-agent/memory)
-
+
> 출처: [메모리와 지식 관리](https://learn.microsoft.com/azure/sre-agent/memory)
## 조사가 끝난 뒤 무엇을 학습하나요?
-
+
> 출처: [메모리와 지식 관리](https://learn.microsoft.com/azure/sre-agent/memory)
@@ -111,7 +135,7 @@ Azure 내부 원격 분석 데이터는 기본 도구만으로도 조회할 수
관리형 커넥터로 연결할 수 있는 대표적인 서비스는 다음과 같습니다.
-
+
> 출처: [관리형 커넥터(미리 보기)](https://learn.microsoft.com/azure/sre-agent/managed-connectors)
@@ -121,7 +145,7 @@ Azure 내부 원격 분석 데이터는 기본 도구만으로도 조회할 수
- Microsoft Teams 채널
- Slack 채널
-
+
> 출처: [조치 실행하기](https://learn.microsoft.com/azure/sre-agent/execute-mitigations)
@@ -138,7 +162,7 @@ Azure 내부 원격 분석 데이터는 기본 도구만으로도 조회할 수
## 권한과 승인 절차는 어떻게 제어하나요?
-
+
> 출처: [에이전트 추론과 실행](https://learn.microsoft.com/azure/sre-agent/agent-reasoning)
@@ -154,7 +178,7 @@ Azure SRE Agent는 실행 수준에 따라 권한을 제어합니다.
공식 기능인 검토 모드(Review)와 자율 모드(Autonomous)의 차이는 다음 그림에서도 확인할 수 있습니다.
-
+
> 출처: [실행 모드](https://learn.microsoft.com/azure/sre-agent/run-modes)
@@ -170,13 +194,13 @@ Azure SRE Agent는 실행 수준에 따라 권한을 제어합니다.
관리 ID 권한이 부족할 때 담당자 승인으로 넘어가는 세부 과정은 다음 그림과 같습니다.
-
+
> 출처: [권한](https://learn.microsoft.com/azure/sre-agent/permissions)
## 팀에 맞게 어떻게 확장하나요?
-
+
> 출처: [스킬](https://learn.microsoft.com/azure/sre-agent/skills)
@@ -191,7 +215,7 @@ Azure SRE Agent는 실행 수준에 따라 권한을 제어합니다.
사용자 지정 에이전트는 각자 도구와 커넥터, 사용할 스킬을 따로 지정합니다. 조사 과정에서 다른 전문 에이전트로 작업을 넘기도록 구성할 수도 있어, 인시던트 분류와 상세 조사, 결과 전달을 단계별로 나눌 수 있습니다.
-
+
> 출처: [사용자 지정 에이전트](https://learn.microsoft.com/azure/sre-agent/sub-agents)
@@ -208,7 +232,7 @@ Azure SRE Agent는 실행 수준에 따라 권한을 제어합니다.
인시던트 플랫폼을 처음 연결하면 빠른 시작 대응 계획이 자동으로 만들어집니다. 사용자 정의 대응 계획을 만든 뒤에는 이 계획을 삭제해야 인시던트가 잘못 전달되거나 두 번 처리되지 않습니다.
-
+
> 출처: [인시던트 플랫폼](https://learn.microsoft.com/azure/sre-agent/incident-platforms)
@@ -236,9 +260,9 @@ Azure SRE Agent는 다음 기능을 제품에서 기본으로 지원합니다.
## 이번 실증에서 사용한 방식
-
+
-[편집 가능한 SVG 보기](sre-agent-event-lab/assets/briefing/sre-agent-process.svg)
+[편집 가능한 SVG 보기](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/briefing/sre-agent-process.svg)
이번 실증에서는 대응 계획을 공개 API로 자동 구성하는 데 제약이 있어 Azure SRE Agent의 HTTP Trigger를 사용했습니다.
@@ -275,9 +299,9 @@ Azure Monitor 경고
배포 설정 오류로 주문 API가 HTTP 500을 반환하는 상황을 만들고, Azure SRE Agent가 어떤 근거를 확인하는지 검증했습니다.
-
+
-[편집 가능한 SVG 보기](sre-agent-event-lab/assets/briefing/s1-three-panel.svg)
+[편집 가능한 SVG 보기](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/briefing/s1-three-panel.svg)
### 상황
@@ -297,7 +321,7 @@ Azure Monitor 경고
### 실제 확인 결과
-
+
- Azure Monitor 경고가 발생한 뒤 2초 안에 조사 대화가 생성됐습니다.
- Application Insights에서 실패한 요청 120건을 확인했습니다.
@@ -309,10 +333,10 @@ Azure Monitor 경고
Azure SRE Agent가 정리한 근본 원인과 조치 방안을 작업 항목으로 전달할 수 있습니다. 이번 실증에서는 같은 조사 결과로 실제 GitHub Issue를 만들었습니다.
-
+
- [GitHub Issue #43 열기](https://github.com/hellices/devguidesample/issues/43)
-- [Issue 본문 보기](sre-agent-event-lab/assets/notifications/s1-github-issue.md)
+- [Issue 본문 보기](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/notifications/s1-github-issue.md)
Issue에는 다음 내용을 포함했습니다.
@@ -330,10 +354,10 @@ Issue에는 다음 내용을 포함했습니다.
이번 실증에서는 외부 수신자에게 메일을 보내지 않았습니다. 대신 Azure SRE Agent의 조사 결과로 Outlook에서 열 수 있는 메일 초안과 화면 미리보기를 만들었습니다.
-
+
-- [HTML 메일 보기](sre-agent-event-lab/assets/notifications/s1-incident-summary.html)
-- [RFC 5322 메일 파일 보기](sre-agent-event-lab/assets/notifications/s1-incident-summary.eml)
+- [HTML 메일 보기](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/notifications/s1-incident-summary.html)
+- [RFC 5322 메일 파일 보기](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/notifications/s1-incident-summary.eml)
실제 운영에서는 Outlook 커넥터의 메일 보내기 작업을 사용할 수 있습니다.
@@ -352,7 +376,7 @@ Issue에는 다음 내용을 포함했습니다.
| 주문 API 지연 | 성공한 요청의 응답 시간, 외부 종속성, 지연 설정 | `ORDER_DELAY_MS=4000`을 확인했습니다. |
| Blob 권한 오류 | 역할 삭제 이력, Blob 403, API 503 | 역할 삭제를 근본 원인으로 확인했습니다. 복구 확인 대상은 한 차례 잘못 선택해 한계로 기록했습니다. |
-상세 수치, 시간 순서, 평가 기준은 [실제 동작 검증 결과](sre-agent-event-lab/validation-results.md)에서 확인할 수 있습니다.
+상세 수치, 시간 순서, 평가 기준은 [실제 동작 검증 결과](../../../research/azure-monitor/sre-agent-validation-results/index.md)에서 확인할 수 있습니다.
## Dynamic Thresholds와 함께 사용할 수 있나요?
@@ -365,7 +389,7 @@ Issue에는 다음 내용을 포함했습니다.
처음에는 기존 고정 임계값을 유지하고, Dynamic Thresholds를 별도의 관찰용 경고로 추가하는 방식을 권장합니다. 충분한 학습 기간을 거친 뒤 오탐과 누락을 비교해 실제 대응 흐름에 연결합니다.
-자세한 내용은 [Dynamic Thresholds 연계 가이드](sre-agent-event-lab/dynamic-thresholds.md)를 참고하세요.
+자세한 내용은 [Dynamic Thresholds 연계 가이드](../sre-agent-dynamic-thresholds/index.md)를 참고하세요.
## 도입 전에 확인해야 할 사전 조건
@@ -414,7 +438,7 @@ Log Analytics 작업 영역이나 AKS를 비공개 네트워크로만 노출한
## 비공개 네트워크에는 어떻게 연결하나요?
-
+
> 출처: [네트워크 통합](https://learn.microsoft.com/azure/sre-agent/network-integration)
@@ -558,7 +582,7 @@ Agent Hooks를 사용하면 에이전트가 결과를 반환하기 직전이나
이 지표는 왼쪽 사이드바의 Operations Hub 개요 탭에서 한 화면으로 확인할 수 있습니다.
-
+
> 출처: [Operations Hub](https://learn.microsoft.com/azure/sre-agent/operations-hub)
@@ -647,5 +671,5 @@ Agent Hooks를 사용하면 에이전트가 결과를 반환하기 직전이나
### 실증 자료
-- [실제 동작 검증 결과](sre-agent-event-lab/validation-results.md)
-- [실험 환경과 재현 방법](sre-agent-event-lab/README.md)
+- [실제 동작 검증 결과](../../../research/azure-monitor/sre-agent-validation-results/index.md)
+- [실험 환경과 재현 방법](../../../labs/azure-monitor/sre-agent-event-lab/index.md)
diff --git a/monitor/assets/images/kafka-exporter-adv.png b/docs/guides/azure-monitor/hdinsight-kafka-prometheus-grafana/images/kafka-exporter-adv.png
similarity index 100%
rename from monitor/assets/images/kafka-exporter-adv.png
rename to docs/guides/azure-monitor/hdinsight-kafka-prometheus-grafana/images/kafka-exporter-adv.png
diff --git a/monitor/assets/images/kafka-exporter-overview.png b/docs/guides/azure-monitor/hdinsight-kafka-prometheus-grafana/images/kafka-exporter-overview.png
similarity index 100%
rename from monitor/assets/images/kafka-exporter-overview.png
rename to docs/guides/azure-monitor/hdinsight-kafka-prometheus-grafana/images/kafka-exporter-overview.png
diff --git a/monitor/assets/images/kafka-jmx-broker.png b/docs/guides/azure-monitor/hdinsight-kafka-prometheus-grafana/images/kafka-jmx-broker.png
similarity index 100%
rename from monitor/assets/images/kafka-jmx-broker.png
rename to docs/guides/azure-monitor/hdinsight-kafka-prometheus-grafana/images/kafka-jmx-broker.png
diff --git a/monitor/hdinsight-kafka-prometheus-grafana.md b/docs/guides/azure-monitor/hdinsight-kafka-prometheus-grafana/index.md
similarity index 76%
rename from monitor/hdinsight-kafka-prometheus-grafana.md
rename to docs/guides/azure-monitor/hdinsight-kafka-prometheus-grafana/index.md
index 092296f1..980ff8e9 100644
--- a/monitor/hdinsight-kafka-prometheus-grafana.md
+++ b/docs/guides/azure-monitor/hdinsight-kafka-prometheus-grafana/index.md
@@ -1,13 +1,39 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: HDInsight Kafka Prometheus와 Grafana 구성
+description: JMX Exporter, Kafka Exporter, Prometheus와 Grafana 대시보드를 구성합니다.
+technologies:
+- kafka
+- prometheus
+- grafana
+tags:
+- monitoring
+- observability
+- deployment
+---
+
# HDInsight Kafka JMX Exporter / Kafka Exporter 설치 및 Grafana 대시보드 구성
**전제: HDInsight Kafka 클러스터 + Prometheus + Grafana 기구성.**
-도구별 커버 범위·선택 근거("Why") → [hdinsight-kafka-monitoring.md](./hdinsight-kafka-monitoring.md).
+도구별 커버 범위·선택 근거("Why") → [HDInsight Kafka 모니터링 방식 비교](../../../research/azure-monitor/hdinsight-kafka-monitoring-options/index.md).
-> **문서 성격**: JMX Exporter·Kafka Exporter의 정식 사용법은 각 오픈소스 공식 문서([9절 출처](#9-출처)) 기준.
+> **문서 성격**: JMX Exporter·Kafka Exporter의 정식 사용법은 각 오픈소스 공식 문서([9절 출처](#9)) 기준.
> 이 문서는 그 위에서 **HDInsight 환경(원격 JMX 9999, Private Link 등)에 맞춰 실전 구성한 요약본**.
> 아래 Grafana 대시보드도 커뮤니티 대시보드(7589) 외에는 **본 환경 지표에 맞춰 개별 구성**한 것 → 참고용, 환경별 조정 필요.
-참조 설정·대시보드 파일: [`assets/prometheus-grafana/`](./assets/prometheus-grafana/)
+참조 설정·대시보드 파일: [`assets/prometheus-grafana/`](https://github.com/hellices/devguidesample/tree/main/samples/azure-monitor/source-material/assets/prometheus-grafana)
```
assets/prometheus-grafana/
@@ -38,7 +64,7 @@ assets/prometheus-grafana/
> **원격 JMX 채택 이유**
> jmx_exporter 정석 = 브로커 JVM에 javaagent 부착 → 브로커 롤링 재시작 필요.
> HDInsight 브로커는 9999 포트 원격 JMX 개방 → 외부 호스트 `jmx_prometheus_httpserver` 접속으로
-> 브로커 무변경·동일 `kafka_server_*`/JVM 지표 수집. (javaagent 방식은 [7절](#7-참고-공식-javaagent-방식) 참고)
+> 브로커 무변경·동일 `kafka_server_*`/JVM 지표 수집. (javaagent 방식은 [7절](#7-javaagent) 참고)
---
@@ -96,9 +122,9 @@ for i in 0 1 2; do
done
```
-- 변환 룰: [`jmx/kafka-rules.yml`](./assets/prometheus-grafana/jmx/kafka-rules.yml)
+- 변환 룰: [`jmx/kafka-rules.yml`](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/assets/prometheus-grafana/jmx/kafka-rules.yml)
(처리량 BytesIn/Out·MessagesIn, ReplicaManager URP/ISR, Controller, RequestMetrics 지연, JVM Heap/GC/Thread 등 16개)
-- `hostPort`만 브로커별 상이, 룰 내용 동일. 예시: [`jmx/b0.yml.example`](./assets/prometheus-grafana/jmx/b0.yml.example)
+- `hostPort`만 브로커별 상이, 룰 내용 동일. 예시: [`jmx/b0.yml.example`](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/assets/prometheus-grafana/jmx/b0.yml.example)
### 3.2 Kafka Exporter (Consumer Lag)
@@ -119,7 +145,7 @@ kafka-exporter:
### 3.3 일괄 기동 (docker-compose)
-두 Exporter + Prometheus + Grafana 일괄 기동: [`docker-compose.yml`](./assets/prometheus-grafana/docker-compose.yml).
+두 Exporter + Prometheus + Grafana 일괄 기동: [`docker-compose.yml`](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/assets/prometheus-grafana/docker-compose.yml).
``, `` 실제 값 치환 후:
```bash
@@ -130,7 +156,7 @@ docker compose ps # kafka-exporter, jmx-b0/b1/b2, prometheus, grafana = U
### 3.4 Prometheus 스크래핑
-[`prometheus.yml`](./assets/prometheus-grafana/prometheus.yml): `kafka-exporter:9308` +
+[`prometheus.yml`](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/assets/prometheus-grafana/prometheus.yml): `kafka-exporter:9308` +
`jmx-b0/b1/b2:9404` 스크래핑. JMX 잡에 `broker` 라벨 부여 → 브로커 구분.
**기존 Prometheus 존재 시** 이 `scrape_configs` 두 블록만 추가 후 reload.
@@ -142,8 +168,8 @@ docker compose ps # kafka-exporter, jmx-b0/b1/b2, prometheus, grafana = U
docker-compose가 Grafana에 자동 주입:
-- 데이터소스: [`grafana/provisioning/datasources/prometheus.yml`](./assets/prometheus-grafana/grafana/provisioning/datasources/prometheus.yml) (uid `prometheus`)
-- 대시보드 폴더: [`grafana/provisioning/dashboards/provider.yml`](./assets/prometheus-grafana/grafana/provisioning/dashboards/provider.yml) → `Kafka` 폴더
+- 데이터소스: [`grafana/provisioning/datasources/prometheus.yml`](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/assets/prometheus-grafana/grafana/provisioning/datasources/prometheus.yml) (uid `prometheus`)
+- 대시보드 폴더: [`grafana/provisioning/dashboards/provider.yml`](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/assets/prometheus-grafana/grafana/provisioning/dashboards/provider.yml) → `Kafka` 폴더
- `grafana/dashboards/*.json` 자동 로드
**기존 Grafana 존재 시** 아래 대시보드 Dashboards → Import + 데이터소스 지정.
@@ -153,8 +179,8 @@ docker-compose가 Grafana에 자동 주입:
| 대시보드 | 출처 | 지표 |
|----------|------|---------|
| **Kafka Exporter Overview** | Grafana.com **7589** (공식 커뮤니티) | 메시지 생산율, Consumer Group Lag, 토픽 파티션 수 |
-| **HDInsight Kafka - Exporter 상세** | 커스텀 ([kafka-exporter-adv.json](./assets/prometheus-grafana/grafana/dashboards/kafka-exporter-adv.json)) | 컨슈머 그룹 **멤버 수(0=컨슈머 다운)**, Lag 상위 파티션, 언더리플리케이션·ISR·브로커별 리더 분포, 토픽별 보관 메시지 수 |
-| **HDInsight Kafka - Broker (JMX Exporter)** | 커스텀 ([kafka-jmx-broker.json](./assets/prometheus-grafana/grafana/dashboards/kafka-jmx-broker.json)) | 브로커별 처리량(BytesIn/Out·MessagesIn), URP, ActiveController, 요청 지연, JVM Heap·스레드 |
+| **HDInsight Kafka - Exporter 상세** | 커스텀 ([kafka-exporter-adv.json](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/assets/prometheus-grafana/grafana/dashboards/kafka-exporter-adv.json)) | 컨슈머 그룹 **멤버 수(0=컨슈머 다운)**, Lag 상위 파티션, 언더리플리케이션·ISR·브로커별 리더 분포, 토픽별 보관 메시지 수 |
+| **HDInsight Kafka - Broker (JMX Exporter)** | 커스텀 ([kafka-jmx-broker.json](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/assets/prometheus-grafana/grafana/dashboards/kafka-jmx-broker.json)) | 브로커별 처리량(BytesIn/Out·MessagesIn), URP, ActiveController, 요청 지연, JVM Heap·스레드 |
**Kafka Exporter Overview(7589)** = 커뮤니티 대시보드 → 파일 아닌 ID로 import.
Grafana UI → Dashboards → **Import** → ID `7589` → 데이터소스 `Prometheus`.
@@ -178,23 +204,23 @@ Prometheus(`:9090`) 쿼리로 확인.
## 6. 대시보드 화면
-> 이미지는 [`assets/images/`](./assets/images/) 에 아래 파일명으로 저장 시 자동 표시.
+> 렌더링 이미지는 이 문서 번들의 `images/` 디렉터리에 아래 파일명으로 두면 자동 표시됩니다. 원본 자료는 [`samples/azure-monitor/source-material/assets/images/`](https://github.com/hellices/devguidesample/tree/main/samples/azure-monitor/source-material/assets/images)에서 확인할 수 있습니다.
### 6.1 Kafka Exporter Overview (7589)
-
+
메시지 생산율 / Consumer Group Lag / 토픽별 파티션 수.
### 6.2 HDInsight Kafka - Exporter 상세
-
+
클러스터 개요(브로커/토픽/파티션/그룹 수, URP, 총 Lag) · 컨슈머 상태(그룹별 Lag, 생산 vs 소비율, 멤버 수, Lag 상위 파티션) · 복제·리더십(URP·ISR·브로커별 리더 분포) · 토픽 상세.
### 6.3 HDInsight Kafka - Broker (JMX Exporter)
-
+
브로커별 처리량 · URP · ActiveController · 요청 지연 · JVM Heap/스레드.
diff --git a/monitor/sre-agent-event-lab/dynamic-thresholds.md b/docs/guides/azure-monitor/sre-agent-dynamic-thresholds/index.md
similarity index 88%
rename from monitor/sre-agent-event-lab/dynamic-thresholds.md
rename to docs/guides/azure-monitor/sre-agent-dynamic-thresholds/index.md
index 68fd1144..ca7de8fe 100644
--- a/monitor/sre-agent-event-lab/dynamic-thresholds.md
+++ b/docs/guides/azure-monitor/sre-agent-dynamic-thresholds/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Dynamic Thresholds와 SRE Agent 연계
+description: Azure Monitor Dynamic Thresholds 경고를 SRE Agent 조사 흐름과 연계합니다.
+technologies:
+- rest-api
+tags:
+- monitoring
+- ai-agents
+- architecture
+---
+
# Azure Monitor Dynamic Thresholds와 SRE Agent 연계 설계
- 대상: Azure Monitor 정적 임계값을 사용하는 Azure SRE Agent 이벤트 연계 환경
@@ -56,7 +80,7 @@ query는 `summarize` 결과가 하나 이상의 numeric series를 반환해야
- `ignoreDataBefore`: 정상 telemetry가 안정적으로 쌓이기 시작한 UTC
- Action Group: 기존 `ag-sre-agent-event-lab`
- Event path(기본): Dynamic alert → Azure Monitor incident platform 연결 → Review 모드 response plan → investigation. 현재 실습이 배포하는 표준 경로이며 Dynamic rule도 같은 경로를 그대로 쓴다.
-- Event path(레거시 bridge): Dynamic alert → Action Group → Logic App managed identity → SRE HTTP Trigger → Review-mode investigation. 2026-08-12 실측에 쓰인 legacy 구성이고 기본 실습에는 배포하지 않는다([validation-results.md](validation-results.md)).
+- Event path(레거시 bridge): Dynamic alert → Action Group → Logic App managed identity → SRE HTTP Trigger → Review-mode investigation. 2026-08-12 실측에 쓰인 legacy 구성이고 기본 실습에는 배포하지 않는다([실측 검증 결과](../../../research/azure-monitor/sre-agent-validation-results/index.md)).
이는 시작점이지 모든 workload의 정답이 아니다. Preview Chart와 incident 결과를 보고 sensitivity와 failing periods를 조정한다.
diff --git a/monitor/sre-agent-event-lab/runbooks/incident-response.md b/docs/guides/azure-monitor/sre-agent-incident-runbook/index.md
similarity index 90%
rename from monitor/sre-agent-event-lab/runbooks/incident-response.md
rename to docs/guides/azure-monitor/sre-agent-incident-runbook/index.md
index 17b36e96..02973aa1 100644
--- a/monitor/sre-agent-event-lab/runbooks/incident-response.md
+++ b/docs/guides/azure-monitor/sre-agent-incident-runbook/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Azure SRE Agent Incident Runbook
+description: Azure SRE Agent 이벤트 실습의 장애 대응 runbook을 제공합니다.
+technologies:
+- rest-api
+tags:
+- troubleshooting
+- monitoring
+- reliability
+---
+
# Azure SRE Agent Event Lab Incident Runbook
## Scope and safety
diff --git a/ptu_lb/ptu_architecture.png b/docs/guides/azure-openai/adaptive-ptu-load-balancing/images/ptu_architecture.png
similarity index 100%
rename from ptu_lb/ptu_architecture.png
rename to docs/guides/azure-openai/adaptive-ptu-load-balancing/images/ptu_architecture.png
diff --git a/ptu_lb/ptu-lb-test.md b/docs/guides/azure-openai/adaptive-ptu-load-balancing/index.md
similarity index 92%
rename from ptu_lb/ptu-lb-test.md
rename to docs/guides/azure-openai/adaptive-ptu-load-balancing/index.md
index 7d235bd0..5f4fb792 100644
--- a/ptu_lb/ptu-lb-test.md
+++ b/docs/guides/azure-openai/adaptive-ptu-load-balancing/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-openai
+official_sources:
+- title: Azure OpenAI documentation
+ url: https://learn.microsoft.com/azure/ai-services/openai/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Adaptive PTU TPM Quota 조정
+description: Azure OpenAI PTU 배포 사이에서 TPM quota를 적응형으로 조정하는 방법을 설명합니다.
+technologies:
+- python
+- powershell
+tags:
+- performance
+- reliability
+- ai-agents
+---
+
# Adaptive PTU TPM Quota 조정 가이드 (with Sample Test)
## 문제 상황
@@ -28,7 +53,7 @@ Azure Automation은 **스케줄러 + 실행/인증 호스트** 역할이며, 실
- capacity 조정(빨강): 런북이 Reserved 총량 제약 하에 **감축→증설 순서**로 Foundry 배포 SKU capacity를 ARM(공용 경로)으로 갱신
-
+
## Azure 리소스 구성
@@ -265,13 +290,12 @@ $$
## 파일 구성
-- 메인 문서: [ptu-lb-test.md](ptu-lb-test.md)
-- 아키텍처 다이어그램(원본): [ptu_architecture.excalidraw](ptu_architecture.excalidraw)
-- 아키텍처 다이어그램(이미지): [ptu_architecture.png](ptu_architecture.png)
-- 다이어그램 렌더러(유틸): [render_excalidraw.py](render_excalidraw.py)
-- **Runbook(기본, Python): [runbooks/adaptive_tpm_quota_controller.py](runbooks/adaptive_tpm_quota_controller.py)**
-- Runbook 의존성: [runbooks/requirements.txt](runbooks/requirements.txt)
-- Runbook(선택, PowerShell 동등 이식본): [runbooks/optional_adaptive_tpm_quota_controller.ps1](runbooks/optional_adaptive_tpm_quota_controller.ps1)
+- 아키텍처 다이어그램(원본): [ptu_architecture.excalidraw](https://github.com/hellices/devguidesample/blob/main/samples/azure-openai/ptu-load-balancing/ptu_architecture.excalidraw)
+- 아키텍처 다이어그램(이미지): [ptu_architecture.png](https://github.com/hellices/devguidesample/blob/main/samples/azure-openai/ptu-load-balancing/ptu_architecture.png)
+- 다이어그램 렌더러(유틸): [render_excalidraw.py](https://github.com/hellices/devguidesample/blob/main/samples/azure-openai/ptu-load-balancing/render_excalidraw.py)
+- **Runbook(기본, Python): [runbooks/adaptive_tpm_quota_controller.py](https://github.com/hellices/devguidesample/blob/main/samples/azure-openai/ptu-load-balancing/runbooks/adaptive_tpm_quota_controller.py)**
+- Runbook 의존성: [runbooks/requirements.txt](https://github.com/hellices/devguidesample/blob/main/samples/azure-openai/ptu-load-balancing/runbooks/requirements.txt)
+- Runbook(선택, PowerShell 동등 이식본): [runbooks/optional_adaptive_tpm_quota_controller.ps1](https://github.com/hellices/devguidesample/blob/main/samples/azure-openai/ptu-load-balancing/runbooks/optional_adaptive_tpm_quota_controller.ps1)
> 기본 구현은 Python 런북이다. PowerShell 버전은 동일한 Reserved 총량 공유 재분배 로직(감축→증설, 실제 actuation·쿨다운 포함)을 Az 모듈(Az.Accounts / Az.CognitiveServices / AzTable)로 이식한 **선택적 대체 구현**으로, PowerShell 선호 환경을 위한 참조본이다. Storage가 Private Endpoint 구성이면 이 런북도 프라이빗 경로가 닿는 워커(예: Windows Hybrid Worker)에서 실행해야 한다.
diff --git a/azureblob/spring-resumable-upload/architecture.png b/docs/guides/azure-storage/mobile-resumable-upload-tus/images/architecture.png
similarity index 100%
rename from azureblob/spring-resumable-upload/architecture.png
rename to docs/guides/azure-storage/mobile-resumable-upload-tus/images/architecture.png
diff --git a/azureblob/mobile_resumable_upload_tus.md b/docs/guides/azure-storage/mobile-resumable-upload-tus/index.md
similarity index 95%
rename from azureblob/mobile_resumable_upload_tus.md
rename to docs/guides/azure-storage/mobile-resumable-upload-tus/index.md
index e08c6ceb..eb7d5216 100644
--- a/azureblob/mobile_resumable_upload_tus.md
+++ b/docs/guides/azure-storage/mobile-resumable-upload-tus/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-storage
+official_sources:
+- title: Azure Storage documentation
+ url: https://learn.microsoft.com/azure/storage/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Spring Boot tus와 Azure Block Blob 재개 업로드
+description: 모바일 대용량 파일을 tus 프로토콜과 Azure Block Blob으로 재개 업로드하는 구성을 설명합니다.
+technologies:
+- java
+- rest-api
+tags:
+- storage
+- reliability
+- development
+---
+
# Spring Boot Resumable Upload — tus.io ↔ Azure Block Blob
모바일 사용자 약 20만 명 규모, 일반 50 MB · 최대 200 MB 파일을 끊김 후 이어 올리되, 파드 OOM 없이 Azure Block Blob 으로 자연스럽게 흘러가게 만든 샘플.
@@ -22,11 +47,11 @@
## 아키텍처
-
+
-편집 원본: [spring-resumable-upload/architecture.excalidraw](spring-resumable-upload/architecture.excalidraw)
+편집 원본: [spring-resumable-upload/architecture.excalidraw](https://github.com/hellices/devguidesample/blob/main/samples/azure-storage/source-material/spring-resumable-upload/architecture.excalidraw)
-샘플 코드 위치: [spring-resumable-upload/](spring-resumable-upload/)
+샘플 코드 위치: [spring-resumable-upload/](https://github.com/hellices/devguidesample/tree/main/samples/azure-storage/source-material/spring-resumable-upload)
## 왜 tus 인가
diff --git a/aifoundry/codex_closednetwork.md b/docs/guides/microsoft-foundry/codex-closed-network/index.md
similarity index 85%
rename from aifoundry/codex_closednetwork.md
rename to docs/guides/microsoft-foundry/codex-closed-network/index.md
index 543b0e75..e777a8e2 100644
--- a/aifoundry/codex_closednetwork.md
+++ b/docs/guides/microsoft-foundry/codex-closed-network/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Codex와 Microsoft Foundry 폐쇄망 연동
+description: 폐쇄망에서 Codex와 Microsoft Foundry를 연동할 때 필요한 네트워크 구성을 설명합니다.
+technologies:
+- rest-api
+tags:
+- networking
+- security
+- ai-agents
+---
+
# Codex ↔ Azure AI Foundry 연동: 폐쇄망 환경 가이드
## **문제 상황**
@@ -37,12 +61,12 @@ Azure AI Foundry를 Private Endpoint로 구성한 경우, Azure 망과 업무망
Private Endpoint 도메인을 `localhost`로 매핑한다.
-> 예: Private Endpoint 도메인이 `aif-krc-openai.azure.com`인 경우
+> 예: Private Endpoint 도메인이 `example-openai.openai.azure.com`인 경우
**Windows hosts 파일 경로**: `C:\Windows\System32\drivers\etc\hosts`
```
-127.0.0.1 aif-krc-openai.azure.com
+127.0.0.1 example-openai.openai.azure.com
```
***
@@ -62,7 +86,7 @@ preferred_auth_method = "apikey"
[model_providers.custom-provider]
name = "azure-openai"
-base_url = "https://aif-krc-openai.azure.com/openai/v1/"
+base_url = "https://example-openai.openai.azure.com/openai/v1/"
env_key = "OPENAI_API_KEY"
wire_api = "responses"
@@ -110,12 +134,12 @@ http {
server {
listen 443;
- server_name aif-krc-openai.azure.com;
+ server_name example-openai.openai.azure.com;
location / {
proxy_pass http://127.0.0.1:50056;
- proxy_set_header Host aif-krc-openai.azure.com;
+ proxy_set_header Host example-openai.openai.azure.com;
proxy_set_header Proxy-Connection keep-alive;
}
diff --git a/aifoundry/foundry_local.md b/docs/guides/microsoft-foundry/foundry-local-air-gapped/index.md
similarity index 96%
rename from aifoundry/foundry_local.md
rename to docs/guides/microsoft-foundry/foundry-local-air-gapped/index.md
index 027829f9..2a090602 100644
--- a/aifoundry/foundry_local.md
+++ b/docs/guides/microsoft-foundry/foundry-local-air-gapped/index.md
@@ -1,3 +1,27 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Foundry Local 에어갭 구성과 제약
+description: Foundry Local SDK와 CLI의 제약 및 에어갭 환경 구성을 정리합니다.
+technologies:
+- azure-cli
+tags:
+- deployment
+- security
+- ai-agents
+---
+
# Foundry Local (On-device SDK/CLI): 제약 사항과 에어갭(Air-gapped) 구성 가이드
> 본 문서는 **Microsoft Foundry Local — 온디바이스 SDK/CLI** (`foundry-local-sdk`) 를 기준으로 한다.
diff --git a/memory/hybrid-architecture.png b/docs/guides/microsoft-foundry/gpt-memory-layer/images/hybrid-architecture.png
similarity index 100%
rename from memory/hybrid-architecture.png
rename to docs/guides/microsoft-foundry/gpt-memory-layer/images/hybrid-architecture.png
diff --git a/memory/foundry-gpt-memory-v1.md b/docs/guides/microsoft-foundry/gpt-memory-layer/index.md
similarity index 96%
rename from memory/foundry-gpt-memory-v1.md
rename to docs/guides/microsoft-foundry/gpt-memory-layer/index.md
index a94b3eea..c87f86ac 100644
--- a/memory/foundry-gpt-memory-v1.md
+++ b/docs/guides/microsoft-foundry/gpt-memory-layer/index.md
@@ -1,6 +1,29 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: guide
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 180
+applies_to:
+- 공식 원문 재검토 필요
+title: Microsoft Foundry GPT 메모리 레이어 설계
+description: Microsoft Foundry 기반 GPT 애플리케이션의 메모리 레이어 아키텍처를 설명합니다.
+technologies:
+- rag
+tags:
+- ai-agents
+- architecture
+---
+
# Azure Foundry GPT-5.x 메모리 레이어 아키텍처 가이드
-> 공식 Microsoft Learn 문서 기반 검증 완료. 2026년 7월 22일 기준.
+> 이관된 원문입니다. 공식 Microsoft Learn 문서와의 의미 검증이 필요합니다.
---
@@ -497,7 +520,7 @@ Australia East, Brazil South, Canada East, East US 2, France Central, Italy Nort
현재 Redis 기반 세션 메모리를 운영 중이라면, 세 계층을 분리하되 각각의 강점을 활용하는 하이브리드 아키텍처를 권장합니다.
-
+
@@ -526,4 +549,4 @@ Australia East, Brazil South, Canada East, East US 2, France Central, Italy Nort
---
-*마지막 업데이트: 2026년 7월 22일 — 공식 문서 검증 완료*
+*마지막 업데이트: 2026년 7월 22일 — 공식 원문 의미 검증 대기*
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 00000000..7f691f34
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,75 @@
+---
+title: DevGuideSample
+description: P99 지연부터 검색 품질, GPU 비용까지. 코드와 관측 결과로 살펴보는 Azure·Kubernetes·AI 엔지니어링 노트
+hide:
+ - toc
+---
+
+
+
+
+
+
+
ENGINEERING NOTES / AZURE · KUBERNETES · AI
+
+# 증상 너머, 동작 원리까지.
+
+
P99 지연, CPU throttling, 검색 품질, GPU 비용. 운영에서 마주친 질문을 코드·로그·측정 결과로 좁혀갑니다.
+
+[**지연과 병목** P95는 괜찮은데, 왜 P99에서 문제가 드러날까?](cases/index.md){ .dg-topic-link }
+
+[**성능과 비용** 단건 지연과 최대 처리량, GPU 선택의 기준은?](research/index.md){ .dg-topic-link }
+
+[**구성과 동작** 설정한 대로 동작하는지, 어디서 확인해야 할까?](guides/index.md){ .dg-topic-link }
+
+
+
+
+
+
+
+
+
SELECTED NOTES
+
+## 먼저 파고들 만한 기록
+
+기술 이름보다, 그 기술을 쓰며 부딪힌 질문에서 시작합니다.
+
+
+
+
+
+
+
+
EXPLORE THE COLLECTION
+
+## 지금 필요한 방식으로 읽기
+
+원인을 찾을 때와 구성을 만들 때, 선택지를 비교할 때 필요한 글은 다릅니다.
+
+
+
+
+
+
+
+**같은 문제를 겪었다면, 기록을 보태주세요.**
+
+어떤 환경에서 무엇을 관측했고, 왜 그 방법을 선택했는지. 다음 사람이 같은 시행착오를 줄일 수 있도록요.
+
+[글 기여하기](contributing/index.md){ .dg-text-link }
+
+
+
diff --git a/monitor/sre-agent-event-lab/assets/official/portal-complete-setup-page.png b/docs/labs/azure-monitor/sre-agent-event-lab-setup/images/portal-complete-setup-page.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/official/portal-complete-setup-page.png
rename to docs/labs/azure-monitor/sre-agent-event-lab-setup/images/portal-complete-setup-page.png
diff --git a/monitor/sre-agent-event-lab/assets/official/portal-incident-response-plans-list.png b/docs/labs/azure-monitor/sre-agent-event-lab-setup/images/portal-incident-response-plans-list.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/official/portal-incident-response-plans-list.png
rename to docs/labs/azure-monitor/sre-agent-event-lab-setup/images/portal-incident-response-plans-list.png
diff --git a/monitor/sre-agent-event-lab/assets/official/portal-response-plan-autonomy-step.png b/docs/labs/azure-monitor/sre-agent-event-lab-setup/images/portal-response-plan-autonomy-step.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/official/portal-response-plan-autonomy-step.png
rename to docs/labs/azure-monitor/sre-agent-event-lab-setup/images/portal-response-plan-autonomy-step.png
diff --git a/monitor/sre-agent-event-lab/assets/official/portal-setup-status-bar.png b/docs/labs/azure-monitor/sre-agent-event-lab-setup/images/portal-setup-status-bar.png
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/official/portal-setup-status-bar.png
rename to docs/labs/azure-monitor/sre-agent-event-lab-setup/images/portal-setup-status-bar.png
diff --git a/monitor/sre-agent-event-lab/guides/01-agent-setup.md b/docs/labs/azure-monitor/sre-agent-event-lab-setup/index.md
similarity index 92%
rename from monitor/sre-agent-event-lab/guides/01-agent-setup.md
rename to docs/labs/azure-monitor/sre-agent-event-lab-setup/index.md
index 9515c96b..14c2e435 100644
--- a/monitor/sre-agent-event-lab/guides/01-agent-setup.md
+++ b/docs/labs/azure-monitor/sre-agent-event-lab-setup/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: lab
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 90
+estimated_time: 60m
+cost: paid
+cleanup_required: true
+title: Azure SRE Agent 실습 설정
+description: 이벤트 기반 장애 분석 실습에 필요한 Azure SRE Agent를 설정합니다.
+technologies:
+- bicep
+tags:
+- ai-agents
+- deployment
+- monitoring
+---
+
# 01. Azure SRE Agent 설정
포털에서만 할 수 있는 설정을 마치고, 그 사실을 실습 상태 파일에 기록하는 단계입니다. 여기까지 끝나야 S1을 시작할 수 있습니다.
@@ -5,13 +30,13 @@
## 시작 조건
- **이 저장소를 본인 계정으로 fork했습니다.** Agent에 연결하는 저장소는 fork여야 합니다. 아래 "연결할 원본"에서 설명하듯 조사 결과 이슈가 연결된 저장소에 생성되므로, 원본 저장소를 연결하면 참가자 전원의 이슈가 한곳에 쌓입니다.
-- [README](../README.md)의 `azd up`이 성공했고 `/healthz`가 HTTP 200을 반환합니다.
+- [README](../sre-agent-event-lab/index.md)의 `azd up`이 성공했고 `/healthz`가 HTTP 200을 반환합니다.
- `https://sre.azure.com`에 로그인할 수 있고, 대상 구독에 Azure SRE Agent가 **Running** 상태로 하나 있습니다.
- 역할을 만들 수 있는 권한(Owner 또는 User Access Administrator)이 있습니다.
- 아래 값을 손에 들고 시작합니다.
```bash
-cd monitor/sre-agent-event-lab
+cd samples/azure-monitor/source-material/sre-agent-event-lab
source ./scripts/lab-env.sh
```
@@ -21,13 +46,13 @@ source ./scripts/lab-env.sh
Agent를 열면 위쪽 상태 표시줄이 아직 연결하지 않은 데이터 원본 수를 보여 줍니다. 오른쪽 **Complete setup**을 누르면 설정 페이지로 이동합니다.
-
+
> 출처: [Complete setup for Azure SRE Agent](https://learn.microsoft.com/azure/sre-agent/complete-setup)
설정 페이지에는 탭이 두 개입니다. 이 실습은 Azure 리소스와 지식 문서까지 연결해야 하므로 **Full setup** 탭을 사용합니다.
-
+
> 출처: [Complete setup for Azure SRE Agent](https://learn.microsoft.com/azure/sre-agent/complete-setup)
@@ -37,7 +62,7 @@ Agent를 열면 위쪽 상태 표시줄이 아직 연결하지 않은 데이터
|---|---|---|
| Code | **본인이 fork한 저장소**와 브랜치 (`source ./scripts/lab-env.sh`가 출력한 `Repository` 값) | 조사 결론이 코드와 최근 변경을 짚게 합니다 |
| Azure resources | `lab-env.sh`가 출력한 `Resource group` 값 | 메트릭·리소스 상태·Activity Log를 읽습니다 |
-| Knowledge files | [runbooks/incident-response.md](../runbooks/incident-response.md) | 조사 순서와 금지 사항을 팀 규칙으로 강제합니다 |
+| Knowledge files | [인시던트 대응 런북](../../../guides/azure-monitor/sre-agent-incident-runbook/index.md) | 조사 순서와 금지 사항을 팀 규칙으로 강제합니다 |
| Incidents | Azure Monitor | 경고를 자동으로 받아 조사 스레드를 엽니다 |
저장소는 [Connect source code](https://learn.microsoft.com/azure/sre-agent/connect-source-code)로 연결합니다. 이슈·PR 조작까지 맡기려면 [GitHub connector](https://learn.microsoft.com/azure/sre-agent/setup-github-connector)를 추가로 설정하되, 토큰 값은 포털 입력창에만 넣고 이 저장소의 어떤 파일에도 남기지 않습니다.
@@ -110,7 +135,7 @@ UAMI_MONITORING_CONTRIBUTOR_ASSIGNMENT_ID="$(az role assignment create \
연결되면 오른쪽 위에 초록색 체크가 붙습니다. 경고는 몇 분 안에 흘러들기 시작합니다.
-
+
> 출처: [Tutorial: Automate incident response in Azure SRE Agent](https://learn.microsoft.com/azure/sre-agent/automate-incidents)
>
@@ -125,7 +150,7 @@ UAMI_MONITORING_CONTRIBUTOR_ASSIGNMENT_ID="$(az role assignment create \
`Review`는 Agent가 진단은 스스로 하되 리소스 변경 전에 승인을 기다리는 모드입니다. 이 실습은 장애 주입과 복구를 스크립트가 통제하므로, 자율 모드를 고르면 Agent와 스크립트가 같은 리소스를 동시에 되돌리려 할 수 있습니다.
-
+
> 출처: [Tutorial: Automate incident response in Azure SRE Agent](https://learn.microsoft.com/azure/sre-agent/automate-incidents)
>
@@ -236,4 +261,4 @@ python3 scripts/lab_state.py acknowledge-agent
## 다음 단계
-첫 장애를 주입합니다: [02-scenario-s1.md](02-scenario-s1.md)
+첫 장애를 주입합니다: [S1 — HTTP 500 장애](../sre-agent-scenario-http-500/index.md)
diff --git a/monitor/sre-agent-event-lab/README.md b/docs/labs/azure-monitor/sre-agent-event-lab/index.md
similarity index 82%
rename from monitor/sre-agent-event-lab/README.md
rename to docs/labs/azure-monitor/sre-agent-event-lab/index.md
index d41a3a8b..e23585e0 100644
--- a/monitor/sre-agent-event-lab/README.md
+++ b/docs/labs/azure-monitor/sre-agent-event-lab/index.md
@@ -1,8 +1,34 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: lab
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 90
+estimated_time: 150m
+cost: paid
+cleanup_required: true
+title: Azure SRE Agent 이벤트 기반 장애 분석 실습
+description: 장애를 주입하고 Azure SRE Agent의 조사 결과를 검증하는 전체 실습입니다.
+technologies:
+- bicep
+- python
+tags:
+- ai-agents
+- monitoring
+- troubleshooting
+---
+
# Azure SRE Agent 이벤트 기반 장애 분석 실습
-Azure Container Apps에 장애를 세 번 주입하고, Azure Monitor 경고를 받은 Azure SRE Agent가 실제로 조사·결론까지 도달하는지 확인합니다. 제품 개요는 [Azure SRE Agent 소개](../azure-sre-agent.md)를 먼저 읽어 주세요.
+Azure Container Apps에 장애를 세 번 주입하고, Azure Monitor 경고를 받은 Azure SRE Agent가 실제로 조사·결론까지 도달하는지 확인합니다. 제품 개요는 [Azure SRE Agent 소개](../../../guides/azure-monitor/azure-sre-agent-overview/index.md)를 먼저 읽어 주세요.
-> ⚠️ 이 실습은 실제 Azure 리소스를 만들고 **과금**합니다. 끝나면 반드시 [정리](#정리) 절차로 지우세요.
+> ⚠️ 이 실습은 실제 Azure 리소스를 만들고 **과금**합니다. 끝나면 반드시 [정리](#_8) 절차로 지우세요.
## 결과물
@@ -35,14 +61,14 @@ Azure SRE Agent는 이 실습이 만들지 않습니다. 미리 만들어 둔 Ag
이 실습은 **본인 fork에서** 진행합니다. Agent에 저장소를 연결하면 조사 결과 이슈가 그 저장소에 생성되므로, 원본을 연결하면 참가자 전원의 이슈가 한곳에 쌓이고 쓰기 권한도 없습니다.
1. 이 저장소를 본인 계정으로 fork합니다.
-2. fork에서 **Code > Codespaces > Create codespace**를 엽니다. 저장소 기본 dev container가 `az`, `azd`, `gh`, Python, `uv`, `jq`를 갖춰 줍니다. 도구 목록과 로컬 설치 방법은 [.devcontainer/README.md](../../.devcontainer/README.md)에 있습니다.
+2. fork에서 **Code > Codespaces > Create codespace**를 엽니다. 저장소 기본 dev container가 `az`, `azd`, `gh`, Python, `uv`, `jq`를 갖춰 줍니다. 도구 목록과 로컬 설치 방법은 [.devcontainer/README.md](https://github.com/hellices/devguidesample/blob/main/.devcontainer/README.md)에 있습니다.
3. 터미널에서 로그인한 뒤 환경을 한 번 읽습니다.
```bash
az login --use-device-code
azd auth login
-source ./monitor/sre-agent-event-lab/scripts/lab-env.sh
+source ./samples/azure-monitor/source-material/sre-agent-event-lab/scripts/lab-env.sh
```
`lab-env.sh`는 `azd`가 게시한 배포 출력만 읽어 리소스 그룹·구독·Container App·Storage 범위 등을 현재 셸에 export하고, 값이 하나라도 없으면 `LAB_READY=0`으로 알려 줍니다. 이후 가이드의 명령은 이 값들을 그대로 사용하므로 단계마다 다시 조회하지 않습니다. 비밀 값은 읽지도 출력하지도 않습니다.
@@ -51,7 +77,7 @@ source ./monitor/sre-agent-event-lab/scripts/lab-env.sh
## 사전 조건
-- `az`, `azd`, `jq`, `curl`, `python3`, `uv` — 설치 명령은 [.devcontainer/README.md](../../.devcontainer/README.md)가 관리합니다. `uv`는 `app/.venv`를 만드는 `scripts/setup-venv.sh`가 쓰는 유일한 도구이며, 사내 프록시로 구성된 인덱스 설정을 그대로 씁니다(공개 PyPI `pip` 폴백 없음).
+- `az`, `azd`, `jq`, `curl`, `python3`, `uv` — 설치 명령은 [.devcontainer/README.md](https://github.com/hellices/devguidesample/blob/main/.devcontainer/README.md)가 관리합니다. `uv`는 `app/.venv`를 만드는 `scripts/setup-venv.sh`가 쓰는 유일한 도구이며, 사내 프록시로 구성된 인덱스 설정을 그대로 씁니다(공개 PyPI `pip` 폴백 없음).
- `az extension add --name log-analytics` (`az monitor log-analytics query` 제공)
- `az login`과 `azd auth login` — 두 CLI는 자격 증명을 따로 관리합니다.
- 구독 Contributor, 역할 할당을 위한 Owner 또는 User Access Administrator
@@ -62,7 +88,7 @@ source ./monitor/sre-agent-event-lab/scripts/lab-env.sh
이 실습의 모든 명령은 아래에서 한 번만 진입하는 이 디렉터리를 기준으로 합니다.
```bash
-cd monitor/sre-agent-event-lab
+cd samples/azure-monitor/source-material/sre-agent-event-lab
```
로컬 검증만 먼저 해 보려면 다음을 실행합니다. `setup-venv.sh`는 `azd up`의 postprovision 단계에서도 실행되므로, 배포를 먼저 한 경우에는 이미 준비된 상태입니다.
@@ -108,13 +134,13 @@ postprovision 단계가 실패하면 로컬 환경만 실패한 것입니다. `.
## Azure SRE Agent 설정
-포털에서만 할 수 있는 설정이 남아 있습니다. 저장소 연결, 지식 문서 업로드, **Azure Monitor incident platform** 연결, `Review` 모드 응답 계획, 역할 할당을 [guides/01-agent-setup.md](guides/01-agent-setup.md)가 순서대로 안내합니다.
+포털에서만 할 수 있는 설정이 남아 있습니다. 저장소 연결, 지식 문서 업로드, **Azure Monitor incident platform** 연결, `Review` 모드 응답 계획, 역할 할당을 [에이전트 설정](../sre-agent-event-lab-setup/index.md)이 순서대로 안내합니다.
-기본 실습에는 Logic App bridge를 배포하지 않습니다. 제품 표준 경로는 Azure Monitor를 incident platform으로 연결하는 것이고, 예전 실측에서 쓰던 Action Group + Logic App 인증 경로는 레거시 기록으로만 남아 있습니다([validation-results.md](validation-results.md)).
+기본 실습에는 Logic App bridge를 배포하지 않습니다. 제품 표준 경로는 Azure Monitor를 incident platform으로 연결하는 것이고, 예전 실측에서 쓰던 Action Group + Logic App 인증 경로는 레거시 기록으로만 남아 있습니다([실측 검증 결과](../../../research/azure-monitor/sre-agent-validation-results/index.md)).
## 정상 상태 확인과 승인
-장애를 주입하기 전에 정상 부하가 Application Insights까지 도달하는지 확인하고, 그 사실을 기록해야 S1이 열립니다. 텔레메트리가 없는 워크로드에 장애를 넣으면 주입한 장애와 원래부터 안 보이던 상태를 구별할 수 없습니다. 명령은 [guides/01-agent-setup.md](guides/01-agent-setup.md)에 있습니다.
+장애를 주입하기 전에 정상 부하가 Application Insights까지 도달하는지 확인하고, 그 사실을 기록해야 S1이 열립니다. 텔레메트리가 없는 워크로드에 장애를 넣으면 주입한 장애와 원래부터 안 보이던 상태를 구별할 수 없습니다. 명령은 [에이전트 설정](../sre-agent-event-lab-setup/index.md)에 있습니다.
```bash
python3 scripts/lab_state.py mark baseline_passed --evidence-dir "${EVIDENCE_DIR}"
@@ -133,9 +159,9 @@ python3 scripts/lab_state.py acknowledge-agent
| 시나리오 | 주입하는 장애 | 안내 문서 |
|---|---|---|
-| S1 | HTTP 500 응답 | [guides/02-scenario-s1.md](guides/02-scenario-s1.md) |
-| S2 | 주문 API 지연 | [guides/03-scenario-s2.md](guides/03-scenario-s2.md) |
-| S3 | Blob 읽기 권한 제거 | [guides/04-scenario-s3.md](guides/04-scenario-s3.md) |
+| S1 | HTTP 500 응답 | [S1 — HTTP 500 장애](../sre-agent-scenario-http-500/index.md) |
+| S2 | 주문 API 지연 | [S2 — 응답 지연](../sre-agent-scenario-latency/index.md) |
+| S3 | Blob 읽기 권한 제거 | [S3 — Blob 권한 장애](../sre-agent-scenario-blob-permission/index.md) |
## 결과 확인
@@ -143,7 +169,7 @@ python3 scripts/lab_state.py acknowledge-agent
app/.venv/bin/python scripts/score.py --evidence-root evidence
```
-채점 기준, 사람이 채워야 하는 판정, 종합 판정 해석은 [guides/05-results.md](guides/05-results.md)에 있습니다.
+채점 기준, 사람이 채워야 하는 판정, 종합 판정 해석은 [결과 채점](../sre-agent-results/index.md)에 있습니다.
## 정리
@@ -182,11 +208,11 @@ az group delete --subscription "${SUBSCRIPTION_ID}" --name "${RESOURCE_GROUP}" -
| 증상 | 확인할 곳 |
|---|---|
| 배포 후 앱이 응답하지 않음 | `azd env get-value AZURE_CONTAINER_APP_FQDN`으로 FQDN을 확인한 뒤 `/healthz` 호출 |
-| Agent가 스레드를 만들지 않음 | [guides/01-agent-setup.md](guides/01-agent-setup.md)의 incident platform·응답 계획 확인 |
+| Agent가 스레드를 만들지 않음 | [에이전트 설정](../sre-agent-event-lab-setup/index.md)의 incident platform·응답 계획 확인 |
| 경고가 발생하지 않음 | 시나리오 문서의 "복구 확인" 절 |
-| 채점이 `INCOMPLETE` | [guides/05-results.md](guides/05-results.md)의 수동 판정 절 |
+| 채점이 `INCOMPLETE` | [결과 채점](../sre-agent-results/index.md)의 수동 판정 절 |
-정적 임계값 대신 Dynamic Threshold로 확장하는 설계는 [dynamic-thresholds.md](dynamic-thresholds.md)에 정리해 두었습니다.
+정적 임계값 대신 Dynamic Threshold로 확장하는 설계는 [Dynamic Thresholds 확장 설계](../../../guides/azure-monitor/sre-agent-dynamic-thresholds/index.md)에 정리해 두었습니다.
## 공식 자료
diff --git a/monitor/sre-agent-event-lab/guides/05-results.md b/docs/labs/azure-monitor/sre-agent-results/index.md
similarity index 86%
rename from monitor/sre-agent-event-lab/guides/05-results.md
rename to docs/labs/azure-monitor/sre-agent-results/index.md
index 9acb66c6..f34b272f 100644
--- a/monitor/sre-agent-event-lab/guides/05-results.md
+++ b/docs/labs/azure-monitor/sre-agent-results/index.md
@@ -1,3 +1,28 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: lab
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 90
+estimated_time: 60m
+cost: paid
+cleanup_required: true
+title: SRE Agent 실습 결과와 채점
+description: 이벤트 기반 장애 분석 실습의 결과를 읽고 채점합니다.
+technologies:
+- python
+tags:
+- ai-agents
+- monitoring
+- diagnostics
+---
+
# 05. 결과 읽기와 채점
수집한 근거만으로 세 시나리오를 채점하고, 사람이 판단해야 하는 부분을 남김없이 드러내는 단계입니다.
@@ -11,7 +36,7 @@
## 실행 명령
```bash
-cd monitor/sre-agent-event-lab
+cd samples/azure-monitor/source-material/sre-agent-event-lab
app/.venv/bin/python scripts/score.py --evidence-root evidence
```
@@ -93,4 +118,4 @@ python3 scripts/generate_notifications.py \
azd down --purge
```
-정리 훅이 무엇을 지우는지, 확인 프롬프트에서 취소하면 무엇이 남는지는 [README의 정리 절](../README.md)에 있습니다.
+정리 훅이 무엇을 지우는지, 확인 프롬프트에서 취소하면 무엇이 남는지는 [README의 정리 절](../sre-agent-event-lab/index.md)에 있습니다.
diff --git a/monitor/sre-agent-event-lab/guides/04-scenario-s3.md b/docs/labs/azure-monitor/sre-agent-scenario-blob-permission/index.md
similarity index 93%
rename from monitor/sre-agent-event-lab/guides/04-scenario-s3.md
rename to docs/labs/azure-monitor/sre-agent-scenario-blob-permission/index.md
index b71264d9..c1158e46 100644
--- a/monitor/sre-agent-event-lab/guides/04-scenario-s3.md
+++ b/docs/labs/azure-monitor/sre-agent-scenario-blob-permission/index.md
@@ -1,10 +1,35 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: lab
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 90
+estimated_time: 60m
+cost: paid
+cleanup_required: true
+title: SRE Agent Blob 권한 장애 시나리오
+description: Blob 권한을 제거하고 SRE Agent의 권한 문제 진단을 확인합니다.
+technologies:
+- python
+tags:
+- ai-agents
+- authorization
+- monitoring
+---
+
# 04. S3 — Blob 권한 제거 장애
워크로드의 Blob 읽기 권한을 지우고, 애플리케이션 코드가 아니라 권한이 원인임을 Agent가 구분해 내는지 봅니다.
## 시작 조건
-- [03-scenario-s2.md](03-scenario-s2.md)의 S2가 복구되고 캡처가 `conclusion`으로 끝났습니다.
+- [S2 — 응답 지연](../sre-agent-scenario-latency/index.md)의 S2가 복구되고 캡처가 `conclusion`으로 끝났습니다.
- `evidence/state.json`에 `s2_recovered`와 `s2_captured`가 있습니다.
- 다른 시나리오의 실행이 `running`이나 `failed`로 남아 있지 않습니다. S1을 다시 돌리다 실패한 채로 두면 S2 기록이 멀쩡해도 S3는 거부됩니다.
- 역할 할당을 만들고 지울 권한이 그대로 있습니다.
@@ -16,7 +41,7 @@
Codespaces에서 이 저장소를 열었다면 `az login`을 마친 뒤 아래 한 줄로 이번 실습에 필요한 값이 모두 셸에 준비됩니다. 여기서부터 마지막 `record-capture`까지는 같은 셸에서 실행합니다.
```bash
-cd monitor/sre-agent-event-lab
+cd samples/azure-monitor/source-material/sre-agent-event-lab
source ./scripts/lab-env.sh
```
@@ -290,4 +315,4 @@ az role assignment create \
## 다음 단계
-수집한 근거를 채점합니다: [05-results.md](05-results.md)
+수집한 근거를 채점합니다: [결과 채점](../sre-agent-results/index.md)
diff --git a/monitor/sre-agent-event-lab/guides/02-scenario-s1.md b/docs/labs/azure-monitor/sre-agent-scenario-http-500/index.md
similarity index 92%
rename from monitor/sre-agent-event-lab/guides/02-scenario-s1.md
rename to docs/labs/azure-monitor/sre-agent-scenario-http-500/index.md
index a3eeea9b..66934432 100644
--- a/monitor/sre-agent-event-lab/guides/02-scenario-s1.md
+++ b/docs/labs/azure-monitor/sre-agent-scenario-http-500/index.md
@@ -1,10 +1,35 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: lab
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 90
+estimated_time: 60m
+cost: paid
+cleanup_required: true
+title: SRE Agent HTTP 500 장애 시나리오
+description: HTTP 500 장애를 주입하고 SRE Agent의 탐지와 조사를 확인합니다.
+technologies:
+- python
+tags:
+- ai-agents
+- troubleshooting
+- monitoring
+---
+
# 02. S1 — HTTP 500 장애
주문 API가 500을 반환하도록 바꾸고, Azure Monitor Sev2 경고가 발생한 뒤 Agent가 원인을 짚어내는지 봅니다.
## 시작 조건
-- [01-agent-setup.md](01-agent-setup.md)를 마쳤고 `evidence/state.json`에 `baseline_passed`와 `agent_setup_acknowledged`가 기록되어 있습니다.
+- [에이전트 설정](../sre-agent-event-lab-setup/index.md)을 마쳤고 `evidence/state.json`에 `baseline_passed`와 `agent_setup_acknowledged`가 기록되어 있습니다.
- 현재 활성 구독이 azd 환경의 구독과 같습니다.
이 두 가지는 `evidence/state.json`을 통해 강제됩니다. 아래 "수동 실행"의 첫 단계인 `lab_state.py begin-run`이 순서와 중복 실행을 함께 확인합니다.
@@ -20,7 +45,7 @@
Codespaces에서 이 저장소를 열었다면 `az login`을 마친 뒤 아래 한 줄로 이번 실습에 필요한 값이 모두 셸에 준비됩니다. 여기서부터 마지막 `record-capture`까지는 같은 셸에서 실행합니다.
```bash
-cd monitor/sre-agent-event-lab
+cd samples/azure-monitor/source-material/sre-agent-event-lab
source ./scripts/lab-env.sh
```
@@ -324,9 +349,9 @@ fi
| `conclusion-missing` | 조사는 했지만 결론에 도달하지 못했습니다 | 막힙니다 |
| `thread-not-created` | 경고가 Agent에 도달하지 못했습니다 | 막힙니다 |
-성공은 `conclusion` 하나뿐입니다. 부분 성공은 결론이 나왔지만 내용이 얕은 경우이며, 이때도 상태는 `conclusion`이고 점수는 [05-results.md](05-results.md)의 채점에서 갈립니다. 빈 성공 화면을 만들지 않고 누락 상태와 마지막 확인 시각을 그대로 그림에 남깁니다.
+성공은 `conclusion` 하나뿐입니다. 부분 성공은 결론이 나왔지만 내용이 얕은 경우이며, 이때도 상태는 `conclusion`이고 점수는 [결과 채점](../sre-agent-results/index.md)에서 갈립니다. 빈 성공 화면을 만들지 않고 누락 상태와 마지막 확인 시각을 그대로 그림에 남깁니다.
-`thread-not-created`가 나오면 [01-agent-setup.md](01-agent-setup.md)의 incident platform과 응답 계획부터 다시 확인합니다.
+`thread-not-created`가 나오면 [에이전트 설정](../sre-agent-event-lab-setup/index.md)의 incident platform과 응답 계획부터 다시 확인합니다.
## 복구 확인
@@ -347,4 +372,4 @@ azd env get-value AZURE_CONTAINER_APP_FQDN
## 다음 단계
-지연 장애로 넘어갑니다: [03-scenario-s2.md](03-scenario-s2.md)
+지연 장애로 넘어갑니다: [S2 — 응답 지연](../sre-agent-scenario-latency/index.md)
diff --git a/monitor/sre-agent-event-lab/guides/03-scenario-s2.md b/docs/labs/azure-monitor/sre-agent-scenario-latency/index.md
similarity index 93%
rename from monitor/sre-agent-event-lab/guides/03-scenario-s2.md
rename to docs/labs/azure-monitor/sre-agent-scenario-latency/index.md
index f2404445..2b505e2f 100644
--- a/monitor/sre-agent-event-lab/guides/03-scenario-s2.md
+++ b/docs/labs/azure-monitor/sre-agent-scenario-latency/index.md
@@ -1,10 +1,35 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: lab
+status: needs-review
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+last_verified: null
+review_cycle_days: 90
+estimated_time: 60m
+cost: paid
+cleanup_required: true
+title: SRE Agent 응답 지연 장애 시나리오
+description: 응답 지연을 주입하고 SRE Agent의 원인 분석을 확인합니다.
+technologies:
+- python
+tags:
+- ai-agents
+- latency
+- monitoring
+---
+
# 03. S2 — 응답 지연 장애
주문 API가 느려지게 만들고, p95 지연 경고를 받은 Agent가 오류 없는 장애를 설명하는지 봅니다. 500이 하나도 없기 때문에 S1보다 근거를 고르기 어렵습니다.
## 시작 조건
-- [02-scenario-s1.md](02-scenario-s1.md)의 S1이 복구되고 캡처가 `conclusion`으로 끝났습니다.
+- [S1 — HTTP 500 장애](../sre-agent-scenario-http-500/index.md)의 S1이 복구되고 캡처가 `conclusion`으로 끝났습니다.
- `evidence/state.json`에 `s1_recovered`와 `s1_captured`가 있습니다.
- 다른 시나리오의 실행이 `running`이나 `failed`로 남아 있지 않습니다. 하나라도 남아 있으면 S2도 거부되고, 거부 메시지가 막고 있는 시나리오와 해결 명령을 알려 줍니다.
- 워크로드가 정상이고 S1 경고가 해제되어 있습니다.
@@ -16,7 +41,7 @@ S1과 같은 구조이며, 바뀌는 것은 주입 값과 부하 조건뿐입니
Codespaces에서 이 저장소를 열었다면 `az login`을 마친 뒤 아래 한 줄로 이번 실습에 필요한 값이 모두 셸에 준비됩니다. 여기서부터 마지막 `record-capture`까지는 같은 셸에서 실행합니다.
```bash
-cd monitor/sre-agent-event-lab
+cd samples/azure-monitor/source-material/sre-agent-event-lab
source ./scripts/lab-env.sh
```
@@ -300,4 +325,4 @@ fi
## 다음 단계
-권한 장애로 넘어갑니다: [04-scenario-s3.md](04-scenario-s3.md)
+권한 장애로 넘어갑니다: [S3 — Blob 권한 장애](../sre-agent-scenario-blob-permission/index.md)
diff --git a/aisearch/custom_vectorization/ref_a10_vs_t4_embedding_benchmark.md b/docs/research/azure-ai-search/a10-vs-t4-embedding-benchmark/index.md
similarity index 94%
rename from aisearch/custom_vectorization/ref_a10_vs_t4_embedding_benchmark.md
rename to docs/research/azure-ai-search/a10-vs-t4-embedding-benchmark/index.md
index cfcc0649..320847ae 100644
--- a/aisearch/custom_vectorization/ref_a10_vs_t4_embedding_benchmark.md
+++ b/docs/research/azure-ai-search/a10-vs-t4-embedding-benchmark/index.md
@@ -1,8 +1,29 @@
+---
+services:
+- azure-ai-search
+official_sources:
+- title: Azure AI Search documentation
+ url: https://learn.microsoft.com/azure/search/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: 'A10 vs T4: 처리량과 비용으로 고르는 임베딩 GPU'
+description: BGE-m3-ko와 TEI를 사용한 실측입니다. 단건 지연, 배치 처리량, 청크 길이를 나눠 보고 GPU 선택과 증설의 기준을 비교합니다.
+featured: true
+technologies:
+- python
+tags:
+- benchmarking
+- performance
+published_at: 2026-07-23
+---
+
# A10 vs T4 임베딩 추론 벤치마크: BGE-m3-ko + TEI (Azure Spot VM)
**AI Search + Agent 구성(Indexer 미사용, Push API)에서 TEI로 서빙한 dragonkue/BGE-m3-ko의 추론 성능을 A10·T4에서 실측 비교**
-> 관련 문서: [GPU vLLM RAG 가이드](03_gpu_vllm_rag_guide.md) | [Custom 임베딩 적재 가이드](01_custom_embedding_guide.md) | [BGE-M3 vs Qwen3 품질 비교](ref_bge_m3_vs_qwen3_comparison.md)
+> 관련 문서: [GPU vLLM RAG 가이드](../../../guides/azure-ai-search/gpu-vllm-rag/index.md) | [Custom 임베딩 적재 가이드](../../../guides/azure-ai-search/custom-embedding-ingestion/index.md) | [BGE-M3 vs Qwen3 품질 비교](../bge-m3-vs-qwen3-embedding/index.md)
>
> 작성일: 2026-07-22
@@ -18,10 +39,10 @@
| 최대 처리량 (~1,000자 청크) | 23 texts/s | **130 texts/s** | **5.5×** |
| 1M 청크(500자) 적재 소요 | 4.5 hr | **0.9 hr** | 5× |
-- **쿼리 경로(단건 추론)**: 양쪽 모두 single-digit ms — latency-bound 구간으로, 전체 검색 응답 시간에서 차지하는 비중이 상대적으로 작음. QPS 스윕 실측 기준 T4 1대는 **~200 QPS(40자 쿼리)까지 p50 ~6ms 유지, 초과 시 큐잉 지연 — 안전 운용 상한 ~150 QPS/대** → [증설 기준](#쿼리-트래픽-증가-시-증설-기준--qps-스윕-실측)
+- **쿼리 경로(단건 추론)**: 양쪽 모두 single-digit ms — latency-bound 구간으로, 전체 검색 응답 시간에서 차지하는 비중이 상대적으로 작음. QPS 스윕 실측 기준 T4 1대는 **~200 QPS(40자 쿼리)까지 p50 ~6ms 유지, 초과 시 큐잉 지연 — 안전 운용 상한 ~150 QPS/대** → [증설 기준](#qps)
- **적재 경로(배치 추론)**: throughput-bound 구간에서 **본 테스트 환경 기준 A10 처리량이 T4 대비 약 5배 수준으로 측정**. T4는 ~60 texts/s 부근에서 GPU 사용률·전력이 상한에 도달했으며, 본 벤치마크 조건에서는 batch size/concurrency 조정만으로는 유의미한 추가 향상을 확인하지 못함
-- 공개 스펙 교차검증 — FP16 Tensor TFLOPS비 1.9×, Flash Attention 지원 차이, 메모리 대역폭 2×가 **주요 원인으로 추정**되며, 공개 스펙 기반 예측 범위(4.3~5.8×)와 실측 결과의 방향성이 일치 → [교차검증 섹션](#교차검증-공개-스펙벤치마크와의-정합성)
-- 대체 전략: A10 수급 불가 시, 본 측정 조건 기준 **A10 × N ≈ T4 × 5N**(500자) / **× 6N**(1,000자) 수준으로 대체 산정 — 최소 SKU(NC4as) × N 구성 시 VM 비용 기준 등가 처리량 확보 가능 → [대체 전략](#대체-전략-a10-수급-불가-시-t4-스케일아웃)
+- 공개 스펙 교차검증 — FP16 Tensor TFLOPS비 1.9×, Flash Attention 지원 차이, 메모리 대역폭 2×가 **주요 원인으로 추정**되며, 공개 스펙 기반 예측 범위(4.3~5.8×)와 실측 결과의 방향성이 일치 → [교차검증 섹션](#_4)
+- 대체 전략: A10 수급 불가 시, 본 측정 조건 기준 **A10 × N ≈ T4 × 5N**(500자) / **× 6N**(1,000자) 수준으로 대체 산정 — 최소 SKU(NC4as) × N 구성 시 VM 비용 기준 등가 처리량 확보 가능 → [대체 전략](#a10-t4)
> ⚠️ **측정 범위**: 본 측정은 **임베딩 생성 구간(TEI `/embed`)만 대상**이며, Azure AI Search 문서 업로드 및 인덱싱 시간은 포함하지 않는다. 실제 End-to-End 적재 시간은 Search 서비스 SKU, 문서 크기, 배치 크기 및 서비스 부하에 따라 달라질 수 있다. 또한 측정값은 모델, 텍스트 길이·토큰 분포, 서빙 엔진 버전, 드라이버 버전, 배치 설정 및 운영 환경에 따라 달라질 수 있다.
@@ -45,7 +66,7 @@
- NVadsA10v5 시리즈 중 **full-GPU 프로필(NV36ads, A10-24Q 24GB 단독 점유)** 사용. NV6/12/18ads는 GPU fractional 파티션(1/6~1/2) — 본 결과 적용 불가
- T4는 TEI **Turing 전용 이미지(`turing-1.8`) 필수**. Turing은 TEI [experimental 지원](https://github.com/huggingface/text-embeddings-inference#docker-images), Flash Attention 기본 비활성화
- NVIDIA 드라이버는 Azure VM extension `NvidiaGpuDriverLinux`(Microsoft.HpcCompute)로 설치 — GRID/CUDA 자동 판별. A10은 GRID 드라이버 필수 (수동 CUDA 드라이버 설치 시 vGPU 라이선스 실패)
-- 실행 스크립트: [bench/](bench/)
+- 실행 스크립트: [bench/](https://github.com/hellices/devguidesample/tree/main/samples/azure-ai-search/source-material/custom_vectorization/bench)
> ⚠️ **vCPU 격차(4 vs 36)의 결과 왜곡 여부 교차검증 완료.** T4 VM을 NC16as_T4_v3(16 vCPU)로 리사이즈 후 동일 벤치마크 5라운드 재실행:
> - 500자 최대 처리량 61.0 texts/s (4 vCPU: 61.3) / 1,000자 22.6 (4 vCPU: 23.4) / 단건 5.86ms (4 vCPU: 5.59ms) — **vCPU 4배 증가에도 측정 오차(±3%) 이내**
@@ -223,7 +244,7 @@ Indexer 미사용 구성의 임베딩 호출 경로 2종:
### 쿼리 트래픽 증가 시 증설 기준 — QPS 스윕 실측
-T4 1대(NC4as_T4_v3, TEI turing-1.8, BGE-m3-ko)에 오픈루프 고정 도착률로 단건 쿼리(~40자)를 주입하며 포화 지점을 실측 (30s/단계, 3라운드 스윕 — [bench_qps_sweep.py](bench/bench_qps_sweep.py)):
+T4 1대(NC4as_T4_v3, TEI turing-1.8, BGE-m3-ko)에 오픈루프 고정 도착률로 단건 쿼리(~40자)를 주입하며 포화 지점을 실측 (30s/단계, 3라운드 스윕 — [bench_qps_sweep.py](https://github.com/hellices/devguidesample/blob/main/samples/azure-ai-search/source-material/custom_vectorization/bench/bench_qps_sweep.py)):
| 도착률 (QPS) | p50 | p95 | p99 | GPU util | 판정 |
|-------------|-----|-----|-----|----------|------|
@@ -286,7 +307,7 @@ T4 1대(NC4as_T4_v3, TEI turing-1.8, BGE-m3-ko)에 오픈루프 고정 도착률
**운영 파라미터:**
- Push 파이프라인 최적점: T4 = batch 8~32 / conc 4 (초과 시 역효과), A10 = batch 32~64 / conc 4~8
-- 1M+ 청크 적재: A10 1대 ≈ T4 5대 — A10 수급 불가 시 T4 × 5N으로 대체 산정 → [대체 전략](#대체-전략-a10-수급-불가-시-t4-스케일아웃) 참고
+- 1M+ 청크 적재: A10 1대 ≈ T4 5대 — A10 수급 불가 시 T4 × 5N으로 대체 산정 → [대체 전략](#a10-t4) 참고
- Spot eviction 대비: Push 파이프라인에 retry + checkpoint(마지막 성공 문서 ID) 필수. 본 측정 중 eviction 미발생
- **A10 Spot 수급 주의**: NVadsA10_v5 Spot은 수급 변동성이 크며 특정 시간대에는 할당이 실패할 수 있다. 운영 환경에서는 PAYG 또는 예약 인스턴스(RI/Savings Plan)와의 조합 검토를 권장
diff --git a/aisearch/custom_vectorization/ref_bge_m3_vs_qwen3_comparison.md b/docs/research/azure-ai-search/bge-m3-vs-qwen3-embedding/index.md
similarity index 96%
rename from aisearch/custom_vectorization/ref_bge_m3_vs_qwen3_comparison.md
rename to docs/research/azure-ai-search/bge-m3-vs-qwen3-embedding/index.md
index 3f4e2198..bd20a937 100644
--- a/aisearch/custom_vectorization/ref_bge_m3_vs_qwen3_comparison.md
+++ b/docs/research/azure-ai-search/bge-m3-vs-qwen3-embedding/index.md
@@ -1,3 +1,24 @@
+---
+services:
+- azure-ai-search
+official_sources:
+- title: Azure AI Search documentation
+ url: https://learn.microsoft.com/azure/search/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: BGE-M3와 Qwen3 임베딩 품질 비교
+description: BGE-M3와 Qwen3-Embedding 모델의 벡터 검색 품질을 비교합니다.
+technologies:
+- python
+- rag
+tags:
+- benchmarking
+- performance
+published_at: 2026-05-22
+---
+
# BGE-M3 vs Qwen3-Embedding-0.6B 벡터 검색 품질 비교
**동일한 Azure AI Search Integrated Vectorization 파이프라인에서 BGE-M3와 Qwen3-Embedding-0.6B의 벡터 검색 품질을 비교한 결과**
@@ -62,14 +83,14 @@ Alibaba Qwen 팀에서 개발한 경량 임베딩 모델. Instruction-tuned 방
| 항목 | 값 |
|------|-----|
-| AI Search | `ais-aiplay-krc-01` (Standard, koreacentral) |
+| AI Search | `search-example-koreacentral-01` (Standard, koreacentral) |
| BGE-M3 인덱스 | `sample-vector-idx` (영어) / `samsung-bge-idx` (한글) |
| Qwen3 인덱스 | `qwen3-vector-idx` (영어) / `samsung-qwen-idx` (한글) |
| 데이터 소스 (영어) | `sample-docs-ds` (5건 Azure 서비스 설명 문서) |
| 데이터 소스 (한글) | `samsung-docs` (7건 삼성 갤럭시 제품 소개) |
| 벡터 차원 | 1024 (동일) |
| 알고리즘 | HNSW cosine (동일 파라미터) |
-| HTTPS 엔드포인트 | `ca-bge-m3-embed` / `ca-qwen3-embed` (Container Apps) |
+| HTTPS 엔드포인트 | `ca-embedding-example-01` / `ca-qwen3-example-01` (Container Apps) |
| Instruction 사용 | 두 모델 모두 미사용 (동일 조건) |
### 테스트 문서 목록
diff --git a/aisearch/custom_vectorization/ref_chunking_strategies_research.md b/docs/research/azure-ai-search/rag-chunking-strategies/index.md
similarity index 97%
rename from aisearch/custom_vectorization/ref_chunking_strategies_research.md
rename to docs/research/azure-ai-search/rag-chunking-strategies/index.md
index 93168dfe..84ad2b92 100644
--- a/aisearch/custom_vectorization/ref_chunking_strategies_research.md
+++ b/docs/research/azure-ai-search/rag-chunking-strategies/index.md
@@ -1,8 +1,28 @@
+---
+services:
+- azure-ai-search
+official_sources:
+- title: Azure AI Search documentation
+ url: https://learn.microsoft.com/azure/search/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: RAG Chunking 전략 비교
+description: RAG 검색을 위한 청킹 전략과 선택 기준을 비교합니다.
+technologies:
+- rag
+tags:
+- architecture
+- performance
+published_at: 2026-05-22
+---
+
# RAG Chunking 전략 리서치 보고서
**Azure AI Search Custom Web API 파이프라인에서 활용 가능한 최신 Chunking 전략, 프레임워크, 논문 정리**
-> 작성일: 2026-05-22 | 관련 문서: [02_custom_vectorization.md](02_custom_vectorization.md)
+> 작성일: 2026-05-22 | 관련 문서: [Custom Web API 벡터화 가이드](../../../guides/azure-ai-search/custom-web-api-vectorization/index.md)
---
diff --git a/hdinsight/kafka-catchup-sku-fetch-benchmark.md b/docs/research/azure-hdinsight/kafka-catchup-sku-fetch-benchmark/index.md
similarity index 96%
rename from hdinsight/kafka-catchup-sku-fetch-benchmark.md
rename to docs/research/azure-hdinsight/kafka-catchup-sku-fetch-benchmark/index.md
index 85ab5261..77cdf131 100644
--- a/hdinsight/kafka-catchup-sku-fetch-benchmark.md
+++ b/docs/research/azure-hdinsight/kafka-catchup-sku-fetch-benchmark/index.md
@@ -1,6 +1,26 @@
+---
+services:
+- azure-hdinsight
+official_sources:
+- title: Azure HDInsight documentation
+ url: https://learn.microsoft.com/azure/hdinsight/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: HDInsight Kafka Catch-up 성능 벤치마크
+description: HDInsight Kafka broker SKU와 consumer fetch size에 따른 catch-up 성능을 비교합니다.
+technologies:
+- kafka
+tags:
+- benchmarking
+- performance
+published_at: 2026-07-31
+---
+
# HDInsight Kafka lag/catch-up 벤치마크 — broker SKU / consumer fetch size
-- Date: 2026-07-16 | Region: japaneast | Cluster: `krafton-kafka-hdi-68944` (HDInsight Kafka, broker 3)
+- Date: 2026-07-16 | Region: japaneast | Cluster: `hdi-example-japaneast-01` (HDInsight Kafka, broker 3)
- Scope: partition·consumer 수 고정 조건에서 broker VM SKU, consumer fetch size 2개 변수만 스윕. 특정 축소 구성·특정 배포 인스턴스 한정 관측값이며 일반화 결론 아님.
- Base SKU 기준: 고객 운영 worker = D8a_v4 (8 vCPU / 32GB) × 18. 본 테스트 base를 이에 맞춰 D8(32GB)로 두고 D16(64GB)으로의 상향 효과를 주 비교축으로 함(D4는 하위 참고점).
@@ -246,12 +266,12 @@ partition 수 = consumer pod 수를 고정한다는 고객 제약 하에서 brok
## 12. Teardown
-- Cluster `krafton-kafka-hdi-68944`: deleted (D4·D8·D16 각 테스트 후 재생성/삭제).
+- Cluster `hdi-example-japaneast-01`: deleted (D4·D8·D16 각 테스트 후 재생성/삭제).
- VM `vm-kafka-producer`, `vm-kafka-loadgen`, `vm-jumpbox`, `vm-monitoring`: deallocated/삭제.
```bash
-az hdinsight delete -g rg-krafton-kafka-dev-jpe -n krafton-kafka-hdi-68944 --yes
-# 전체 정리: az group delete -n rg-krafton-kafka-dev-jpe --yes
+az hdinsight delete -g rg-example-japaneast-01 -n hdi-example-japaneast-01 --yes
+# 전체 정리: az group delete -n rg-example-japaneast-01 --yes
```
- 재현 아티팩트: worker SKU별 private template(`hdi-priv-Standard_D4ads_v5.json`, `hdi-priv-Standard_D8ads_v5.json`, `hdi-priv-Standard_D16ads_v5.json`), 연속 파이프라인 harness(producer VM 8-parallel flood + consumer VM single perf-consumer, fetch size 스윕).
@@ -265,8 +285,8 @@ az hdinsight delete -g rg-krafton-kafka-dev-jpe -n krafton-kafka-hdi-68944 --yes
## 관련 문서
-- [`../monitor/hdinsight-kafka-monitoring.md`](../monitor/hdinsight-kafka-monitoring.md) — HDInsight Kafka 모니터링 개요(Azure Monitor·Log Analytics·Ambari·진단설정).
-- [`../monitor/hdinsight-kafka-prometheus-grafana.md`](../monitor/hdinsight-kafka-prometheus-grafana.md) — Prometheus + Grafana broker JMX·kafka-exporter(partition별 lag) 대시보드 구성.
+- [HDInsight Kafka 모니터링 방식 비교](../../azure-monitor/hdinsight-kafka-monitoring-options/index.md) — Azure Monitor·Log Analytics·Ambari·진단 설정 개요.
+- [Prometheus + Grafana 대시보드 구성](../../../guides/azure-monitor/hdinsight-kafka-prometheus-grafana/index.md) — broker JMX·kafka-exporter(partition별 lag) 대시보드 구성.
---
diff --git a/monitor/assets/official/dynamic-threshold-preview-chart.png b/docs/research/azure-monitor/dynamic-thresholds-brief/images/dynamic-threshold-preview-chart.png
similarity index 100%
rename from monitor/assets/official/dynamic-threshold-preview-chart.png
rename to docs/research/azure-monitor/dynamic-thresholds-brief/images/dynamic-threshold-preview-chart.png
diff --git a/monitor/azure-monitor-dynamic-thresholds-brief.md b/docs/research/azure-monitor/dynamic-thresholds-brief/index.md
similarity index 91%
rename from monitor/azure-monitor-dynamic-thresholds-brief.md
rename to docs/research/azure-monitor/dynamic-thresholds-brief/index.md
index 515c124c..7e213d28 100644
--- a/monitor/azure-monitor-dynamic-thresholds-brief.md
+++ b/docs/research/azure-monitor/dynamic-thresholds-brief/index.md
@@ -1,3 +1,23 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: Azure Monitor Dynamic Thresholds 도입 분석
+description: Dynamic Thresholds 기능 변화와 도입 시점을 분석합니다.
+technologies:
+- rest-api
+tags:
+- monitoring
+- reliability
+published_at: 2026-08-17
+---
+
# Azure Monitor Dynamic Thresholds: What Changes and When to Adopt
Dynamic Thresholds replace a single manually chosen alert value with a machine-learned
@@ -7,7 +27,7 @@ dynamic ones without losing existing safety guarantees.
## Preview chart
-[](https://learn.microsoft.com/en-us/azure/azure-monitor/alerts/alerts-dynamic-thresholds)
+[](https://learn.microsoft.com/en-us/azure/azure-monitor/alerts/alerts-dynamic-thresholds)
*Source: [Create a Log Search alert rule with dynamic threshold](https://learn.microsoft.com/en-us/azure/azure-monitor/alerts/alerts-dynamic-thresholds).*
diff --git a/monitor/assets/images/hdinsight_monitor_integration_1.png b/docs/research/azure-monitor/hdinsight-kafka-monitoring-options/images/hdinsight_monitor_integration_1.png
similarity index 100%
rename from monitor/assets/images/hdinsight_monitor_integration_1.png
rename to docs/research/azure-monitor/hdinsight-kafka-monitoring-options/images/hdinsight_monitor_integration_1.png
diff --git a/monitor/hdinsight-kafka-monitoring.md b/docs/research/azure-monitor/hdinsight-kafka-monitoring-options/index.md
similarity index 92%
rename from monitor/hdinsight-kafka-monitoring.md
rename to docs/research/azure-monitor/hdinsight-kafka-monitoring-options/index.md
index 070b0ec8..a446f30d 100644
--- a/monitor/hdinsight-kafka-monitoring.md
+++ b/docs/research/azure-monitor/hdinsight-kafka-monitoring-options/index.md
@@ -1,3 +1,24 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: HDInsight Kafka 모니터링 방식 비교
+description: Ambari, Azure Monitor, JMX Exporter와 Kafka Exporter 기반 모니터링을 비교합니다.
+technologies:
+- kafka
+- prometheus
+tags:
+- monitoring
+- observability
+published_at: 2026-07-10
+---
+
# HDInsight Kafka 모니터링 방식 비교 (Ambari / Monitor Integration / JMX Exporter / Kafka Exporter)
지표별(브로커 리소스, Consumer Lag, 클러스터 상태, JVM 내부) 수집 경로·저장 위치가 상이 → 단일 도구로 미커버.
@@ -7,7 +28,7 @@
> - **노드 리소스 · 클러스터 상태 · 장기 로그** → Ambari + Monitor Integration (HDInsight 기본, 추가 설치 없음)
> - **브로커/토픽 처리량 · JVM internals · Consumer Group Lag** → HDInsight 기본 도구 **관측 불가**
> - → **JMX Exporter + Kafka Exporter (+Prometheus/Grafana)** 도입 권장
-> - 설치·대시보드 구성: **[hdinsight-kafka-prometheus-grafana.md](./hdinsight-kafka-prometheus-grafana.md)**
+> - 설치·대시보드 구성: **[Prometheus + Grafana 구성 가이드](../../../guides/azure-monitor/hdinsight-kafka-prometheus-grafana/index.md)**
## 1. 관측 항목 → 조회 도구 매핑
@@ -45,7 +66,7 @@ O = 기본 제공 / △ = 조건부·간접 제공 / X = 제공 안 함
- **활성화**: Azure Portal → 클러스터 → **Monitoring > Monitor integration** → Log Analytics 워크스페이스 연결
- 
+ 
- **주요 테이블**:
@@ -77,7 +98,7 @@ O = 기본 제공 / △ = 조건부·간접 제공 / X = 제공 안 함
### JMX Exporter / Kafka Exporter (오픈소스, 직접 구성) — 권장
HDInsight 기본 미제공 → 수동 설치. 둘 다 **Prometheus 스크래핑 + Grafana 시각화** 조합.
-설치·대시보드: **[hdinsight-kafka-prometheus-grafana.md](./hdinsight-kafka-prometheus-grafana.md)**
+설치·대시보드: **[Prometheus + Grafana 구성 가이드](../../../guides/azure-monitor/hdinsight-kafka-prometheus-grafana/index.md)**
- **JMX Exporter** — 브로커 JVM MBean을 Prometheus 형식으로 노출.
**JVM internals**(Heap/GC/스레드) + **브로커/토픽/파티션 지표**(BytesIn/Out, Under-Replicated Partitions 등).
@@ -217,7 +238,7 @@ HDInsightKafkaMetrics
> **권장 목표 상태**: Monitor Integration으로 노드/클러스터 baseline 확보 +
> **브로커/토픽 상세·JVM internals·Consumer Lag은 JMX/Kafka Exporter로 관측**.
-> → 설치·대시보드: **[hdinsight-kafka-prometheus-grafana.md](./hdinsight-kafka-prometheus-grafana.md)**
+> → 설치·대시보드: **[Prometheus + Grafana 구성 가이드](../../../guides/azure-monitor/hdinsight-kafka-prometheus-grafana/index.md)**
---
@@ -279,5 +300,5 @@ HDInsightKafkaMetrics
- JMX Exporter — [prometheus/jmx_exporter (GitHub)](https://github.com/prometheus/jmx_exporter)
- Kafka Exporter — [danielqsj/kafka_exporter (GitHub)](https://github.com/danielqsj/kafka_exporter)
-> 이 문서는 `rg-krafton-kafka-dev-jpe` 배포(`krafton-kafka-hdi-68944`) 기준 실측 기록.
+> 이 문서는 `rg-example-japaneast-01` 배포(`hdi-example-japaneast-01`) 기준 실측 기록.
> 리소스명·IP는 환경에 맞게 치환.
diff --git a/monitor/sre-agent-event-lab/assets/captures/s1-before-bridge/investigation.gif b/docs/research/azure-monitor/sre-agent-validation-results/images/investigation.gif
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/captures/s1-before-bridge/investigation.gif
rename to docs/research/azure-monitor/sre-agent-validation-results/images/investigation.gif
diff --git a/monitor/sre-agent-event-lab/assets/captures/s1/investigation.gif b/docs/research/azure-monitor/sre-agent-validation-results/images/s1-investigation.gif
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/captures/s1/investigation.gif
rename to docs/research/azure-monitor/sre-agent-validation-results/images/s1-investigation.gif
diff --git a/monitor/sre-agent-event-lab/assets/captures/s2/investigation.gif b/docs/research/azure-monitor/sre-agent-validation-results/images/s2-investigation.gif
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/captures/s2/investigation.gif
rename to docs/research/azure-monitor/sre-agent-validation-results/images/s2-investigation.gif
diff --git a/monitor/sre-agent-event-lab/assets/captures/s3/investigation.gif b/docs/research/azure-monitor/sre-agent-validation-results/images/s3-investigation.gif
similarity index 100%
rename from monitor/sre-agent-event-lab/assets/captures/s3/investigation.gif
rename to docs/research/azure-monitor/sre-agent-validation-results/images/s3-investigation.gif
diff --git a/monitor/sre-agent-event-lab/validation-results.md b/docs/research/azure-monitor/sre-agent-validation-results/index.md
similarity index 82%
rename from monitor/sre-agent-event-lab/validation-results.md
rename to docs/research/azure-monitor/sre-agent-validation-results/index.md
index dd62be3e..0a11046f 100644
--- a/monitor/sre-agent-event-lab/validation-results.md
+++ b/docs/research/azure-monitor/sre-agent-validation-results/index.md
@@ -1,10 +1,31 @@
+---
+services:
+- azure-monitor
+official_sources:
+- title: Azure Monitor documentation
+ url: https://learn.microsoft.com/azure/azure-monitor/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: Azure SRE Agent 실제 동작 검증 결과
+description: 세 가지 장애 시나리오에서 관측한 Azure SRE Agent 동작과 결과를 분석합니다.
+technologies:
+- python
+tags:
+- ai-agents
+- monitoring
+- diagnostics
+published_at: 2026-08-15
+---
+
# Azure SRE Agent 실제 동작 검증 결과
-> 제품 개요와 실사용 패턴은 [Azure SRE Agent 소개 자료](../azure-sre-agent.md)를 먼저 참고한다.
+> 제품 개요와 실사용 패턴은 [Azure SRE Agent 소개 자료](../../../guides/azure-monitor/azure-sre-agent-overview/index.md)를 먼저 참고한다.
>
> 이 문서는 S1/S2/S3 시나리오에서 측정한 수치, timeline, evidence, 한계를 정리한다.
>
-> **기록 시점 주의.** 아래 결과는 azd 재구성 이전에 손으로 구축한 실습(2026-08-12)의 측정치다. 여기 적힌 `rg-sre-agent-event-lab-krc` 같은 리소스 그룹과 리소스 이름, Action Group + Logic App bridge는 모두 그때의 환경이고, 현재 실습의 `azd up`은 이 이름들을 만들지 않는다. 지금 실행하는 절차와 실제로 배포되는 구성은 [README](README.md)와 [guides/](guides/)를 따르고, 이 문서는 그 절차로 무엇을 관찰할 수 있었는지 보여 주는 과거 기록으로 읽는다.
+> **기록 시점 주의.** 아래 결과는 azd 재구성 이전에 손으로 구축한 실습(2026-08-12)의 측정치다. 여기 적힌 `rg-sre-agent-event-lab-krc` 같은 리소스 그룹과 리소스 이름, Action Group + Logic App bridge는 모두 그때의 환경이고, 현재 실습의 `azd up`은 이 이름들을 만들지 않는다. 지금 실행하는 절차와 실제로 배포되는 구성은 [현재 실습 문서](../../../labs/azure-monitor/sre-agent-event-lab/index.md)를 따르고, 이 문서는 그 절차로 무엇을 관찰할 수 있었는지 보여 주는 과거 기록으로 읽는다.
- 실행일: 2026-08-12 | 리전: Korea Central | 구독: 비식별화
- 목표: Azure Monitor 경고를 Azure SRE Agent가 자동 수신해 원인과 안전한 완화책을 올바르게 도출하는지 실증
@@ -36,9 +57,9 @@
|---|---|---|
| Resource group | `rg-sre-agent-event-lab-krc` | ✅ |
| Container App | `ca-sre-event-lab-vnet` / image `20260812.4` | ✅ Healthy |
-| Log Analytics | `law-sre-event-lab-95933ae5` | ✅ |
-| Application Insights | `appi-sre-event-lab-95933ae5` | ✅ |
-| Storage | `stsrelab95933ae5`, Blob private endpoint | ✅ |
+| Log Analytics | `law-sre-event-lab-example` | ✅ |
+| Application Insights | `appi-sre-event-lab-example` | ✅ |
+| Storage | `stexample00000000`, Blob private endpoint | ✅ |
| Alert rules | S1/S2/S3 scheduled query, Sev2 | ✅ Enabled |
| Event bridge | Azure Monitor Action Group → Logic App MI → SRE HTTP Trigger | ✅ |
@@ -46,7 +67,7 @@
| 항목 | 값 | 상태 |
|---|---|---|
-| Agent | `sre-devguidesample-95933ae5` | ✅ Running |
+| Agent | `sre-devguidesample-example` | ✅ Running |
| Region | Korea Central | ✅ |
| Model provider | Microsoft Foundry / Automatic | ✅ |
| Azure resource access | 테스트 RG Reader | ✅ |
@@ -110,17 +131,17 @@
**Event bridge 구성 전 — alert는 발생했지만 Agent thread가 생성되지 않음**
-
+
**Action Group + Logic App managed identity bridge 구성 후 — 실제 Agent 조사**
-
+
-- [결론 frame](assets/captures/s1/07-conclusion.png)
-- [실제 event timeline](assets/captures/s1/timeline.md)
-- [Mermaid sequence source](assets/captures/s1/timeline.mmd)
+- [결론 frame](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/captures/s1/07-conclusion.png)
+- [실제 event timeline](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/captures/s1/timeline.md)
+- [Mermaid sequence source](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/captures/s1/timeline.mmd)
- 원본 evidence: `monitor/sre-agent-event-lab/evidence/s1-20260812T080606Z/` (Git 제외)
-- Agent thread: `6dd0e640-d969-46cb-a976-7c81b66fcadc`
+- Agent thread: ``
### Agent 분석
@@ -156,13 +177,13 @@
### 실제 동작 캡처
-
+
-- [결론 frame](assets/captures/s2/07-conclusion.png)
-- [실제 event timeline](assets/captures/s2/timeline.md)
-- [Mermaid sequence source](assets/captures/s2/timeline.mmd)
+- [결론 frame](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/captures/s2/07-conclusion.png)
+- [실제 event timeline](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/captures/s2/timeline.md)
+- [Mermaid sequence source](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/captures/s2/timeline.mmd)
- 원본 evidence: `monitor/sre-agent-event-lab/evidence/s2-20260812T081539Z/` (Git 제외)
-- Agent thread: `29befef3-0ef6-4ccf-aa43-af1355cff767`
+- Agent thread: ``
### Agent 분석
@@ -198,13 +219,13 @@ Container App workload identity의 테스트 Blob container data-plane read 역
### 실제 동작 캡처
-
+
-- [결론 frame](assets/captures/s3/07-conclusion.png)
-- [실제 event timeline](assets/captures/s3/timeline.md)
-- [Mermaid sequence source](assets/captures/s3/timeline.mmd)
+- [결론 frame](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/captures/s3/07-conclusion.png)
+- [실제 event timeline](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/captures/s3/timeline.md)
+- [Mermaid sequence source](https://github.com/hellices/devguidesample/blob/main/samples/azure-monitor/source-material/sre-agent-event-lab/assets/captures/s3/timeline.mmd)
- 원본 evidence: `monitor/sre-agent-event-lab/evidence/s3-20260812T084004Z/` (Git 제외)
-- Agent thread: `691f9f43-31c4-4822-8d1f-5f647d45f643`
+- Agent thread: ``
### Agent 분석
@@ -214,7 +235,7 @@ Container App workload identity의 테스트 Blob container data-plane read 역
- 제안 완화책: original least-privilege role 복원 후 propagation 대기; 실제 복구와 일치
- 잘못된 주장/누락: old app FQDN을 확인해 recovery가 미완료라고 판단. 실제 vnet app endpoint는 HTTP 200
-후속 보정: vnet workload의 `OTEL_SERVICE_NAME`을 `sre-event-lab-95933ae5`로 변경하고 alert/evidence query도 이 deployment-unique 값으로 제한했다. 변경 후 새 role name으로 `/api/orders` 5건, `/api/documents` 2건과 health telemetry가 분리 수집됨을 확인했다.
+후속 보정: vnet workload의 `OTEL_SERVICE_NAME`을 `sre-event-lab-example`로 변경하고 alert/evidence query도 이 deployment-unique 값으로 제한했다. 변경 후 새 role name으로 `/api/orders` 5건, `/api/documents` 2건과 health telemetry가 분리 수집됨을 확인했다.
### 점수
diff --git a/aifoundry/agent_framework_2026_customer_brief.md b/docs/research/microsoft-foundry/agent-framework-2026/index.md
similarity index 96%
rename from aifoundry/agent_framework_2026_customer_brief.md
rename to docs/research/microsoft-foundry/agent-framework-2026/index.md
index 5cdba503..960f1b25 100644
--- a/aifoundry/agent_framework_2026_customer_brief.md
+++ b/docs/research/microsoft-foundry/agent-framework-2026/index.md
@@ -1,3 +1,24 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: 'Microsoft Agent Framework 2026: Python과 Go 구현 분석'
+description: Microsoft Agent Framework의 Python 주요 기능과 Go 구현 선택지를 비교합니다.
+technologies:
+- python
+- go
+tags:
+- ai-agents
+- architecture
+published_at: 2026-08-17
+---
+
# Microsoft Agent Framework 2026: Python Highlights and the Go Implementation
Python highlights Agent Harness and Agent Skills. The Go section briefly
diff --git a/memory/agent-memory/images/02-architecture-patterns.svg b/docs/research/microsoft-foundry/agent-memory-architecture-patterns/images/02-architecture-patterns.svg
similarity index 100%
rename from memory/agent-memory/images/02-architecture-patterns.svg
rename to docs/research/microsoft-foundry/agent-memory-architecture-patterns/images/02-architecture-patterns.svg
diff --git a/memory/agent-memory/02-architecture-patterns.md b/docs/research/microsoft-foundry/agent-memory-architecture-patterns/index.md
similarity index 94%
rename from memory/agent-memory/02-architecture-patterns.md
rename to docs/research/microsoft-foundry/agent-memory-architecture-patterns/index.md
index 224a2499..9967a612 100644
--- a/memory/agent-memory/02-architecture-patterns.md
+++ b/docs/research/microsoft-foundry/agent-memory-architecture-patterns/index.md
@@ -1,3 +1,23 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: Agent Memory 아키텍처 패턴
+description: Agent memory를 저장하고 연결하는 주요 아키텍처 패턴을 비교합니다.
+technologies:
+- rag
+tags:
+- ai-agents
+- architecture
+published_at: 2026-08-24
+---
+
# 02. 아키텍처 패턴 — 어떤 구조로 담을 것인가

@@ -223,7 +243,7 @@ CPU 캐시 계층(L1/L2/메인메모리)에서 착안했다. 접근 빈도·최
| **Phase 3** | + Tiered (HOT/WARM) + Graph-Augmented | 지연·비용이 실제 문제가 되고, 상품·브랜드 관계 추천이 필요해질 때. COLD는 그 다음 |
| **Phase 4** | 필요 시 Full Cognitive | 라우터 도입은 저장소가 3개 이상, 오라우팅 모니터링 체계가 갖춰진 후 |
-이 Phase 구분은 [06. 커머스 적용 설계 §10 로드맵](06-commerce-application.md)과 동일한 기준이다. **티어링을 Phase 2로 당기지 않는 것**이 핵심이다 — 저장소를 나누기 전에 retention 정책과 평가 체계가 먼저 서야 한다.
+이 Phase 구분은 [06. 커머스 적용 설계 §10 로드맵](../agent-memory-commerce/index.md)과 동일한 기준이다. **티어링을 Phase 2로 당기지 않는 것**이 핵심이다 — 저장소를 나누기 전에 retention 정책과 평가 체계가 먼저 서야 한다.
**Full Cognitive를 처음부터 짓지 말 것.** 이 패턴의 최대 약점으로 지목되는 것이 "오버엔지니어링 위험"이며, 라우터 오분류는 **조용히 실패한다**(데이터가 엉뚱한 저장소에 들어가 영영 검색되지 않음). 자체 프레임워크를 운영 중인 팀이라면 라우팅 계층을 얹기 전에 로깅·평가 체계부터 갖추는 편이 안전하다.
@@ -231,8 +251,8 @@ CPU 캐시 계층(L1/L2/메인메모리)에서 착안했다. 접근 빈도·최
## 다음 문서
-- [03. 파이프라인과 검색](03-pipeline-and-retrieval.md) — 각 패턴 내부에서 데이터가 흐르는 방식
-- [05. 프로덕션과 평가](05-production-evaluation.md) — Tiered 패턴의 운영 구현
+- [03. 파이프라인과 검색](../agent-memory-pipeline-retrieval/index.md) — 각 패턴 내부에서 데이터가 흐르는 방식
+- [05. 프로덕션과 평가](../agent-memory-production-evaluation/index.md) — Tiered 패턴의 운영 구현
---
diff --git a/memory/agent-memory/images/05-commerce-blueprint.svg b/docs/research/microsoft-foundry/agent-memory-commerce/images/05-commerce-blueprint.svg
similarity index 100%
rename from memory/agent-memory/images/05-commerce-blueprint.svg
rename to docs/research/microsoft-foundry/agent-memory-commerce/images/05-commerce-blueprint.svg
diff --git a/memory/agent-memory/06-commerce-application.md b/docs/research/microsoft-foundry/agent-memory-commerce/index.md
similarity index 97%
rename from memory/agent-memory/06-commerce-application.md
rename to docs/research/microsoft-foundry/agent-memory-commerce/index.md
index 63d196cc..019ae802 100644
--- a/memory/agent-memory/06-commerce-application.md
+++ b/docs/research/microsoft-foundry/agent-memory-commerce/index.md
@@ -1,3 +1,23 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: 커머스 Agent Memory 적용 설계
+description: 실시간 추천과 개인화 구매 경험에 agent memory를 적용하는 설계를 제안합니다.
+technologies:
+- rag
+tags:
+- ai-agents
+- architecture
+published_at: 2026-08-24
+---
+
# 06. 커머스 적용 설계 — 실시간 추천과 개인 맞춤 구매 유도

diff --git a/memory/agent-memory/04-frameworks.md b/docs/research/microsoft-foundry/agent-memory-frameworks/index.md
similarity index 95%
rename from memory/agent-memory/04-frameworks.md
rename to docs/research/microsoft-foundry/agent-memory-frameworks/index.md
index b99eb3b1..b4c6040c 100644
--- a/memory/agent-memory/04-frameworks.md
+++ b/docs/research/microsoft-foundry/agent-memory-frameworks/index.md
@@ -1,3 +1,23 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: Agent Memory 프레임워크와 플랫폼 비교
+description: Agent memory 구현을 위한 프레임워크와 관리형 플랫폼을 비교합니다.
+technologies:
+- rag
+tags:
+- ai-agents
+- architecture
+published_at: 2026-08-24
+---
+
# 04. 프레임워크 · 플랫폼 비교 — 만들 것인가 가져올 것인가
자체 에이전트 프레임워크를 이미 운영 중인 팀에게 이 문서의 질문은 하나다. **"메모리 레이어까지 직접 만들 것인가, 특정 부분만 가져올 것인가."**
@@ -201,8 +221,8 @@ TTL / Decay 정책 ┃
## 다음 문서
-- [05. 프로덕션과 평가](05-production-evaluation.md)
-- [06. 커머스 적용 설계](06-commerce-application.md)
+- [05. 프로덕션과 평가](../agent-memory-production-evaluation/index.md)
+- [06. 커머스 적용 설계](../agent-memory-commerce/index.md)
---
diff --git a/memory/agent-memory/README.md b/docs/research/microsoft-foundry/agent-memory-overview/index.md
similarity index 62%
rename from memory/agent-memory/README.md
rename to docs/research/microsoft-foundry/agent-memory-overview/index.md
index e0633229..57bc232c 100644
--- a/memory/agent-memory/README.md
+++ b/docs/research/microsoft-foundry/agent-memory-overview/index.md
@@ -1,3 +1,23 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: Agent Memory 종합 리서치
+description: AI agent memory의 분류, 아키텍처, 검색, 프레임워크와 운영 평가를 종합합니다.
+technologies:
+- rag
+tags:
+- ai-agents
+- architecture
+published_at: 2026-08-24
+---
+
# Agent Memory 종합 리서치
자체 에이전트 프레임워크로 **B2C 서비스 에이전트**를 운영하는 개발 조직을 대상으로, 메모리를 정교화해 **실시간 추천**과 **개인 맞춤 구매 유도 메시지**를 제공하기 위한 리서치 결과물이다.
@@ -21,12 +41,12 @@
| 문서 | 내용 | 대상 |
|------|------|------|
-| **[01. 메모리 분류 체계](01-memory-taxonomy.md)** | Agent Memory **8유형 통합 정의**, 유형별 **저장소 선택지**와 Azure 매핑, Retention 정책, 30기법 6패밀리 지도 | 전원 |
-| **[02. 아키텍처 패턴](02-architecture-patterns.md)** | Single-Store / Dual-Store / Tiered / Graph-Augmented / Full Cognitive 5패턴, 비교표, 선택 결정 트리 | 아키텍트 |
-| **[03. 파이프라인과 검색](03-pipeline-and-retrieval.md)** | 쓰기 경로(추출→중복·모순 해소→라우팅) / 읽기 경로(hybrid search→RRF→rerank→MMR→temporal), 단계별 지연 비용 | 개발자 |
-| **[04. 프레임워크 비교](04-frameworks.md)** | Mem0 · Zep · Graphiti · Letta(MemGPT) · Cognee · Azure AI Search, **자체 구현 vs 도입 판단 기준** | 의사결정자 |
-| **[05. 프로덕션과 평가](05-production-evaluation.md)** | Tiered storage, PII·GDPR, TTL·샤딩·관측성·비용, 평가 지표, LoCoMo/LongMemEval 벤치마크 | SRE / 개발자 |
-| **[06. 커머스 적용 설계](06-commerce-application.md)** | **메모리 스키마 · 지연 예산 · 개인화 강도 단계화 · 안티패턴 · Phase 0~4 로드맵 · 기술+비즈니스 지표** | 전원 (핵심) |
+| **[01. 메모리 분류 체계](../agent-memory-taxonomy/index.md)** | Agent Memory **8유형 통합 정의**, 유형별 **저장소 선택지**와 Azure 매핑, Retention 정책, 30기법 6패밀리 지도 | 전원 |
+| **[02. 아키텍처 패턴](../agent-memory-architecture-patterns/index.md)** | Single-Store / Dual-Store / Tiered / Graph-Augmented / Full Cognitive 5패턴, 비교표, 선택 결정 트리 | 아키텍트 |
+| **[03. 파이프라인과 검색](../agent-memory-pipeline-retrieval/index.md)** | 쓰기 경로(추출→중복·모순 해소→라우팅) / 읽기 경로(hybrid search→RRF→rerank→MMR→temporal), 단계별 지연 비용 | 개발자 |
+| **[04. 프레임워크 비교](../agent-memory-frameworks/index.md)** | Mem0 · Zep · Graphiti · Letta(MemGPT) · Cognee · Azure AI Search, **자체 구현 vs 도입 판단 기준** | 의사결정자 |
+| **[05. 프로덕션과 평가](../agent-memory-production-evaluation/index.md)** | Tiered storage, PII·GDPR, TTL·샤딩·관측성·비용, 평가 지표, LoCoMo/LongMemEval 벤치마크 | SRE / 개발자 |
+| **[06. 커머스 적용 설계](../agent-memory-commerce/index.md)** | **메모리 스키마 · 지연 예산 · 개인화 강도 단계화 · 안티패턴 · Phase 0~4 로드맵 · 기술+비즈니스 지표** | 전원 (핵심) |
---
@@ -34,17 +54,17 @@
| 파일 | 내용 |
|------|------|
-| [images/01-memory-taxonomy.svg](images/01-memory-taxonomy.svg) | 6패밀리 30기법 전체 지도 |
-| [images/02-architecture-patterns.svg](images/02-architecture-patterns.svg) | 5가지 아키텍처 패턴 비교 |
-| [images/03-memory-pipeline.svg](images/03-memory-pipeline.svg) | 쓰기 경로 / 읽기 경로 분리 |
-| [images/04-production-tiers.svg](images/04-production-tiers.svg) | 프로덕션 계층 저장 + 가드레일 |
-| [images/05-commerce-blueprint.svg](images/05-commerce-blueprint.svg) | B2C 커머스 메모리 블루프린트 |
+| [images/01-memory-taxonomy.svg](https://github.com/hellices/devguidesample/blob/main/samples/microsoft-foundry/memory-artifacts/agent-memory/images/01-memory-taxonomy.svg) | 6패밀리 30기법 전체 지도 |
+| [images/02-architecture-patterns.svg](https://github.com/hellices/devguidesample/blob/main/samples/microsoft-foundry/memory-artifacts/agent-memory/images/02-architecture-patterns.svg) | 5가지 아키텍처 패턴 비교 |
+| [images/03-memory-pipeline.svg](https://github.com/hellices/devguidesample/blob/main/samples/microsoft-foundry/memory-artifacts/agent-memory/images/03-memory-pipeline.svg) | 쓰기 경로 / 읽기 경로 분리 |
+| [images/04-production-tiers.svg](https://github.com/hellices/devguidesample/blob/main/samples/microsoft-foundry/memory-artifacts/agent-memory/images/04-production-tiers.svg) | 프로덕션 계층 저장 + 가드레일 |
+| [images/05-commerce-blueprint.svg](https://github.com/hellices/devguidesample/blob/main/samples/microsoft-foundry/memory-artifacts/agent-memory/images/05-commerce-blueprint.svg) | B2C 커머스 메모리 블루프린트 |
---
## 읽는 순서
-**시간이 없다면** → [06. 커머스 적용 설계](06-commerce-application.md) 만 읽는다. 나머지 문서의 결론이 여기 수렴한다.
+**시간이 없다면** → [06. 커머스 적용 설계](../agent-memory-commerce/index.md) 만 읽는다. 나머지 문서의 결론이 여기 수렴한다.
**설계를 시작한다면**
```
@@ -68,7 +88,7 @@
| **3** | HOT/WARM 티어링, Structured RAG, Product Graph, 관측성 | 규모에서의 지연·비용 통제 |
| **4** | Memory Routing, Procedural, Self-Reflection, COLD 아카이브 | 선택적 고도화 |
-상세는 [06. 커머스 적용 설계 §10](06-commerce-application.md) 참조.
+상세는 [06. 커머스 적용 설계 §10](../agent-memory-commerce/index.md) 참조.
---
@@ -96,6 +116,6 @@
| 11 | [A Survey on the Memory Mechanism of LLM based Agents (arXiv:2404.13501)](https://arxiv.org/abs/2404.13501) | 학술적 분류 체계 · [정리 저장소](https://github.com/nuster1128/LLM_Agent_Memory_Survey) |
| 12 | [GDPR Article 17 — Right to erasure](https://gdpr-info.eu/art-17-gdpr/) | 전 계층 삭제 요구사항 |
-> **자료 활용 원칙.** 문서 본문의 서술은 1차 자료 2건을 기준으로 구성했고, 그 안에서 언급되거나 개념의 출처가 되는 논문을 확인해 근거 문헌으로 분리했다. 표의 모든 링크는 실제 접속해 제목·저자·연도를 확인했다. 다만 RRF(SIGIR 2009)와 MMR(SIGIR 1998)은 ACM DL 유료 문헌이라 [03. 파이프라인과 검색](03-pipeline-and-retrieval.md)에 서지 정보만 표기했다.
+> **자료 활용 원칙.** 문서 본문의 서술은 1차 자료 2건을 기준으로 구성했고, 그 안에서 언급되거나 개념의 출처가 되는 논문을 확인해 근거 문헌으로 분리했다. 표의 모든 링크는 실제 접속해 제목·저자·연도를 확인했다. 다만 RRF(SIGIR 2009)와 MMR(SIGIR 1998)은 ACM DL 유료 문헌이라 [03. 파이프라인과 검색](../agent-memory-pipeline-retrieval/index.md)에 서지 정보만 표기했다.
문서별 상세 참고 자료는 각 문서 하단에 있다.
diff --git a/memory/agent-memory/images/03-memory-pipeline.svg b/docs/research/microsoft-foundry/agent-memory-pipeline-retrieval/images/03-memory-pipeline.svg
similarity index 100%
rename from memory/agent-memory/images/03-memory-pipeline.svg
rename to docs/research/microsoft-foundry/agent-memory-pipeline-retrieval/images/03-memory-pipeline.svg
diff --git a/memory/agent-memory/03-pipeline-and-retrieval.md b/docs/research/microsoft-foundry/agent-memory-pipeline-retrieval/index.md
similarity index 93%
rename from memory/agent-memory/03-pipeline-and-retrieval.md
rename to docs/research/microsoft-foundry/agent-memory-pipeline-retrieval/index.md
index bf7a6640..a5555039 100644
--- a/memory/agent-memory/03-pipeline-and-retrieval.md
+++ b/docs/research/microsoft-foundry/agent-memory-pipeline-retrieval/index.md
@@ -1,3 +1,24 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: 'Agent Memory: 무엇을 남기고, 언제 다시 찾을까?'
+description: 대화에서 기억을 추출하는 쓰기 경로와 필요한 순간에 검색하는 읽기 경로를 나눕니다. 중복·모순 처리와 지연·비용의 설계 쟁점을 살펴봅니다.
+featured: true
+technologies:
+- rag
+tags:
+- ai-agents
+- architecture
+published_at: 2026-08-24
+---
+
# 03. 파이프라인과 검색 — 쓰기 경로 / 읽기 경로

@@ -73,7 +94,7 @@ Ebbinghaus 망각 곡선(1885)의 exponential decay를 적용한다.
S(t) = S₀ · e^(−λ · t)
```
-- λ가 클수록 빨리 잊는다. **half-life는 도메인과 기억 유형에 따라 수십 분에서 수백 일까지 벌어진다** — 단일 값을 쓰면 안 된다. 유형별 권장치는 [01. 메모리 분류 체계의 Retention 정책 표](01-memory-taxonomy.md)와 [06. 커머스 적용 설계 §6](06-commerce-application.md) 참조
+- λ가 클수록 빨리 잊는다. **half-life는 도메인과 기억 유형에 따라 수십 분에서 수백 일까지 벌어진다** — 단일 값을 쓰면 안 된다. 유형별 권장치는 [01. 메모리 분류 체계의 Retention 정책 표](../agent-memory-taxonomy/index.md)와 [06. 커머스 적용 설계 §6](../agent-memory-commerce/index.md) 참조
- **접근 시 강화(reinforcement)**: 검색될 때마다 강도 부스트 → 자주 유용한 기억은 오래 살아남음
- **프루닝 임계값**: 미만이면 soft delete(아카이브) 또는 hard delete
- **저장 압력 모니터**가 임계값을 동적으로 조정 → 용량 한계 근접 시 더 공격적으로 망각
@@ -214,8 +235,8 @@ LLM이 **잘못된 가상 답변**을 생성하면, 검색은 정답이 아니
## 다음 문서
-- [04. 프레임워크 비교](04-frameworks.md) — 직접 만들 것인가 가져다 쓸 것인가
-- [05. 프로덕션과 평가](05-production-evaluation.md) — 이 파이프라인을 규모에서 운영하기
+- [04. 프레임워크 비교](../agent-memory-frameworks/index.md) — 직접 만들 것인가 가져다 쓸 것인가
+- [05. 프로덕션과 평가](../agent-memory-production-evaluation/index.md) — 이 파이프라인을 규모에서 운영하기
---
diff --git a/memory/agent-memory/images/04-production-tiers.svg b/docs/research/microsoft-foundry/agent-memory-production-evaluation/images/04-production-tiers.svg
similarity index 100%
rename from memory/agent-memory/images/04-production-tiers.svg
rename to docs/research/microsoft-foundry/agent-memory-production-evaluation/images/04-production-tiers.svg
diff --git a/memory/agent-memory/05-production-evaluation.md b/docs/research/microsoft-foundry/agent-memory-production-evaluation/index.md
similarity index 93%
rename from memory/agent-memory/05-production-evaluation.md
rename to docs/research/microsoft-foundry/agent-memory-production-evaluation/index.md
index 4b72a615..263d33d0 100644
--- a/memory/agent-memory/05-production-evaluation.md
+++ b/docs/research/microsoft-foundry/agent-memory-production-evaluation/index.md
@@ -1,3 +1,23 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: Agent Memory 프로덕션 운영과 평가
+description: Agent memory를 프로덕션에서 운영하고 품질을 평가하는 기준을 정리합니다.
+technologies:
+- rag
+tags:
+- ai-agents
+- reliability
+published_at: 2026-08-24
+---
+
# 05. 프로덕션 운영과 평가

@@ -181,7 +201,7 @@ demote → M턴 미접근 | relevance score 하락 | 세션 종료 | decay sco
**1번과 2번을 건너뛰면 이후 모든 최적화가 추측이 된다.**
-이 순서는 [06. 커머스 적용 설계 §10 로드맵](06-commerce-application.md)의 Phase 0(1~4) → Phase 2(5) → Phase 3(6) → Phase 4(7)에 그대로 대응한다.
+이 순서는 [06. 커머스 적용 설계 §10 로드맵](../agent-memory-commerce/index.md)의 Phase 0(1~4) → Phase 2(5) → Phase 3(6) → Phase 4(7)에 그대로 대응한다.
---
@@ -202,7 +222,7 @@ demote → M턴 미접근 | relevance score 하락 | 세션 종료 | decay sco
## 다음 문서
-- [06. 커머스 적용 설계](06-commerce-application.md)
+- [06. 커머스 적용 설계](../agent-memory-commerce/index.md)
---
diff --git a/memory/agent-memory/images/01-memory-taxonomy.svg b/docs/research/microsoft-foundry/agent-memory-taxonomy/images/01-memory-taxonomy.svg
similarity index 100%
rename from memory/agent-memory/images/01-memory-taxonomy.svg
rename to docs/research/microsoft-foundry/agent-memory-taxonomy/images/01-memory-taxonomy.svg
diff --git a/memory/agent-memory/01-memory-taxonomy.md b/docs/research/microsoft-foundry/agent-memory-taxonomy/index.md
similarity index 93%
rename from memory/agent-memory/01-memory-taxonomy.md
rename to docs/research/microsoft-foundry/agent-memory-taxonomy/index.md
index b401c9ce..dec9b91b 100644
--- a/memory/agent-memory/01-memory-taxonomy.md
+++ b/docs/research/microsoft-foundry/agent-memory-taxonomy/index.md
@@ -1,3 +1,23 @@
+---
+services:
+- microsoft-foundry
+official_sources:
+- title: Microsoft Foundry documentation
+ url: https://learn.microsoft.com/azure/ai-foundry/
+document_type: research
+status: current
+verification_status: needs-review
+sources_checked_at: 2026-09-12
+title: Agent Memory 분류 체계
+description: AI agent가 기억할 정보의 유형과 수명주기를 분류합니다.
+technologies:
+- rag
+tags:
+- ai-agents
+- architecture
+published_at: 2026-08-24
+---
+
# 01. 메모리 분류 체계 — 무엇을 기억할 것인가

@@ -121,7 +141,7 @@
| Procedural / Persona | **No decay**, 버전 관리 | — |
| Cold Archive | **Retention period** (규제 기준) | 3~5년 |
-관련 개념은 [03. 파이프라인과 검색](03-pipeline-and-retrieval.md)에서 Temporal Memory · Forgetting & Decay · Consolidation으로 자세히 다룬다.
+관련 개념은 [03. 파이프라인과 검색](../agent-memory-pipeline-retrieval/index.md)에서 Temporal Memory · Forgetting & Decay · Consolidation으로 자세히 다룬다.
---
@@ -148,7 +168,7 @@
## 커머스 관점 우선순위
-실시간 추천 + 개인 맞춤 구매 유도라는 목표에 비춰 기법의 실효 순위를 매기면 다음과 같다. Phase 번호는 [06. 커머스 적용 설계 §10 로드맵](06-commerce-application.md)과 같은 기준을 쓴다.
+실시간 추천 + 개인 맞춤 구매 유도라는 목표에 비춰 기법의 실효 순위를 매기면 다음과 같다. Phase 번호는 [06. 커머스 적용 설계 §10 로드맵](../agent-memory-commerce/index.md)과 같은 기준을 쓴다.
### 선행 필수 (Phase 0)
| 기법 | 이유 |
@@ -191,8 +211,8 @@
## 다음 문서
-- [02. 아키텍처 패턴](02-architecture-patterns.md) — 이 메모리들을 어떤 구조로 담을 것인가
-- [06. 커머스 적용 설계](06-commerce-application.md) — 실시간 추천/구매 유도로 직결되는 설계
+- [02. 아키텍처 패턴](../agent-memory-architecture-patterns/index.md) — 이 메모리들을 어떤 구조로 담을 것인가
+- [06. 커머스 적용 설계](../agent-memory-commerce/index.md) — 실시간 추천/구매 유도로 직결되는 설계
---
diff --git a/docs/tags.md b/docs/tags.md
new file mode 100644
index 00000000..8191a0c6
--- /dev/null
+++ b/docs/tags.md
@@ -0,0 +1,32 @@
+---
+title: 태그별 찾기
+description: 지연, 네트워크, 성능, AI 에이전트 등 지금 다루는 문제에서 관련 문서를 찾습니다.
+hide:
+ - toc
+---
+
+
+
+
+
+
TOPIC INDEX
+
+# 지금 다루는 문제에서 시작하기
+
+
같은 증상도 여러 서비스에서 나타납니다. 제품 이름 대신 관심 있는 주제로 관련 기록을 모아보세요.