콘텐츠로 이동

관측성과 감지(Observability and Detection)

이 문서에서는 FDAI가 원시 텔레메트리를 제어 루프에서 처리할 수 있는 탐지 결과(발견된 문제)로 변환하는 방법을 설명합니다. 주요 탐지 기능은 이벤트 상관관계, 이상 탐지, 예측 및 전망, 근본 원인 분석(RCA)입니다. 이러한 기능은 AIOps 플랫폼에 요구되는 탐지 신호이며, 결정론 우선 원칙을 유지하면서 추가됩니다.

모든 신호는 정규화된 탐지 결과를 생성하고, 이 결과는 기존 trust-router → tiers → risk-gate → executor → audit 경로를 따라 처리됩니다. 별도의 우회 경로를 사용하지 않으며, 위험 게이트와 7가지 안전장치를 거치지 않고 자동 실행되는 작업은 없습니다.

참고 자료: 제어 루프, 티어 및 품질 게이트는 architecture.instructions.md, 측정 및 보호 지표는 goals-and-metrics-ko.md, 규칙 및 신호 소스는 rule-catalog-collection-ko.md, 모듈 배치 및 의존성 주입(DI) 경계는 project-structure-ko.md, 프롬프트 인젝션 위협 모델은 security-and-identity-ko.md를 참조하세요.

상관관계 분석과 대역 외(out-of-band) 탐지는 phase-1-rule-catalog-t0-ko.md에서 도입됩니다. FinOps 비용 이상 탐지와 DR RPO/RTO 예측은 phase-3-integrated-loop-ko.md에서 도입됩니다. 이 문서는 특정 고객에 종속되지 않으며, 모든 예시는 합성 데이터로 구성됩니다.

설계 관점 (deterministic-first, not ML-first)

섹션 제목: “설계 관점 (deterministic-first, not ML-first)”
  • 감지는 설명 가능성과 근거를 우선합니다. 통계적 기준선, 임계값, 상관관계 규칙으로 대부분의 신호를 모델 호출 없이 처리합니다. 모델(T1 유사도, T2 추론)은 퍼지 상관관계와 새로운 RCA에만 사용하며, 동일한 5-10% 예산을 적용합니다.
  • 감지 신호는 액션이 아니라 발견 사항입니다. 다른 이벤트처럼 라우팅하고 안전성 검토를 적용합니다. 예측이나 이상 자체가 자동으로 복구하지는 않습니다. 리스크 게이트와 사람 승인이 통제하는 관찰 모드 발견 사항 또는 교정 PR을 생성합니다.
  • 정본 객체 타입과 개별 탐지 기록의 이름은 Finding이고, 컬렉션, 페이지, 탐색 레이블의 이름은 Findings입니다. 발견된 문제는 인시던트 상관관계와 생애주기 게이트가 승격하기 전까지 Incident와 독립된 기록으로 유지됩니다. 에이전트 활동은 에이전트가 발견된 문제를 생성하거나 갱신한 사실과 시각 및 상관관계 근거를 보여 줄 수 있지만 발견된 문제 상태, 중복 제거, 심각도 또는 Incident 승격을 소유하지 않습니다. 여러 영역을 아우르는 Findings 변환 결과가 이런 운영자 작업을 소유합니다. 이 변환 결과가 구현되기 전에는 활동 타임라인이 아니라 각 영역의 변환 결과와 감사 기록을 정본으로 사용합니다.
  • 일상적인 모니터링은 인시던트가 아닙니다. 정상 하트비트, 성공한 탐색, 임계값 이내의 표본은 관측 근거만 기록합니다. 감지기가 범위가 제한되고 근거가 있는 발견 사항을 발행하고, IncidentLifecycleWorkflow가 허용된 에이전트 principal, 상관관계 키, 사유, 구성원 이벤트 근거를 다시 확인한 뒤에만 인시던트를 엽니다.
  • Repeated-event burst는 anomaly이며 자동 인시던트 권한이 아닙니다. 후보 인계에는 incident_correlation=correlate, 비어 있지 않은 상관관계 및 근거 키, 설정된 최소 심각도가 필요하며 none은 인시던트를 열지 않습니다. Huginn은 신뢰하는 UTC 수집 시각을 기록하고 그보다 늦지 않은 출처 시각만 수락하므로 재생이나 미래 시각이 Heimdall의 범위가 제한된 에피소드를 조작할 수 없습니다. 서로 다른 근거 키는 한 번씩만 계산하고 burst 심각도는 단조 증가하며, 수락된 에피소드는 중복 후보를 억제하되 더 심각한 갱신을 허용합니다. 조용한 구간 뒤에는 새 불투명 에피소드를 만들고, 재시작 뒤에는 에피소드 외 상관관계 키가 정확히 일치하는 활성 Incident만 재사용합니다. 게시 또는 인계 실패는 matching Event에서만 재시도하며 accepted와 held를 구분합니다. 후보 텍스트, 근거 수 및 수명 주기 notice는 범위가 제한되고 추가 전용입니다.
  • Analyzer 발견된 문제는 범위가 제한된 detector 출력입니다. 배포와 로컬 loop는 같은 고정 간격을 사용하고 논리 Resource, 신호 및 1분 occurred_at 버킷마다 재시도에 안정적인 Event 하나를 게시하며, 5분 분석 구간은 이 신원과 분리합니다. UUID5 키, 서로 다른 근거 및 에피소드와 심각도별 anomaly 키는 polling, 재생 및 인계 재시도가 판단을 중복시키지 못하게 합니다. 미래 또는 표준 시간대 없는 발견된 문제, 잘못된 근거, 일부 대상 coverage, 게시 및 증적 실패는 정상 결과 전에 fail-closed 합니다. 인벤토리 기반 분석은 온톨로지 Resource.id와 검증된 정규 Resource type을 발견된 문제 Event에 보존하여 trust router가 충분한 가장 낮은 tier를 선택할 수 있게 합니다. 활성 스냅샷의 정확한 공급자 참조는 메트릭 조회에만 사용하며 발견된 문제, 증적, Incident 또는 직렬화된 오류에 포함하지 않습니다. 구성된 공급자 신원과 기존 공급자 신원은 한 인벤토리 세대 안에서 조정되지 않으면 실패하고, 인벤토리 없는 메트릭 대상은 두 신원이 모두 필요합니다. Prometheus는 조립된 조회와 응답이 요청한 정확한 신원을 보존할 때만 사용하며 그렇지 않으면 Azure Monitor Logs 경로를 유지합니다.
  • 완전한 인벤토리 승격은 구성 규칙 평가도 시작합니다. 온톨로지 변환 결과가 완전하고 사용 가능한 세대를 보고한 뒤 Inventory Job은 Resource마다 재시도에 안전한 inventory.resource_observed Event를 하나씩 게시합니다. SignalType 디스패치는 이 Event를 resource.configuration.observed로 해석하므로 T0가 관측 속성에 적용되는 활성 Rego 규칙을 평가합니다. 세대와 Resource 내용이 Event 신원을 결정합니다. 같은 세대의 재시도는 중복을 제거하고 이후 세대는 다시 평가합니다. 불완전한 변환 결과나 게시 실패는 대기 상태로 남으며 정상 관측으로 보고하지 않습니다.
  • 완전한 인벤토리 평가는 Console이 평가된 Rule 점검 결과 요약을 표시하기 전에 명시적인 터미널 결과 계약이 필요합니다. 인벤토리는 관측 생산자로 남습니다. Forseti는 정확한 활성 카탈로그와 Rule 리비전에 대해 모든 적격 (generation, resource, rule) 튜플마다 버전이 지정된 터미널 결과를 기록합니다. 결과는 compliant, violated, abstained 중 하나입니다. 근거가 없거나, 오래되었거나, 지원되지 않거나, 결정론적 Rule 결과를 뒷받침할 수 없으면 abstained를 사용합니다. 별도의 완료 기록은 예상 분모가 모두 포함되고 모든 결과가 평가 증적과 Saga 감사 참조에 바인딩될 때만 세대를 닫습니다. 비어 있는 완전한 인벤토리는 예상 분모가 0일 때만 닫을 수 있습니다. 공급자, 브로커, OPA, 영속성 또는 변환 결과 실패는 평가를 사용할 수 없음으로 남기고 이전의 완전한 요약을 보존합니다.
  • Heimdall은 retained repeated-event 에피소드를 global 및 리소스별로 제한합니다. 한 리소스의 상관관계 flood는 다른 리소스의 partially accumulated 근거보다 해당 리소스의 가장 오래된 에피소드를 먼저 축출합니다.
  • 새 감지기는 관찰 모드로 출시하고 관찰 모드→강제 적용 규칙에 따라 승격합니다. 정확도와 오탐 비율은 단계 0 기준선과 비교해 측정합니다.

