sxe-overview

Sentivex Evolution Engine API

GET/sxe/overview

현황/분석 파라메트릭 집계 (TZ-aware 버킷팅, analysis plane)

현황 집계. **저장 UTC · 버킷은 서버가 tz로 계산**(date_trunc(.. AT TIME ZONE tz)). 상대범위는 TZ무관, 일별 버킷만 tz 경계. day 버킷은 bucket_start_utc(로컬 자정의 UTC) 동봉 → 클라 재계산 불필요. plane=intake(OpenSearch date_histogram time_zone)는 Phase2. SoT: docs/OVERVIEW-ANALYTICS-PLAN-2026-06-10.md.

Query parameters

rangestring

상대 범위: 24h|7d|30d|90d|today

tzstring

IANA 타임존 — 버킷 경계 기준 (예 Asia/Seoul). 미지정=UTC

group_bystring

hour|day|week|month|vendor|verdict|severity|status

metricstring

count|avg_elapsed|mttr(완료 분석 started→completed 평균 초)

planestring

analysis(Phase1) | intake(Phase2, OS — 미구현)

sourcestring | null

벤더/소스 필터 (예 crowdstrike)

Responses

200 Successful Response422 Validation Error
rangestringrequired
tzstringrequired
group_bystringrequired
metricstringrequired
planestringrequired
totalintegerrequired

범위 내 총 분석 수

bucketsOverviewBucket[]
keystringrequired

그룹 키 (day=로컬 날짜 YYYY-MM-DD · vendor=source · verdict/severity/status=값)

bucket_start_utcstring | null

day 그룹: 해당 로컬 자정의 UTC instant (클라 표시 일관용). 그 외 null

countintegerrequired

그룹 내 분석 수

valuenumberrequired

선택 metric 값 (count=건수 · avg_elapsed=평균 소요초)

cURL
curl -X GET https://see.in-bridge.com/sxe/overview?range=string&tz=string&group_by=string
JavaScript
const res = await fetch("https://see.in-bridge.com/sxe/overview", {
  method: "GET"
});
const data = await res.json();
Response 200
{
  "range": "string",
  "tz": "string",
  "group_by": "string",
  "metric": "string",
  "plane": "string",
  "total": 0,
  "buckets": [
    {
      "key": "string",
      "bucket_start_utc": "string",
      "count": 0,
      "value": 0
    }
  ]
}
GET/sxe/overview/catalog

현황 메트릭 카탈로그 — 위젯/탐색 UI 가 동적 구성

