💰 A-Coin & 랜덤박스 대시보드
Kibana 데이터 분석 설계서
8
차트 요청
5
Lens 바로 가능
1
매핑 확인 필요
2
Transform 필요
🗄️ ES 인덱스 구조
| 용도 | 인덱스 패턴 | 핵심 필드 |
|---|---|---|
| A-Coin / NP / 데이터조각 | asset-release-log |
chargeFreeACoin, chargePaidACoin, useFreeACoin, usePaidACoin, chargeNormalMatter, chargeRareMatter, userLevel, reason |
| 랜덤박스 오픈 | random-box-release-log |
randomBoxId, gainType, itemCode, itemType, amount, userNum |
| ER 패스 XP/레벨 | er-point-release-log |
erPassId, erPassLv, gainERPoint, totalERPoint, gainType, paid |
| NP (참고) | np-release-log |
reason, delta, total, userLevel |
| 드롭스 코인 | drops-coin-release-log |
chargeDropsCoin, useDropsCoin, totalDropsCoin |
📊 차트별 상세 설계
1
A-Coin 일별 획득/소비량
✅ Lens 가능
📈 Line 그래프 | 유저 레벨 필터
인덱스: asset-release-log
Lens 설정
- X축:
@timestampdate_histogram (1일 간격) - 획득:
sum(chargeFreeACoin) + sum(chargePaidACoin) - 소비:
sum(useFreeACoin) + sum(usePaidACoin) - 필터: Dashboard control —
userLevelrange (1~999)
2
A-Coin 누적 획득/소비량
✅ Lens 가능
📈 Line 그래프 | Cumulative Sum
인덱스: asset-release-log
Lens 설정
- X축:
@timestampdate_histogram (1일) - 누적 획득:
cumulative_sum(sum(chargeFreeACoin) + sum(chargePaidACoin)) - 누적 소비:
cumulative_sum(sum(useFreeACoin) + sum(usePaidACoin))
📌 Lens cumulative_sum() formula 지원으로 바로 구현 가능
3
개인상점 랜덤박스 구매 카운트
⚠️ 매핑 확인
📊 Bar 스택형 | 5개 박스 유형
인덱스: asset-release-log (reason 기반 필터)
개인상점에서 박스 구매 시 A-Coin이 차감되며, reason 필드로 구분:
확인된 구매 reason
PURCHASE_DROPS_COIN_Sercret_Drops_Box→ 스데박 (41,666건)PURCHASE_LOOTBOX_SKIN_SINGLE_01→ 스킨 루트박스 (6,530건)PERSONAL_SHOP_PRODUCT→ 개인상점 일반 (221,425건)
연데박, 일반/고급 시즌 조각팩의 정확한
reason 값 매핑이 필요합니다.
현재 asset 로그에서 PURCHASE_ 패턴 50개를 확인했으나, 어떤 것이 연데박/시즌 조각팩인지 게임 마스터 데이터 참조 필요.
4
박스 오픈 카운트 (누적 + 유니크 유저)
✅ Lens 가능
📊 Bar 스택형 | 2개 차트 (누적 / 유니크)
인덱스: random-box-release-log
5번과 동일 내용이므로 통합 (범례에 정식 이름 표기)
| randomBoxId | 이름 (추정) | 오픈 카운트 |
|---|---|---|
3108002 | 데일리 박스 | 316만 |
3102004 | 스킨데이터박스 (스데박) | 223만 |
3102002 | 연구소데이터박스 (연데박) | 111만 |
누적 카운트 Lens
- 스데박:
count(kql='randomBoxId: 3102004') - 연데박:
count(kql='randomBoxId: 3102002') - 데일리:
count(kql='randomBoxId: 3108002')
유니크 유저 Lens
- 스데박:
unique_count(userNum, kql='randomBoxId: 3102004') - 연데박:
unique_count(userNum, kql='randomBoxId: 3102002') - 데일리:
unique_count(userNum, kql='randomBoxId: 3108002')
randomBoxId→박스이름 매핑 확인 필요. 위 ID는 doc count 기반 추정입니다.
5
스데박/연데박/데일리 박스 오픈 (정식명)
→ 4번 통합
4번 차트의 범례명을 정식 명칭으로 표기하여 통합:
스킨데이터박스(스데박) / 연구소데이터박스(연데박) / 데일리 박스
6
데이터 조각 사용/획득량
✅ Lens 가능
📈 Line 그래프 | 일반 + 희귀
인덱스: asset-release-log
4개 시리즈
- 일반 조각 획득:
sum(chargeNormalMatter) - 일반 조각 사용:
sum(useNormalMatter) - 희귀 조각 획득:
sum(chargeRareMatter) - 희귀 조각 사용:
sum(useRareMatter)
📌 가장 단순한 차트 — 필드 4개 sum만 하면 완료
7
A-Coin 비율 계산기
🔧 Transform 필요
🧮 계산기 | 유저별 보유량 → 백분위
인덱스: asset-release-log → Transform → asset-user-acoin-latest
"X A-Coin을 보유한 유저는 전체의 몇 %인가?"를 계산하는 도구
구현 방법
- ES Transform: userNum별 최신
totalFreeACoin + totalPaidACoin추출 - Transform 결과 인덱스에서
percentile_ranksaggregation - 기간 필터:
@timestamp범위 (최근 갱신 기록 기준)
구현 옵션
- 옵션 A: Transform + Lens percentile histogram (추천)
- 옵션 B: CF Worker API + 커스텀 UI (er-stats-tool 스타일)
🔑 핵심: "유저별 마지막 로그의 total 값" → Transform이 필수
8
ER 패스 레벨 분포
🔧 Transform 필요
📋 표 | 시즌별 레벨 구간 유저 수
인덱스: er-point-release-log → Transform → er-pass-user-level
데이터 구조
erPassId= 시즌 (19=S19, 18=S18, 1028/1027=특별 패스)erPassLv= 패스 레벨 (최대 80)paid= 유료 패스 여부
Transform 설계
- Group by:
userNum+erPassId - Aggregation:
max(erPassLv),max(totalERPoint),max(paid) - 결과 인덱스에서 레벨 구간별 (0-10, 11-20, ..., 71-80) 유저 수 datatable
🗓️ 구현 계획
Phase 1
바로 구현
확인 없이 Lens로 바로 만들 수 있는 차트
📊 #1, #2, #6
Phase 2
매핑 확인 후
randomBoxId / reason 매핑 확인 필요
📊 #3, #4/5
Phase 3
Transform 생성
ES Transform → 새 인덱스 → Lens 연결
📊 #7, #8
| # | 차트 | Lens | Transform | 확인 필요 |
|---|---|---|---|---|
| 1 | A-Coin 일별 획득/소비 | ✅ | — | — |
| 2 | A-Coin 누적 | ✅ | — | — |
| 3 | 개인상점 박스 구매 | ⚠️ | — | reason 매핑 |
| 4/5 | 박스 오픈 (누적+유니크) | ✅ | — | boxId 매핑 |
| 6 | 데이터 조각 사용/획득 | ✅ | — | — |
| 7 | A-Coin 비율 계산기 | ❌ | ✅ | — |
| 8 | ER 패스 레벨 분포 | ❌ | ✅ | — |
✋ MJ 확인 필요 사항
1
randomBoxId 매핑 확인
시즌 조각팩:
3102004=스데박? 3102002=연데박? 3108002=데일리?시즌 조각팩:
3199011, 3199012, 3199014, 3199015는 각각 어떤 종류?
2
개인상점 구매 reason 값 확인
연데박, 일반/고급 시즌 조각팩 각각의 reason 값은?
PURCHASE_DROPS_COIN_Sercret_Drops_Box = 스데박 맞는지?연데박, 일반/고급 시즌 조각팩 각각의 reason 값은?
3
4번과 5번 통합 여부
동일 데이터에 범례명만 다르므로 1개 차트로 통합 제안 — OK?
동일 데이터에 범례명만 다르므로 1개 차트로 통합 제안 — OK?