이 섹션은 구현 전에 이슈 #1199의 검토된 계약 경계를 기록합니다. 런타임 동작은 순서가 있는 조각으로 반영하므로 각 PR은 저장소가 아직 만들지 않는 근거를 주장하지 않고 검토할 수 있습니다.

초기 설계. 공유 서비스 계약 기록 두 가지를 추가합니다.

  • BaselineEvaluationOutcome은 Rule별 터미널 기록입니다. 하나의 인벤토리 세대와 다이제스트, 하나의 Resource 신원과 다이제스트, 하나의 카탈로그 리비전, 하나의 Rule 신원과 리비전, 하나의 터미널 결과(compliant, violated, abstained), 평가 증적, Saga 감사 참조, 정규 결과 다이제스트를 바인딩합니다.
  • BaselineEvaluationCompletion은 세대별 종료 기록입니다. 같은 세대와 카탈로그 리비전을 예상 분모, 관측 결과 집계, 완료 증적, Saga 감사 참조, 정규 완료 다이제스트에 바인딩합니다.

비평. 집계 수만으로는 불완전한 분모에서 여전히 0을 추론할 수 있으므로 충분하지 않습니다. 위반만 담는 Finding 스트림도 compliant 사례와 검토 보류 사례를 생략하므로 충분하지 않습니다. 따라서 계약에는 Rule별 터미널 기록, 정렬된 신원, 범위가 제한된 사유, 정확한 다이제스트 검증이 필요합니다. 그래야 중복되거나 순서가 바뀐 전달을 재생해도 포함된 분모가 바뀌지 않습니다. 완료 기록은 일치하지 않는 수, 섞인 세대/카탈로그 신원, 모든 권한 플래그를 거부해야 합니다. 또한 정상적인 0개 Resource 사례는 허용하되 생산자가 누락된 결과를 evaluated=true 뒤에 숨기지 못하게 해야 합니다.

수정. 공유 계약은 권한이 없고 추가형입니다. 고정 Pantheon 역할, 토픽 소유권 또는 실행기 경로를 바꾸지 않습니다. 인벤토리는 관측을 생산하고, Forseti는 Rule 결과를 판단하며, Saga는 추가 전용 감사를 저장하고, Operator 변환 결과는 완전한 정본 결과만 읽습니다. 변환 결과는 완료 기록이 활성 세대와 카탈로그 리비전의 예상 분모를 증명한 뒤에만 현재의 사용할 수 없음 요약을 대체할 수 있습니다. 이후 카탈로그 리비전이 나타나면 새 리비전에 자체 완전한 분모가 생길 때까지 이전의 완전한 요약은 이전 근거로 계속 보이며, 현재 평가로 취급되지 않습니다.

첫 번째 런타임 조각도 이 분리를 유지합니다. Forseti는 하나의 완전한 인벤토리 세대에 대한 타입 지정 메서드를 노출합니다. 활성 T0 엔진으로 각 적격 Resource를 평가하고, 주입된 Saga 감사 바인더가 공유 계약이 요구하는 감사 참조를 반환한 뒤에만 인용된 Rule마다 터미널 결과를 씁니다. 근거가 없거나 오래되었거나 지원되지 않으면 abstained가 됩니다. 비어 있는 완전한 세대는 분모 0의 완료를 씁니다. 이 메서드는 결정론적 StateStore 기록을 쓰며 AgentSpec, 토픽 소유자, 구독, 승인, 실행 또는 변환 결과 권한을 바꾸지 않습니다.

Saga 조각은 이 바인더를 제공합니다. Saga는 baseline-evaluation 감사 항목을 추가 전용 체인과, 연결된 경우 영속 감사 저장소에 추가한 뒤 Forseti가 각 결과 또는 완료 기록에 적는 안정적인 감사 참조와 다이제스트를 반환합니다. 감사 payload에는 Forseti가 제공한 인벤토리 세대, Resource 신원, 카탈로그 리비전, Rule 리비전, 평가 증적, 터미널 결과가 들어갑니다. Saga는 여전히 Rule 점검 결과를 판단하거나 변환하지 않고, 재생 가능한 감사 근거만 바인딩합니다.

Operator 변환 결과 조각은 완전한 BaselineEvaluationCompletion과 일치하는 모든 BaselineEvaluationOutcome이 있을 때만 Rule 점검 결과 요약을 수락합니다. 현재 점검 결과로는 violated 결과만 계산하고 compliant 및 판단 보류 Rule 참조는 0으로 유지하므로 해결된 발견 사항은 현재 개수에서 사라집니다. 잘렸거나, 일치하지 않거나, 부분적인 coverage는 0으로 추론하지 않고 거부합니다. 이전에 저장된 완전한 요약은 더 새 세대가 불완전하거나 사용할 수 없어도 계속 읽을 수 있으며, 권위 있는 기록이 없으면 계속 evaluated: false로 렌더링합니다.

알려진 제한 사항. 버전 1 완료 기록은 기대 분모를 Forseti가 기록한 결과 수로 설정하므로 누락된 Resource와 Rule 쌍을 감지할 수 없습니다. 또한 Rule 활성화 세대가 아니라 인벤토리 관측을 식별합니다. 기대 쌍을 독립적으로 도출하는 버전 2 완료 기록과 Rule 점검 결과 요약의 버전 2 전환은 T0 기반 프레임워크 규칙 근거에서 설계합니다. 아직 Forseti 평가를 호출하는 런타임 경로가 없고, 버전 1 감사 결합은 기록마다 Saga 에이전트를 직접 호출합니다. baseline 트리거 설계가 둘을 모두 대체합니다. 그 전까지는 버전 1 요약을 완전한 coverage의 증명이 아니라 관측된 개수로 취급하세요.