KPI 무한확장 토대. 동적 시계열 엔진 옵션 + 레지스트리 메트릭 목록 노출 → 클라(위젯/탐색)가 이 카탈로그로 차원·지표 피커를 동적 생성. 메트릭 추가=레지스트리 1줄→UI 자동. (#77)

Responses

200 Successful Response
timeseriesobjectrequired

동적 시계열 엔진(/sxe/overview) 의 group_by·metric·plane·range 옵션

metricsCatalogMetric[]

레지스트리 메트릭(/sxe/overview/metric/{key})

keystringrequired
planestringrequired
labelstringrequired
dimsstring[]

group/필터 가능 차원

colsstring[]

값 컬럼

cURL
curl -X GET https://see.in-bridge.com/sxe/overview/catalog
JavaScript
const res = await fetch("https://see.in-bridge.com/sxe/overview/catalog", {
  method: "GET"
});
const data = await res.json();
Response 200
{
  "timeseries": null,
  "metrics": [
    {
      "key": "string",
      "plane": "string",
      "label": "string",
      "dims": [
        "string"
      ],
      "cols": [
        "string"
      ]
    }
  ]
}
GET/sxe/overview/metric/{key}

레지스트리 메트릭 조회 (기존 집계 뷰 매핑)

레지스트리 메트릭 1건을 기존 집계 뷰에서 읽어 dims+cols 행으로 반환. 신규 KPI = OVERVIEW_METRICS 에 1줄 추가하면 자동 노출(코드 X). (#77)

Path parameters

keystringrequired

Responses

200 Successful Response422 Validation Error
keystringrequired
labelstringrequired
dimsstring[]
colsstring[]
rowsobject[]
cURL
curl -X GET https://see.in-bridge.com/sxe/overview/metric/{key}
JavaScript
const res = await fetch("https://see.in-bridge.com/sxe/overview/metric/{key}", {
  method: "GET"
});
const data = await res.json();
Response 200
{
  "key": "string",
  "label": "string",
  "dims": [
    "string"
  ],
  "cols": [
    "string"
  ],
  "rows": [
    null
  ]
}
GET/sxe/report/period

기간 보고서 집계 — 인입·분석·티켓 3소스 롤업 (day|week|month|quarter|year)

한 기간을 3관점으로 롤업: 인입(OS time range) + 분석(verdict/severity/status/mttr) + 티켓(type/priority). additive — 기존 overview/metric 무수정. 빈 기간=정직 빈(가짜 0 금지: OS 실패=total null, 분석/티켓 0건=빈 분포). ★sinceMs/untilMs(2026-07-04, sentivex 요청 1783166954634-0·사용자 A안 승인): 둘 다 주면 롤링 대신 [since, until) 고정 윈도로 3관점 집계(지난 일/주/월 보고서). 미지정=기존 동작 불변(하위호환).

Query parameters

granularitystring

day|week|month|quarter|year

sinceMsinteger | null

고정 윈도 시작(epoch ms, 포함) — 지난 기간 보고서(sentivex #88)

untilMsinteger | null

고정 윈도 끝(epoch ms, 배타) — sinceMs 와 쌍으로

Responses

200 Successful Response422 Validation Error
granularitystringrequired
rangestringrequired

동등 상대범위(overview 호환 라벨)

periodobjectrequired

{interval, since_utc, until_utc}

window_fixedboolean

true=sinceMs/untilMs 고정 윈도(지난 기간) — 소비측 캡션용

intakeReportIntakerequired
sourcestringrequired
availablebooleanrequired

OS 질의 성공 여부 — false 면 total=null(가짜 0 금지)

totalinteger | null

기간 내 인입 인시던트 수(성공시 정수, 실패시 null)

by_vendorReportDist[]
keystringrequired

차원 값(없으면 '(none)')

countintegerrequired
errorstring | null

OS 질의 실패 사유(있으면)

analysisReportAnalysisrequired
totalintegerrequired
completedintegerrequired

completed_at 이 채워진 분석 수

mttr_secondsnumber | null

완료 분석 started→completed 평균 초(미완료 제외, 0건이면 null)

verdictReportDist[]
keystringrequired

차원 값(없으면 '(none)')

countintegerrequired
severityReportDist[]
keystringrequired

차원 값(없으면 '(none)')

countintegerrequired
statusReportDist[]
keystringrequired

차원 값(없으면 '(none)')

countintegerrequired
ticketsReportTicketsrequired
totalintegerrequired
by_typeReportDist[]
keystringrequired

차원 값(없으면 '(none)')

countintegerrequired
by_priorityReportDist[]
keystringrequired

차원 값(없으면 '(none)')

countintegerrequired
generated_atstringrequired

응답 생성 UTC ISO

cURL
curl -X GET https://see.in-bridge.com/sxe/report/period?granularity=string&sinceMs=0&untilMs=0
JavaScript
const res = await fetch("https://see.in-bridge.com/sxe/report/period", {
  method: "GET"
});
const data = await res.json();
Response 200
{
  "granularity": "string",
  "range": "string",
  "period": null,
  "window_fixed": true,
  "intake": {
    "source": "string",
    "available": true,
    "total": 0,
    "by_vendor": [
      {
        "key": "string",
        "count": 0
      }
    ],
    "error": "string"
  },
  "analysis": {
    "total": 0,
    "completed": 0,
    "mttr_seconds": 0,
    "verdict": [
      {
        "key": "string",
        "count": 0
      }
    ],
    "severity": [
      {
        "key": "string",
        "count": 0
      }
    ],
    "status": [
      {
        "key": "string",
        "count": 0
      }
    ]
  },
  "tickets": {
    "total": 0,
    "by_type": [
      {
        "key": "string",
        "count": 0
      }
    ],
    "by_priority": [
      {
        "key": "string",
        "count": 0
      }
    ]
  },
  "generated_at": "string"
}
GET/sxe/report/compliance

컴플라이언스 보고서 집계 — OCSF(AWS) + Wazuh 표준별 준수/미준수 롤업

두 컴플라이언스 인덱스를 합산해 표준별 준수/미준수·심각도·미준수 Top 을 한 응답으로. additive — 기존 무수정. 빈/실패=정직 빈(available:false·total:null, 또는 total:0·빈 분포·rate null).

Responses

200 Successful Response
sourcestringrequired
availablebooleanrequired

OS 질의 성공 여부 — false 면 total=null(가짜 0 금지)

totalinteger | null

전체 컴플라이언스 finding 수(실패 시 null)

summaryComplianceSummaryrequired

전체 준수 요약(KPI) — total/pass/fail/na + 준수율.

totalintegerrequired
passedintegerrequired
failedintegerrequired
naintegerrequired
ratenumber | null

전체 준수율 pass/(pass+fail), 분모 0이면 null

by_statusComplianceDist[]
keystringrequired
countintegerrequired
by_severityComplianceDist[]
keystringrequired
countintegerrequired
by_standardComplianceStandard[]
keystringrequired
totalintegerrequired
passedintegerrequired
failedintegerrequired
nainteger
ratenumber | null

준수율 pass/(pass+fail), 분모 0이면 null(가짜 0 금지)

by_vendorComplianceVendor[]
keystringrequired
totalintegerrequired
passedintegerrequired
failedintegerrequired
naintegerrequired
ratenumber | null
top_failingComplianceDist[]

미준수(failed) Top 룰/타이틀

keystringrequired
countintegerrequired
errorstring | null

OS 질의 실패 사유(있으면)

generated_atstringrequired

응답 생성 UTC ISO

cURL
curl -X GET https://see.in-bridge.com/sxe/report/compliance
JavaScript
const res = await fetch("https://see.in-bridge.com/sxe/report/compliance", {
  method: "GET"
});
const data = await res.json();
Response 200
{
  "source": "string",
  "available": true,
  "total": 0,
  "summary": {
    "total": 0,
    "passed": 0,
    "failed": 0,
    "na": 0,
    "rate": 0
  },
  "by_status": [
    {
      "key": "string",
      "count": 0
    }
  ],
  "by_severity": [
    {
      "key": "string",
      "count": 0
    }
  ],
  "by_standard": [
    {
      "key": "string",
      "total": 0,
      "passed": 0,
      "failed": 0,
      "na": 0,
      "rate": 0
    }
  ],
  "by_vendor": [
    {
      "key": "string",
      "total": 0,
      "passed": 0,
      "failed": 0,
      "na": 0,
      "rate": 0
    }
  ],
  "top_failing": [
    {
      "key": "string",
      "count": 0
    }
  ],
  "error": "string",
  "generated_at": "string"
}