구성 드리프트는 T0(결정론적 규칙) 점검 결과입니다. 검토된 실제 스냅샷을 의도된 상태로 동결하며 이후 관측값으로 자동 교체하지 않습니다. 사람이 검토하는 DOCX와 정규 JSON 기준선은 동일한 버전, 범위, 생성 시각, 문서 다이제스트를 가집니다. 세대와 검증은 정본 JSON의 표시 가능한 모든 리소스, 속성, 근거 공백, 토폴로지 링크, exception, 알 수 없음 항목이 paired DOCX에 있는지도 확인합니다. 파일 다이제스트 일치만으로는 cross-format 동등성이 성립하지 않습니다.

  • core/detection/configuration_drift.py는 리소스, 토폴로지 링크, 비교 가능한 속성을 정규화하고 added, removed, changed, unchanged, unknown, unauthorized를 보고합니다.
  • 부분 스냅샷은 제거를 증명할 수 없습니다. 누락된 리소스, 링크, 속성은 신뢰할 수 있는 소스가 완전한 증거를 제공할 때까지 차단 상태로 유지합니다.
  • 설정된 기준선 버전, SHA-256 다이제스트, 범위는 서버가 소유합니다. 호출자는 도구 인자로 다른 대상을 선택할 수 없습니다.
  • 변경 불가능한 기준선 레지스트리는 여러 범위의 후보, 활성, 대체된, archived 버전을 보관할 수 있으며 범위마다 활성 버전을 하나만 허용합니다. 활성 출처와 replay-pinned 출처는 대화 입력이 아니라 서버 조립이 선택하고 레지스트리는 변경 API를 노출하지 않습니다.
  • delivery/configuration_drift.py는 개발 및 근거 재현을 위한 JsonFileConfigurationObservationSource를 유지합니다. delivery/azure/configuration_drift.py는 서버가 소유하는 범위 하나를 위한 읽기 전용 Azure Resource Graph 소스를 추가합니다. 배포 구성은 엄격한 식별자 문법을 통해 최대 64개의 스칼라 속성 경로를 선택합니다. 어댑터는 쿼리를 구성하고 선택한 값만 반환하며, 누락된 값을 알 수 없음으로 표시합니다. 비어 있지 않은 존재 여부 토큰을 사용하므로 생략된 false 값이 명시적으로 존재하는 빈 스칼라로 오인되지 않습니다. 프로바이더 ID를 안정적인 다이제스트 접미사로 바꾸며, 부분적이거나 너무 크거나 형식이 잘못되었거나 범위를 벗어난 결과를 차단합니다. 토폴로지를 추론하거나 임의의 프로바이더 속성 묶음을 수집하지 않습니다. 런타임 부트스트랩은 FDAI_CONFIGURATION_DRIFT_ENABLED가 명시적이고 모든 범위, 기준선, 구독 및 속성 전제 조건이 유효할 때만 소스를 연결합니다. 보호된 Core 서비스 전환은 Virtual Network에 통합된 배포 러너에서 범위가 제한된 보호 secret envelope로 검토된 스냅샷을 복원하고, 정확한 정규 다이제스트와 예상 리소스 수를 확인한 뒤, 변경 불가능한 콘텐츠 주소 기반 private Blob으로만 저장합니다. 저장소와 서비스 계획에는 바인딩 메타데이터만 포함됩니다. Core는 Managed Identity를 통해 provider가 허용하는 다이제스트 메타데이터까지 검증하며 해당 Blob을 읽습니다. 적용 후 검증은 배포된 바인딩과 Blob을 독립적으로 다시 읽은 뒤 새 Azure Resource Graph 관측값과 비교합니다. 보존되는 증적에는 다이제스트, 완전성, 결정, 개수, 값이 0인 권한 카운터만 포함됩니다. Container Apps 모듈은 기본적으로 구성 표류 설정을 내보내지 않습니다. 배포 소유자가 보호된 기준선 envelope 값 두 개를 모두 제공하면 이후 모든 Core 계획은 고정된 근거 도구 체인을 설치하고 정확한 바인딩을 보존하며, 성공한 모든 Core 적용은 독립적인 다시 읽기를 반복합니다.
  • Knowledge 수집은 검토된 문서를 설명하고 인용합니다. 드리프트를 판정하지는 않습니다. Knowledge를 사용할 수 없어도 결정론적 보고서는 유지하고 인용 상태는 근거 있음으로 표시하지 않고 차단 상태로 유지합니다. 각 인용 신원에는 정확한 기준선 버전과 전체 DOCX SHA-256 다이제스트가 포함되므로 재사용된 파일 이름이 다른 문서를 가리킬 수 없습니다. Exact 메타데이터 조회를 우선하고 범위가 제한된 결정론적 lexical 대체 경로는 고정된 문서 내부의 조각만 순위화하며 관련 없는 조회에는 결과를 반환하지 않습니다. 프로바이더 exception은 exception 타입과 pinned 기준선 신원이 포함된 구조화된 경고를 발행하지만 exception 메시지 또는 조각 내용은 기록하지 않습니다.
  • 읽기 전용 기능은 변경, 승인, 완화, unsupported-claim 개수를 보고합니다. 구성 점검에서는 모두 0으로 유지합니다.
  • 공개 bind_configuration_drift 조립 보조 로직은 변경할 수 없는 기능 런타임을 통해 이 server-pinned A0 기능 하나만 설치합니다. ActionType, 실행기 신원, 예약 권한, caller-selected 범위를 추가하지 않습니다.
  • 각 fresh 실행은 기준선 부하, 관측, 비교, Knowledge, 합계 지연 시간과 리소스 및 발견 사항 개수를 기록합니다. 캐시된 스냅샷은 current-state 질문을 충족할 수 없으므로 현재 관측값을 TTL 캐시로 재사용하지 않습니다. 증적은 floating-point timer 허용 오차를 넘어 단계 지연 시간 합이 합계 경과 시간보다 큰 경우를 거부합니다.
  • 구성이 완료된 Core 런타임은 점검 보고서를 반환하기 전에 기존 runtime:configuration-baseline: 변환 결과에 완료된 점검을 저장합니다. 범위마다 리비전으로 동시 쓰기를 제어하고 감사 기록을 남기는 행 하나가 실패 또는 차단 판정을 포함한 최신 관측을 유지합니다. 늦게 완료된 이전 관측은 더 새로운 근거를 덮어쓰지 못합니다. Operator는 저장된 메타데이터와 측정 지연 시간만 읽으며 Console의 GET 요청으로 Azure를 호출하지 않습니다. 기준선 연결 정보가 없으면 여전히 배포 소유자가 구성을 제공해야 합니다. 점검 기록만으로 기준선 버전 이력, 색인된 Knowledge, 검토 캠페인 또는 일정 승인을 만들어 내지 않습니다. Console은 인용 근거가 차단되거나 구성되지 않은 상태를 측정값 0으로 표시하지 않습니다.
  • Pure 검토 집약기는 고정된 기준선 하나에 대한 멱등적 실행 증적 세 개를 수락합니다. 검증된 실행 세 개만 inert weekly 예약 제안을 만들 수 있습니다. 차단된 또는 unsafe 실행이 있으면 캠페인을 pause하고 집약기는 스케줄러 작업을 직접 생성하지 않습니다. Revisioned StateStore 어댑터는 atomic state-and-audit 생성과 compare-and-set advance로 캠페인 진행 상황을 저장합니다.
  • 캠페인 advance 전에 변경할 수 없는 StateStore 보고 원장이 캠페인과 실행 신원 아래에 전체 발견 사항, 인용, 안전성 counter, measured performance를 기록합니다. Strict codec은 재시작 재생을 지원하고, 중복 내용은 no-op이며, 다른 근거로 신원을 재사용하면 차단합니다.
  • 준비된 캠페인은 inert 자동화 청사진을 제출합니다. 관찰 모드 weekly 이벤트가 생기기 전에 독립적인 검토와 인증된 스케줄러 명령이 계속 필요합니다. 구성 표류는 스케줄러 저장소 또는 실행기를 직접 호출하지 않습니다.

1. 이벤트 상관관계(Event 상관관계)

섹션 제목: “1. 이벤트 상관관계(Event 상관관계)”

event-ingest에서 정규화와 중복 제거 직후 실행하는 단계입니다 (project-structure-ko.md 와 phase-1-rule-catalog-t0-ko.md 참조): 관련된 원시 이벤트를 하나의 인시던트로 묶어 후속 계층이 이벤트 폭주 대신 하나의 사례를 추론하게 합니다.

  • Deterministic-first: 범위가 제한된 시간 구간 내에서 공유 키(리소스 id, 배포 id, 추적/상관관계 id, 원인 부모)로 상관 지음(규칙 사용); 퍼지 그룹화에 한해서만 T1 임베딩 유사도 로 대체 경로.
  • 그룹화와 인과관계는 다릅니다: 상관관계는 이벤트가 같은 집합에 속한다는 점만 나타냅니다. 같은 시간 구간에 속하는 것은 우연일 수 있습니다. 원인을 판단하는 것은 RCA의 역할(4절)이며 상관관계의 역할이 아닙니다.
  • 윈도우와 늦은 도착: 상관관계 윈도우는 신호 클래스별로 설정; 열린 인시던트의 키와 매칭되는 late/out-of-order 이벤트는 여기에 부착(또는 윈도우 이후면 linked follow-on 인시던트 오픈) - 이벤트는 절대 조용히 드롭되지 않고, architecture.instructions.md 의 per-resource 순서 보장이 보존됨.
  • 멱등 그룹화: 인시던트 id는 상관관계 키에서 결정론적으로 파생되므로 같은 멤버 재처리는 도착 순서와 무관하게 같은 인시던트를 산출.
  • 노이즈 감소: 한 루트 이벤트로부터의 알림 버스트는 하나의 인시던트로 접힘. 이것은 측정된 노이즈-감소 비율(인시던트 ÷ 원시 알림)로 보고, 주장된 이득이 아님, 데이터 손실 없음 - 멤버는 감사에 링크되어 남음.
  • 출력: 멤버 이벤트 id와 안정 멱등성 키를 운반하는 하나의 상관된 인시던트 이벤트; 순서/멱등 키 보존.
  • 수명 주기 경계: 상관관계 id는 조사 키이며 인시던트가 존재한다는 증거가 아닙니다. 수명 주기 기록은 IncidentRegistry가 소유합니다. Audit-only 로컬 고정본은 감사와 추적에서 계속 볼 수 있지만 operational 인시던트 명단에서는 제외됩니다.
  • 운영 작업 정책: 정규화된 Event는 incident_correlation을 선언합니다. 기본 correlate는 인시던트 그룹화를 유지합니다. 발견, 인벤토리, 스케줄러, workflow-control 생산자는 none을 설정하고 추적/감사용 correlation_id는 유지하며 인시던트 ID는 파생하지 않습니다.
  • 업스트림 구현: core/event_ingest/correlator.py (EventCorrelator) 가 이벤트의 correlation-id (또는 리소스 참조) 와 time-window 버킷 으로부터 incident_id_for 를 통해 인시던트 기준점 를 결정론적으로 도출한다; 한 구간 에서 키 를 공유하는 버스트는 하나의 인시던트로 접히고, 새 구간 는 linked follow-on 을 연다. 기준점 없는 이벤트 또는 incident_correlation=none 이벤트는 correlated=False 로 보고됩니다 (드롭 없음). 키 들은 IncidentRegistry.open 에 공급되어 멤버십을 멱등적 하게 누적한다.

기존 FinOps 비용 이상 연결 지점 (phase-3-integrated-loop-ko.md)을 성능, 신뢰성, 보안, 비용 등 모든 메트릭 스트림에 적용하도록 일반화합니다.

  • 방법: 통계적 베이스라인(rolling 및/또는 seasonal, seasonality 윈도우는 구성)과 편차 임계(예: z-score 또는 robust percentile 밴드), 신호 클래스별로 계산. 결정론적이며 설명 가능; 베이스라인, 편차 크기, 방향(over/under) 이 기록되어 사람이 왜 발동했는지 볼 수 있음.
  • 콜드 스타트: 신뢰할 수 있을 만큼 기준선 이력이 충분하지 않으면 감지기는 부족한 기준선으로 동작하지 않고 판단을 보류합니다(관찰 모드를 유지하고 발견 사항을 발행하지 않음). 콜드 스타트로 억제된 횟수는 숨기지 않고 메트릭으로 집계합니다.
  • 카테고리: 발견 사항은 룰 카탈로그와 공유되는 정본 category enum (security | reliability | cost | config_drift | compliance) 으로 정규화 - 성능 신호 (지연 시간/error-rate/포화) 와 replication lag는 reliability, 비정상 접근 패턴은 security, 지출 run-rate는 cost 로 매핑. 심각도는 편차 크기에서 파생.
  • 변경을 고려한 억제: 진행 중인 변경 또는 유지 관리 구간과 동시에 발생한 이상은 해당 변경 이벤트와 연관 지어 억제하거나 주석을 남깁니다. 배포가 오탐을 만들지 않게 하기 위해서입니다.
  • False-positive와 false-negative 컨트롤: debounce/settling 윈도우 + 새 감지기가 회귀시키면 안 되는 측정된 false-positive 비율 과 false-negative(놓친 이상) 비율 - 둘 다 goals-and-metrics-ko.md 의 가드 메트릭에 매핑.
  • 출력: 멱등성 키와 중복 제거를 적용하도록 event-ingest에 재진입하는 이상 발견 사항입니다. 이후 다른 이벤트처럼 신뢰 라우터로 전달합니다.
  • 업스트림 구현: core/detection/anomaly.py (MetricAnomalyDetector) 가 위에 기술한 결정론적 z-score 기준선 을 ship 한다 - cold-start 판단 보류, flat-baseline 안전 처리, deviation 크기 기반 심각도 - 그리고 각 발견 사항 을 to_event 로 관찰 모드의 Event(event_type="anomaly.finding") 로 정규화하며, `detector + 메트릭
    • 구간` 로 keying 해 반복 틱 을 dedup 한다.
  • 계절성(Seasonality): core/detection/seasonal.py의 SeasonalAnomalyDetector는 주기적인 메트릭을 처리합니다. 월요일 아침 트래픽 증가나 야간 배치 작업처럼 특정 위상에서 정상적으로 나타나는 최고점이 24x7 통합 평균과의 비교 때문에 이상으로 감지되지 않게 합니다. 이력을 구성된 위상 (hour_of_day, day_of_week, hour_of_week 또는 사용자 지정 함수)별로 묶고, 관측 표본을 같은 위상의 과거 표본과만 비교합니다. 기본 감지기를 감싸는 얇은 래퍼로서 이력을 위상별로 필터링하고 z-score, 콜드 스타트 판단 보류, 평탄한 기준선 처리, 이벤트 정규화 로직은 기본 감지기에 위임하므로 두 감지기의 로직이 달라지지 않습니다. 위상별 콜드 스타트는 독립적입니다. 일요일 기준선이 부족해도 월요일 데이터를 가져오지 않습니다. 위상은 발견 사항의 window_bucket에 기록하며, 발견 사항은 계속 관찰 모드 이벤트로 유지됩니다.
  • 다변량 결합: core/detection/composite.py의 CompositeAnomalyDetector는 조직의 당직 담당자가 수작업으로 살피던 복합 성능 저하 신호를 처리합니다. 실제 인시던트는 잡음이 많은 메트릭 하나가 아니라 지연 시간 증가, 오류율 증가, 높은 포화도처럼 상관된 스트림이 함께 감지되는 경우입니다. 이는 결합기이지 새 기준선이 아닙니다. 한 리소스와 구간에 대해 이미 생성된 메트릭별 AnomalyFinding 객체를 받아, 구성된 정족수 이상이 감지될 때만 CompositeAnomalyFinding(event_type="anomaly.composite")을 발생시킵니다. 정족수 미만이면 오탐을 억제하기 위해 판단을 보류합니다. 정족수 이상이면 신호를 증폭합니다. 동시에 감지된 구성원의 수와 제곱합의 제곱근으로 결합한 크기를 모두 반영해 심각도를 높이므로, 복합 성능 저하의 심각도는 개별 구성원보다 높습니다. 중복 메트릭은 가장 강한 발생 건 하나로 합쳐 재발행된 스트림이 정족수를 부풀리지 못하게 합니다. 평탄한 기준선의 구성원은 고정 가중치를 적용하며, 결합은 구성원 순서와 무관하게 결정론적입니다. 결합 결과도 안전성 검토가 통제하는 관찰 모드 발견 사항입니다. 감지 신호를 강화할 뿐 액션을 실행하지 않습니다.

core/detection/insights.py는 통계 모델이 필요하지 않은 운영 조건을 위한 결정론적 recipe 평가기를 추가합니다. 호출자는 정규화된 현재값, 이전값, 기준선 값과 샘플 개수, last-seen 시각을 제공합니다. 평가기는 열 가지 명시적 운영자(above, below, delta, 비율 변경, ratio, absent, stale) 중 하나를 적용하고 관측값, 참조, 점수, 임계값, 설명을 operational-insight.finding 이벤트에 기록합니다. 불완전하거나 유한하지 않은 입력, 샘플 부족, 0으로 나누는 입력은 발견 사항을 만들지 않고 검토를 위해 보류합니다.

버전 관리되는 rule-catalog/operational-insights/catalog.yaml 카탈로그는 다음 50개 초기 recipe를 제공합니다.

  • 인프라와 원격측정(9): CPU, 메모리, 디스크, 재시작, 프로세스, peer-hotspot, 최신성, 인제스트 양, cardinality 조건을 평가합니다.
  • 변경과 애플리케이션 성능(9): 배포 지연 시간, 오류, 처리량, 요청 오류, tail 지연 시간, 애플리케이션 성능 점수, 의존성 amplification, 추적 critical 경로, 구간 오류를 평가합니다.
  • 데이터와 능동 검사(9): slow 조회, 잠금 wait, 소비자 lag, dead-letter 증가, synthetic 가용성과 지연 시간, 로그 양, 새 로그 pattern, rare 오류를 평가합니다.
  • SLO, 경보 품질, 소유권(8): fast/slow burn, 오류 예산, 경보 storm, flapping, stale evaluation, no-data, 누락된 소유권을 평가합니다.
  • 비용 거버넌스(6): 일일 지출 변화, 예산 초과, 미할당/유휴 지출, 단위 비용, 컨테이너 요청 낭비를 평가합니다.
  • 보안, 영향, 복구 위생(9): critical misconfiguration, excess 권한, sensitive-data 증가, 런타임 threat, reachable vulnerability, 영향받은 세션, certificate 만료, 백업 최신성, 네트워크 retransmission을 평가합니다.

임계값과 메트릭 연결은 카탈로그 데이터로 유지되므로 환경별 조정에서 평가기 코드를 바꿀 필요가 없습니다. 모든 recipe는 기본적으로 관찰 모드를 사용하고 엔진, recipe, 리소스, 구간에서 안정 키를 만들며, trust 라우팅 전에 dedup할 수 있도록 event-ingest로 재진입합니다.

core/detection/insight_source.py의 OperationalInsightSource는 공유 MetricProvider 경계로 연결되는 런타임 브리지입니다. 리소스와 구간마다 고유 메트릭을 한 번씩 조회하고 현재값, 이전값, 과거 기준선 값을 만든 뒤 하나의 정규화된 관측으로 카탈로그를 평가합니다. 성공한 빈 조회는 absent의 증거가 될 수 있지만 프로바이더 오류는 메트릭을 사용 불가로 표시하고 의존하는 모든 recipe를 억제합니다. 따라서 원격측정 장애를 워크로드 장애로 오인하지 않습니다. Stale recipe는 stale 임계값의 두 배까지 범위가 제한된 조회 구간을 확장합니다. 이 범위에도 last-seen 샘플이 없으면 값을 추론하지 않고 보류합니다.

예약된 분석기는 배포에서 구성한 분산 추적 토폴로지 하나를 인벤토리 Resource로 취급하지 않고 평가할 수도 있습니다. 토폴로지 대상은 안정된 일반 참조와 순서가 있는 기대 hop 이름 집합을 선언합니다. Azure 전달 어댑터는 범위가 제한된 작업 영역 기반 Application Insights 행을 읽고 시나리오 신원, 추적 신원, hop 이름, 관측 시각, 변경 불가능한 근거 참조만 정규화합니다. 배포 값과 조회 자격 증명은 리포지토리 밖에 유지합니다. 60초 detection bucket은 900초 근거 lookback과 독립적으로 유지됩니다. 따라서 반복 멱등성과 Incident 상관관계 범위를 보존하면서 문서화된 120-300초 Log Analytics ingestion 하한을 포괄합니다.

감지기는 완료된 각 시나리오 실행을 기대 토폴로지와 비교합니다.

  • 연속 상태: 추적 신원 하나가 모든 기대 hop을 순서대로 포함합니다. 실행은 정상 관측 근거를 기록하고 발견 사항을 발행하지 않습니다.
  • 컨텍스트 재생성: 모든 기대 hop이 관측되었지만 추적 신원 하나로 전체 토폴로지를 포괄하지 못합니다. 발견 사항은 분리된 추적 조각과 정확한 hop 경계를 기록합니다.
  • 컨텍스트 소실: 전체 실행에서 하나 이상의 기대 hop이 없습니다. 발견 사항은 어떤 구성 요소가 컨텍스트를 제거했다고 추측하지 않고 누락된 hop을 기록합니다.
  • 알 수 없음: 소스를 사용할 수 없거나, 결과가 잘렸거나, 보존 범위를 벗어났거나, 완료된 실행이 없습니다. 틱은 정상 결과나 발견 사항을 만들지 않고 보류하므로 원격측정 누락이 워크로드 장애의 증거가 되지 않습니다.

각 불연속 감지기는 관찰 모드로 시작하고 토폴로지, 시나리오, 관측 구간마다 안전하게 재시도할 수 있는(idempotent) Event 하나를 발행합니다. Event는 시나리오 상관관계 키와 범위가 제한된 변경 불가능한 근거 참조를 포함하고 event-ingest로 재진입합니다. 따라서 반복되는 high 심각도 발견 사항은 Heimdall의 기존 임계값과 수명 주기 검사를 통해 중복 제거된 인시던트 하나를 열 수 있습니다. 근본원인 분석은 인용된 원격측정이 해당 구분을 뒷받침할 때만 관측된 경계와 계측, 수집기, 헤더 전파 후보 원인을 구분할 수 있습니다. 감지기 자체는 서비스를 재시작하거나 게이트웨이 정책을 변경하지 않습니다. 제안된 복구 작업에는 일반 안전성 검토, 필요한 사람 승인, 7개 안전조건, 독립적인 효과 검증이 계속 적용됩니다.

3. 예측 / 예보(Predictive / Forecasting)

섹션 제목: “3. 예측 / 예보(Predictive / Forecasting)”

임계값 위반이 발생하기 전에 예측하는 선제적 감지입니다. AIOps의 “용량 병목과 서비스 장애 예측” 사례를 결정론 우선 방식으로 처리합니다.

  • 방법: 측정한 시계열에 선형 또는 계절성 모델을 적합하고, 구성된 예보 지평까지 추세를 외삽합니다. 예상값이 구성된 임계값을 넘으면 발견 사항을 발생시킵니다. 모든 예보는 지평과 신뢰구간을 포함하며 불확실성을 명시한 예측 결과입니다. 확정된 사실도 LLM의 무조건적인 답도 아니며, 실행 자격을 부여하지 않습니다.
  • 대상: 용량/쿼터 고갈, RPO 위반 방향의 replication-lag 드리프트, 예산 대비 비용 run-rate, 인증서/시크릿 만료, 백업-보존 드리프트. RPO/RTO와 FinOps 대상은 phase-3-integrated-loop-ko.md 가 소유.
  • 승격 전 백테스트: 예보기는 과거 시계열을 대상으로 백테스트(알려진 과거 위반 예측)를 수행하고 관찰 모드에서 정확도 기준을 통과해야만 관찰 모드를 벗어날 수 있습니다.
  • 드리프트: 예보 오차를 시간에 따라 추적합니다. 성능 저하(드리프트)가 측정되면 예보기를 자동으로 관찰 모드로 강등합니다.
  • 안전: 예측은 발견 사항(기본 관찰 모드)이나 선제적 교정 PR을 생성하며 자체적으로 자동 실행하지 않습니다. 예보에 대응하는 액션도 리스크 게이트를 통과하고 7개 안전조건을 갖춰야 합니다.
  • 측정: 선행 시간을 actual_breach_time − finding_time으로 정의합니다. 유효한 예측의 선행 시간은 대응에 필요한 최솟값보다 큰 양수여야 합니다. 정밀도/재현율을 평가하며, 예측한 위반이 지평 안에서 실제로 발생하면 참양성입니다. 놓친 위반은 가드 메트릭인 거짓음성으로 집계합니다. 성능이 나쁜 예보기는 관찰 모드에 유지합니다.
  • 업스트림 구현: core/detection/forecast.py (LinearForecastDetector) 가 최소제곱 선형 예보기를 ship 한다 - cold-start 와 weak-fit(낮은 R-squared) 입력은 판단 보류, direction-gated rising/falling 위반 변환 결과, 그리고 지평으로 한계 된 긍정 lead 시간(위반 ETA). 각 예보는 to_event 로 관찰 모드의 Event(event_type="forecast.finding") 로 정규화되며, `detector + 메트릭
    • 구간로 keying 해 반복 틱 을 dedup 한다; 심각도 는 임박도 (lead / horizon)로 스케일. anomaly 감지기와MetricSample series 타입을 공유한다 (core/detection/series.py`).
  • 예측 구간(오탐 억제): core/detection/forecast_band.py의 prediction_band는 점 예측에 없는 불확실성 구간을 추가합니다. 잡음이 많은 시계열은 중심선이 임계값을 넘어도 정상 변동 범위 안에 있을 수 있습니다. 구간은 적합한 residual_std 및 예측이 미래로 뻗는 거리에 따라 넓어집니다. 구성된 신뢰수준(0.80-0.99)에서 구간의 보수적인 경계(상승 위반은 하한, 하강 위반은 상한)까지 임계값을 넘을 때만 신뢰할 수 있는 위반으로 봅니다. 이는 억제기이지 증폭기가 아닙니다. 점 추정치의 위반을 “신뢰 부족”으로 낮춰 관찰 모드에 유지하거나 판단을 보류함으로써 오탐 가드 메트릭을 보호할 수 있지만, 점 예측이 예상하지 않은 위반을 만들어 내지는 않습니다. 완전 적합 (residual_std == 0)이면 구간은 점 추정치로 좁혀집니다. 알 수 없는 신뢰수준은 기본값으로 조용히 대체하지 않고 거부합니다.

예측 지평이 끝난 뒤 관측된 결과와 대조하기 전에는 예보를 예측 품질의 증거로 볼 수 없습니다. FDAI는 예측 충실도와 대응 효과를 구분합니다. 선제 액션이 위반을 막았을 때 유용한 예측을 오탐으로 잘못 평가하지 않도록 합니다.

변경 불가능한 예측 묶음. 예보 발견 사항을 게시하기 전에 안정적인 prediction_id, detector 및 설정 버전, 대상 리소스와 메트릭, breach 조건식, event-time feature 기준 시점, horizon, 예상 breach 시간, 지점 추정치, uncertainty 간격, 모드를 기록합니다. 묶음은 추가 전용입니다. 이후 detector 버전은 기존 예측을 덮어쓰지 않고 새 prediction을 만듭니다.

결과 확정. 채점기는 horizon_end + telemetry_grace가 지난 후에만 예측 결과를 확정합니다. 유예 기간은 측정된 수집 지연 분포를 기준으로 설정합니다. 레이블은 처리 시간이 아니라 이벤트 시간을 사용하고 다음 규칙을 따릅니다.

관측된 에피소드Prediction 라벨처리
선언된 breach가 horizon 안에 발생하고 preventive 액션이 대상을 바꾸지 않음true 긍정발견 사항부터 breach까지 lead 시간을 측정합니다.
Horizon 안에 선언된 breach가 없고 텔레메트리가 완전하며 preventive 액션이 실행되지 않음false 긍정해당 정확한 horizon의 정밀도에 반영합니다.
적격한 선행 prediction 없이 선언된 breach가 발생함false 부정발행된 예측만이 아니라 실제 breach 에피소드에서 denominator를 만듭니다.
Prediction 후 preventive 액션이 실행되고 breach가 발생하지 않음intervention-censored예측 정밀도에서 제외하고 응답 원장에서 액션을 평가합니다.
텔레메트리가 누락되거나 stale이고, 리소스가 삭제되거나 제외된 maintenance 구간이 겹침unscorable별도로 집계하고 보고하며 true 부정으로 바꾸지 않습니다.

선언한 horizon 뒤의 breach는 해당 horizon의 true 긍정이 아닙니다. 대신 horizon 선택의 증거로 사용하며 별도의 더 긴 horizon prediction과 매칭할 수 있습니다. 중복 관측은 안정적인 prediction 및 인시던트 키로 결합하므로 at-least-once 전달에서도 두 번 채점되지 않습니다.

두 개의 원장. Prediction-fidelity 원장은 예측과 결과의 결합을 저장합니다. 응답 원장은 intervention, precondition, 예상 효과, 관찰된 효과, 검증, 롤백, SLO 복구, recurrence 구간을 저장합니다. Intervention이 발생한 에피소드는 untreated 예측 라벨로 사용하지 않습니다. 안전에 중요한 액션에서는 컨트롤 그룹을 만들기 위해 입증된 대응을 보류하지 않습니다. Counterfactual 근거에는 관찰 모드-only prediction, 자연적으로 untreated인 에피소드, 매칭된 historical 집단 또는 검토된 단계적 롤아웃을 사용합니다.

응답 원장의 첫 런타임 구획은 구현되어 있습니다. 컨트롤 루프는 독립적인 효과 관측 후 strict ResponseOutcome 계약을 발행하며 예상 범위, 관찰된 값, 시간 구간, 검증, 실행 모드, 롤백 결과, 대상 다이제스트 및 명시적 scorable 표시를 포함합니다. 기존 scheduled growth 작업은 독립 watermark로 이 기록을 소비하고 등록된 관찰 모드 challenger 모델만 갱신합니다. SLO 복구, recurrence 종결, matched 집단 및 quasi_experimental 또는 interventional 근거로의 승격은 후속 작업이며 검증된 효과 하나에서 추론하지 않습니다.

정보 누출 없는 평가. 백테스트는 기준 시점을 이동하며 시간을 분할하는 rolling-origin 방식을 사용하고, 한 인시던트의 모든 이벤트를 같은 분할에 넣습니다. 특성, 토폴로지, 유지 관리 상태, 레이블은 예측 기준 시점에 알 수 있었던 값만 읽습니다. 현재 모델과 후보는 같은 고정 재생과 같은 실제 운영 관찰 모드 이벤트를 처리하며 후보는 액션을 실행할 수 없습니다. 대상과 horizon별로 샘플 크기와 확신도 간격을 포함해 정밀도, 재현율, resource-day당 false 경보, PR-AUC, Brier 점수 또는 calibration 오류, 간격 커버리지, actionable lead-time 분포, abstention, cold-start, unscorable 비율을 보고합니다. 집계 정확도만으로는 승격할 수 없습니다.

에이전트 choreography. Heimdall은 예측 발견 사항과 결정론적 결과 종결을 소유하고 Huginn은 정규화된 실제 관측을 제공합니다. Saga는 변경 불가능한 prediction 및 최종 근거를 기록하고 Norns는 종료된 case-history 집단을 off-path에서 분석해 비활성 detector/룰 후보를 제안하며 Mimir는 검토된 승격을 소유합니다. Forseti는 발견 사항을 판단하고 Thor는 액션할 수 있지만 어느 쪽도 prediction 라벨을 수정할 수 없습니다. 이 에이전트들은 타입이 지정된 이벤트를 독립적으로 소비하고 병렬로 실행할 수 있으며 채점 경로에는 직접 에이전트 호출이 없습니다.

승격에는 사전 등록된 최소 closed/scorable 에피소드 수와 관측 일, 확신도 간격이 incumbent를 넘는 후보 개선, 가드 메트릭 무회귀, 정책 escape 0건이 필요합니다. Calibration, 재현율, 간격 커버리지 또는 actionable lead 시간이 저하되면 detector는 자동으로 관찰 모드로 돌아갑니다. 영속 에피소드 원장, event-time 결과 결합, intervention censoring, transactional 게시 발신함 및 기계적 틱 배선은 구현되어 있습니다. 승격은 계속 측정된 배포 근거와 권위 있는 승격 레지스트리에 의존합니다.

PostgreSQL 예측 에피소드 저장소는 읽기 전용 운영 근거 snapshot을 노출합니다. 결정론적 reducer는 정밀도, 재현율, 놓친 위반율, 구간 포괄률, 양수인 평균 및 중앙값 선행 시간, 양수가 아닌 선행 시간 수, 판단 보류율, 명시적인 결과 수와 분모 공백을 보고합니다. 발견된 문제를 발행하기 전에 이미 발생한 위반은 snapshot을 실패시키거나 선행 시간을 부풀리지 않고 액션할 수 없는 근거로 보존합니다. 개입으로 검열되거나 점수화할 수 없는 결과는 계속 표시하지만 점수화 가능한 분모에는 넣지 않으며, snapshot은 실행 또는 승격 권한을 부여하지 않습니다. Console의 종료 완전성은 종료 기한이 도래한 에피소드만으로 계산합니다. 기한이 남은 에피소드는 실패로 세지 않고, 기한이 도래한 집단이 없으면 측정되지 않은 상태로 표시합니다. 결과 행에는 수명 주기의 종료 사유가 아니라 object.forecast-outcome 발행 대기 기록의 평가 라벨과 누락 원인을 그대로 표시합니다. Console의 게시 부채는 게시되지 않았고 배달 실패로 확정되지 않았으며 처리 가능 시각이 도래한 행만 셉니다. 예정된 재시도는 현재 부채가 아니며, 가장 오래된 대기 시각은 재시도 시각이 아니라 처리할 수 있는 행의 원래 생성 시각을 유지합니다.

4. 근본원인 분석(Root-Cause Analysis)

섹션 제목: “4. 근본원인 분석(Root-Cause Analysis)”

티어 계약, 결정론적 인과사슬, 근거가 있는 reasoning, knowledge 근거 및 읽기 전용 프로젝션은 근본원인 분석에서 소유합니다.

상관관계 분석은 event-ingest 내에서 실행됩니다. 이상 탐지기와 예측 탐지기는 대역 외(out-of-band) 생산자로 동작하며, 탐지 결과를 버스에 게시합니다. 예를 들어 app-shape.instructions.md에 설명된 이벤트 기반 Functions와 phase-1 대역 외 탐지 방식이 이에 해당합니다. 게시된 탐지 결과는 멱등성 키를 부여받고 중복 제거 처리를 거치기 위해 event-ingest로 다시 유입됩니다. 따라서 탐지 결과가 반복적으로 바뀌는 탐지기라도 중복 작업을 발생시킬 수 없습니다. 어떤 탐지기도 새로운 자율 실행 경로를 만들지 않습니다.

telemetry / metrics
-> anomaly / forecast detectors emit findings ---. # sections 2-3
raw events -------------------------------------- +-> event-ingest
(normalize + dedup + correlate) # section 1
-> trust-router -> T0 | T1 | (T2 -> quality-gate) # RCA per tier, section 4
-> risk-gate -> auto -> executor -> delivery (PR) | HIL | abstain/deny -> audit
  • 탐지 결과(발견된 문제)는 shared/contracts에 정의된 독립적인 버전 관리 이벤트 형식입니다. 안정적인 멱등성 키(예: detector-id + metric + window-bucket 또는 인시던트 ID)를 사용하므로, 평가가 반복 실행되어도 결과가 누적되지 않고 중복 제거됩니다.
  • 탐지기는 설정을 기반으로 동작합니다. 기준선, 임계값, 예측 기간, 상관관계 키, 모델 바인딩은 코드에 하드코딩하지 않고 설정으로 관리합니다. 또한 관찰 모드-before-enforce 원칙을 준수하며, 모든 탐지 결과와 결정은 감사 기록에 남깁니다.

일반적인 AIOps 모델에서 채택하는 요소와 의도적으로 차별화하는 부분은 다음과 같습니다.

AIOps 능력우리의 자세
인시던트 감지 & 알림채택 - 상관관계 + 이상이 발견 사항 발행
Root-cause analysis채택 - 티어별 일급 RCA (4절)
이상 감지채택 - 통계적, 설명 가능 (2절)
예측 분석채택 - 트렌드 + 임계 예보, 불확실성 있음 (3절)
알림 노이즈 감소 / false 긍정 감소채택 - 상관관계 + 측정된 FP 비율
수동 작업 감소 / 빠른 해결채택 - 리스크 게이트된 auto-수정
감사 트레일 / 컴플라이언스채택 - 추가 전용 감사가 이미 코어
주 엔진으로서의 ML/NLP다름 - 결정론 우선; 모델은 5-10% 잔여
불투명 / black-box 이상 스코어링다름 - 설명 가능 우선; 발견 사항이 베이스라인, 편차, 방향 기록
모델이 추천 하고 실행다름 - 실행 자격은 모델이 아니라 결정론적 검증에서
벤더-플랫폼 락인다름 - CSP-중립; 관측성 플랫폼은 원격측정 소스 이지 두뇌 아님
  • 저장소가 관리하는 config/detection-governance-policy.json은 감지기 방식, 콜드 스타트 하한, 예측 대상 계열과 기간, 정확한 상관관계 키와 창, 백테스트 승격 임계값, 변경 창 처리 방식을 고정합니다. Core는 core/detection/governance_policy.py를 통해 필드가 정확한지 검증하며 정책을 로드하므로 알 수 없는 방식, 중복 신원, 완화된 정책 이탈 0건 가드 또는 잘못된 경계값이 있으면 시작을 실패 처리합니다. 현재 실행 가능한 연결은 예측 대상 섹션을 강제합니다. 각 FDAI_FORECAST_TARGETS_JSON 항목은 관리되는 target_kind를 지정하며, 시작 과정은 정책과 다른 기간 또는 신뢰수준과 정책을 완화하는 샘플 또는 적합도 하한을 거부합니다. 이상 감지, 상관관계, 승격, 변경 창 섹션은 기존 고정 evaluator를 위한 검토된 구성 계약입니다. 이 범위는 해당 섹션의 별도 런타임 재정의 연결을 구현했다고 주장하지 않습니다.
  • 베이스라인, 편차 임계, 예보 지평, 상관관계 키, 모델 바인딩은 설정; 포크는 project-structure-ko.md 의 DI 경계로 오버라이드, 절대 코어를 편집하지 않음.
  • 감지기는 시작 시 설정을 검증하고 실패 시 차단 - 깨진 감지기, 부족한/콜드스타트 베이스라인, stale 원격측정은 false 발견 사항 발행 이나 auto-act가 아니라 감지기 판단 보류 하게 함.
  • Repeated-event 인시던트 정책은 startup-bound 런타임 Settings입니다. incident.auto_open.enabled(기본 true), incident.auto_open.min_severity(기본 medium), incident.repeat_threshold(기본 5, 범위 2-100), incident.repeat_window_seconds(기본 300, 범위 10-86400), incident.security_high_threshold(기본 5, 범위 1-100), incident.security_window_events(기본 100, 범위 1-10000), incident.alert_rate_per_hour(기본 5, 범위 1-1000)를 사용합니다. 잘못된 값은 시작을 실패시킵니다. 심각도는 critical/high/medium/low/info에서 SEV1-SEV5로 결정론적으로 매핑하며 조립은 모든 후보를 고정 심각도로 바꾸지 않습니다. 기본 정책은 반복 및 근거 조건을 충족한 중간 심각도의 지속적인 감지 에피소드부터 수용합니다. 낮음 및 정보 심각도 에피소드는 설치 환경에서 최소 심각도를 명시적으로 낮추지 않는 한 보류합니다.
  • 감지 발견 사항은 신뢰할 수 없는 입력; 어떤 LLM 사용(퍼지 상관관계, T2 RCA)도 quality 게이트 (architecture.instructions.md) 와 security-and-identity-ko.md 의 프롬프트-인젝션 위협 모델을 통과.
  • 감지기 메트릭 발행 - fire 비율, false-positive 비율, false-negative/놓친-위반 비율, 판단 보류 및 콜드스타트 억제 카운트, 예보 lead 시간, RCA groundedness - 를 KPI 대시보드로.

스케줄러 전달 경로는 정본 멱등 Event를 구성된 Event Hubs 유입 토픽에 게시합니다. 분석기 Terraform 작업은 fdai.delivery.analyzer_tick_cli를 호출하며, 이 진입점은 구성된 대상 목록과 영속 인벤토리 projection에서 대상을 해석하고 조립된 MetricProvider로 참조 분석기를 실행한 뒤 리소스, 신호, 발견된 문제 관측의 1분 게시 버킷에서 파생된 키로 발견 건마다 정본 Event 하나를 게시합니다. 기본 5분 분석 구간은 재시도에 안정적인 게시 신원과 독립적입니다. 인벤토리 기반 해석은 읽기 전용이며 실패 시 차단합니다.

fdai-incident-evidence-query 유지관리 진입점은 서비스가 소유한 저장소에서 영속 Incident 감사를 읽습니다. 범위가 제한된 상관관계 접두사 하나에 대해 전이 수, 고유 Incident 수, 최대 구성원 수, 종류별 집계만 반환하며 Incident ID, 구성원 ID, 페이로드, 데이터베이스 구성은 반환하지 않습니다. fdai-forecast-evidence-query 유지관리 진입점은 반복 읽기 격리 수준의 예측 상태 스냅샷을 반환합니다. 명시적인 에피소드 분모를 포함하며, 평가 가능한 분모가 없으면 비율은 null입니다. 이 스냅샷은 근거 전용이며 승격 권한을 부여하지 않습니다.

검토된 분석기 매핑이 없는 리소스 유형은 건너뛰고, 오래됨, 충돌, 부분, 합성 관측 상태 사실은 안정된 사유와 함께 건너뛰며, projection을 읽지 못하면 구성된 목록만으로 축소하지 않고 예외를 올려 작업이 재시도합니다. Resolver는 이전 flat metadata 형식과 현재 속성별 collection 형식에서 canonical generic state 사실만 허용하며 다른 속성별 사실로 대체하지 않습니다. Generic state 사실이 없는 metadata collection은 신원 및 유형 전용 열거 경로를 따릅니다. 이 읽기 전용 선택은 상태를 주장하거나 권한을 부여하지 않습니다. 존재하는 generic state에는 admission이 계속 필요하며 형식이 잘못되면 사용할 수 없습니다. 상태 사실 없이 투영된 리소스도 같은 열거 경로를 따릅니다. 발견된 대상 수는 상한이 있고 순서는 결정론적입니다. 공급자 I/O 전에 현재 연결된 텔레메트리 카탈로그가 참조 분석기에 필요한 모든 메트릭을 제공하지 못하면 해석기는 발견된 대상을 telemetry_source_unavailable로 보류합니다. 후보는 보류 coverage에 남고 공급자 쿼리는 전송되지 않습니다. 명시적으로 구성한 대상은 선언된 실패 동작을 유지하고, 연결된 공급자에서 발생한 오류도 계속 틱을 실패 처리합니다. 해석기는 검토된 분석기 Resource 유형을 저장소 쿼리 필터로 적용하고, 구성된 분석 가능 대상 상한을 적용하기 전에 관계를 제외한 지원 Resource를 최대 1,000개 읽습니다. 관련 없는 인벤토리 레코드는 조회 구간이나 대상 슬롯을 차지할 수 없고 관계 coverage 공백은 신원 전용 대상 선택을 무효화하지 않습니다. 지원 Resource 구간이 잘렸거나 Resource 출처가 불완전하면 일부 coverage를 정상으로 보이지 않고 틱을 실패시키며 대상 검색을 사용 불가로 보고합니다. 이 작업들은 변경을 실행하지 않으며, 발견된 문제와 예정 작업은 공유 trust router 및 안전성 검토에 다시 진입합니다. 분석기 누락, 공급자 분석 오류, 게시 실패 또는 증적 저장 실패가 발생하면 예약 항목은 재시도 가능 상태로 유지되고 작업 결과는 0이 아닌 값입니다. 일부 대상만 처리된 결과를 정상 실행으로 보고하지 않습니다. 추적 상태와 재시도에도 유지되는 명시적 실행 신원 또는 Container Apps 작업 실행 신원이 구성된 경우 완료된 각 실행은 대상 해석 수, 발견된 문제의 발행, 추적 연속성 결과, 준비 상태를 포함한 내용 다이제스트 기반 runtime:analyzer-tick-receipt: 레코드 하나도 보존합니다. 같은 내용의 재시도는 no-op입니다. 안정적인 작업 실행 ID는 상위 신원이고 각 직렬 실행은 안정적인 tick 순번을 가지며 보고서 다이제스트는 시도 신원입니다. 내용이 달라진 재시도는 이전 실패와 복구 근거가 충돌하지 않도록 별도의 내용 기반 시도로 보존하고, 이후의 동일한 tick도 첫 tick 증적으로 축약하지 않습니다. 각 증적은 항상 execution_authority: false를 포함합니다. 안정적인 실행 신원이 없는 로컬 실행은 운영 증적을 만들지 않습니다. 보호된 분리 서비스 배포는 다이제스트로 고정된 GHCR OCI 대상을 통해 provenance, SBOM, Core 모델 자료 증명을 검증합니다. 따라서 비공개 배포 runner가 관련 없는 공개 Blob DNS에 의존하지 않습니다. 보호된 plan-observability-* 및 apply-observability-* 요청 계열은 analyzer Container Apps Job의 광범위한 선행 조건 그래프가 아니라 state 전용 Terraform updater 하나만 대상으로 합니다. Updater는 digest로 고정된 ACR image와 고정된 Job/container 이름 하나만 허용합니다. Apply는 해당 image를 갱신하고 권위 있는 readback을 검증하며, 검증이 실패하면 이전 digest를 복원합니다. 원래 Container Apps Job 리소스가 선언적 소유자로 유지되므로 updater는 다른 Job 속성을 소유하지 않고 같은 구성 image로 수렴합니다.

Azure 리소스 생성, 갱신, 삭제 신호는 정본 Event Hubs 유입을 통해 계속 흐릅니다. Huginn은 이 실시간 발견 유입을 소유하고 정규화된 Event에 리소스 신원, 변경 종류, 범위가 제한된 속성을 보존합니다. 전용 projector는 partition 순서에 따라 리소스, 링크, tombstone delta를 durable inventory overlay에 적용합니다. 완전한 ARG/ARM reconciliation은 별도의 범위가 제한된 완전성 증명으로 유지하지만, 목표 정책은 고정된 6시간 최신성 cadence 대신 이를 적응형으로 실행합니다. Durable lag, 변경량, 최대 노후 시간, 요청 예산, 공급자 throttling, 범위가 제한된 backoff, circuit 상태가 다음 작업을 결정합니다. Heimdall은 stale snapshot, cursor lag, 대체 경로 spike, 범위 loss, 공급자 압력을 감지합니다. 최신성 조회가 없거나 degraded 또는 stale이면 graph-dependent 작업을 사람 검토로 보냅니다. Inventory 기반 준비 상태 probe는 발견 성공을 단정하지 않고 해당 최신성 상태를 보존하며 Heimdall은 관찰기로 유지됩니다. 진행 시 다시 설정되는 무진행 마감과 절대 상한은 계속 batch를 내는 느린 원본을 종료하지 않으면서 멈춘 원본을 실패시킵니다. 전체 수집, 보존, rollup, archive 계약은 지속형 운영 인스턴스 그래프에 정의됩니다.

결정관리되는 기본값
신호 클래스별 이상 방식정상성이 있는 안정성 및 보안 활동 신호는 z-score를 사용합니다. 주기적인 안정성 및 비용 신호는 명시적인 위상을 가진 seasonal z-score를 사용합니다.
예측 계열과 기간현재 대상은 모두 구현된 선형 추세 계열을 사용합니다. 용량은 24시간, 복제 지연은 1시간, 비용은 7일, 만료는 30일을 사용합니다.
상관관계정확한 correlation_id 및 resource_ref 키를 T1보다 먼저 사용합니다. Analyzer 발견된 문제 게시에는 재시도에도 안정적인 60초 신원을 사용하고 추적 및 반복 구간은 300초입니다. Fuzzy T1에는 0.85 이상의 유사도와 공유 근거 필드 2개가 필요합니다.
콜드 스타트정상성이 있는 클래스에는 기준선 샘플 30개, 계절 클래스에는 같은 위상의 샘플 10개가 필요합니다. 예측에는 샘플 5개와 R-squared >= 0.5가 필요합니다.
백테스트 및 승격최소 14일의 관찰 모드와 점수화 가능한 에피소드 30개를 확보한 뒤 매주 평가합니다. 정밀도와 재현율은 각각 0.8 이상이어야 하고, 90% 구간 포괄률은 [0.85, 0.95], 중앙값 선행 시간은 300초 이상, 판단 보류율은 0.2 이하, 정책 이탈은 0건이어야 합니다.
변경 창완전한 근거가 있는 정확한 범위의 활성 창은 발견된 문제에 주석을 남기고 Incident 승격을 보류합니다. 누락되거나 오래되었거나 불완전하거나 일치하지 않는 창 근거는 발견된 문제를 억제할 수 없습니다.
알아볼 내용읽을 문서
구현 상태 및 남은 작업구현 원장