리옵트 데이터 문서
프로젝트 워크스페이스

이벤트 스트림

수집된 원본 이벤트를 한 줄씩 읽고, 쿼리 한 줄로 걸러 하나를 열어봅니다.

이벤트 스트림은 집계되기 의 이벤트를 그대로 보는 화면이에요. 대시보드가 "몇 건인가"에 답한다면, 여기는 "그 한 건은 정확히 무엇이었나"에 답합니다. 계측이 맞는지 확인하고, 방금 보낸 이벤트가 도착했는지 보고, 이상한 행 하나를 붙잡을 때 씁니다.

진입 경로

  • /dashboard/[orgId]/[projectId]/stream
  • 이벤트의 의미(표시명·상태·전환 여부)는 데이터 카탈로그에서 정합니다.
  • 봇·격리 트래픽은 /events/traffic입니다.

화면 상태는 곧 링크

기간, 필터, 열, 펼친 행까지 전부 URL에 들어갑니다. 링크를 그대로 보내면 상대도 같은 것을 봅니다.

파라미터
?query=쿼리 한 줄 (아래 문법)
?range=기간 (15m, 1h, 24h, 7d, custom — 기본 24h)
?from=사용자 지정 기간 시작 (ISO 시각, range=custom일 때만)
?to=사용자 지정 기간 끝
?order=oldest면 오래된 순. 기본은 최신 순
?cols=표시할 열과 순서 (쉼표 구분, 최대 12개)
?selected=상세 패널을 열어 둘 행의 id
?live=1실시간 스트림 켜기 (기본 꺼짐 — 아래 크레딧 참고)
?hist=0상단 타임라인 숨기기

기간을 custom으로 잡으면 끝이 고정되므로 실시간 스트림을 쓸 수 없습니다. 끝이 정해진 창에는 그 뒤로 도착할 것이 없어서예요. 그 상태로 켜면 그렇게 말해 줍니다.

fromto를 거꾸로 준 링크는 빈 결과가 아니라 뒤집어서 읽습니다. 그건 실수지 질문이 아니니까요.

쿼리 한 줄

검색창 하나가 자유 검색과 필드 필터를 겸합니다. 화면이 띄우는 힌트가 그대로 예시입니다 (status는 문법을 보여주려고 든 이름이고, 실제 필드는 아래 목록에서 고릅니다).

path:/checkout -status:200 utm_source:* name:(signup or login)
쓰는 법
결제모든 열에서 자유 검색
path:/checkout값이 정확히 같음
path:*checkout*값에 포함됨
utm_source:*값이 있기만 하면 됨
duration>1000비교 (> >= < <=)
name:(a or b)여럿 중 하나
-country:KR앞에 -를 붙이면 제외

절끼리는 AND, 괄호 안은 OR입니다. 공백이나 괄호가 든 값은 "결제 완료"처럼 따옴표로 묶습니다. 서버가 받는 한도는 절 10개, 절마다 값 20개입니다. 그보다 길어질 질문은 저장된 세그먼트 쪽이 맞습니다.

컬럼과 속성을 같은 문법으로

path처럼 모든 이벤트가 갖는 컬럼과, SDK가 실어 보낸 속성 키를 구분해서 칠 필요가 없습니다. path:/checkoutplan:pro는 같은 종류의 절이고, 어느 쪽을 어떻게 찾을지는 화면이 알아서 정합니다.

컬럼은 name·path·profile_id·session_id·device_id·country·city·region· os·browser·device·brand·model·origin·referrer·channel_type·utm_*·duration 등이고, 필드 목록에서 검색해 고를 수도 있습니다. 처음 보이는 열은 시각·이벤트·경로·사용자·환경·위치입니다.

name:은 표시명으로도 통합니다

로그는 원본 키(purchase_completed)를 저장하지만, 카탈로그에서 "결제 완료"라고 이름 붙였다면 name:"결제 완료"로 찾을 수 있습니다. 그 이름을 쓰는 원본 키로 넓혀서 찾는 방식이에요.

두 가지가 의도적입니다.

  • 검색창 글자는 여러분이 친 그대로 남습니다. 넓히기는 쿼리를 적용할 때 일어나므로, 링크를 공유해도 원본 키가 아니라 여러분이 쓴 말이 그대로 전달됩니다.
  • 대체가 아니라 추가입니다. 어떤 이벤트의 원본 키가 다른 이벤트의 표시명과 우연히 같을 수 있어서, 둘 다 남깁니다. 한 표시명을 두 이벤트가 쓰고 있으면 둘 다 나옵니다 — 하나를 골라 조용히 버리지 않습니다.

서버가 거르는 것과 브라우저가 다시 보는 것

목록·타임라인은 서버가 걸러서 돌려줍니다. 실시간 스트림은 조금 다릅니다 — 연결에 실어 보낼 수 있는 조건이 더 좁아서, 도착한 행을 브라우저가 같은 쿼리로 한 번 더 확인합니다.

읽는 쪽에서는 이 차이를 몰라도 됩니다. 그게 요점이에요 — 목록에 안 나왔을 행이 실시간으로 흘러 들어오는 일은 없습니다.

실시간 스트림과 크레딧

기본은 꺼짐입니다. 툴바의 스트림 스위치로 켜고, 켜져 있지 않으면 중지됨이라고 표시됩니다.

연결을 유지하는 동안 분당 2 크레딧을 씁니다(realtime_minute). 스위치 옆 배지가 그 값을 그대로 보여줍니다. 켜 두고 잊는 것이 곧 비용이라, 기본을 꺼짐으로 둔 이유입니다.

목록을 위로 스크롤해 두면 새 행이 화면을 밀어내지 않고 기다립니다. 읽던 자리가 유지되고, 위에 새 이벤트 N건이 뜹니다. 누르면 따라잡습니다. 기다리는 행이 1,000건을 넘어가면 1000+로 표시하고 목록을 다시 잡습니다.

타임라인은 서버 집계라 분 단위로 갱신되지만, 그 사이 도착한 실시간 행은 마지막 막대에 더해 셉니다. 같은 화면의 두 반쪽이 같은 이벤트를 두고 다른 말을 하지 않게 하려는 것입니다.

행 하나 열어보기

행을 클릭하면 오른쪽에 상세 패널이 열립니다. ?selected=로 주소에 남으니 그 행을 그대로 링크할 수 있어요. 패널 안에서 이전/다음 행으로 이동할 수 있습니다.

  • 속성 — 이 이벤트가 실어 온 키와 값 전부. 키 옆 글리프가 값의 종류를 말합니다.
  • 딥링크 — 세션·사용자 프로필로, 예외 행이면 해당 이슈로 바로 갑니다.
  • 이벤트 이름 — 카탈로그에 표시명이 있으면 그 이름이 보이고, 눌러서 카탈로그의 그 이벤트로 갑니다.

타입 글리프는 카탈로그를 먼저 봅니다

속성 옆 글리프는 기본적으로 눈앞의 값에서 추론합니다. 그런데 값만으로는 판단이 안 되는 게 있어요 — "3"은 버전 코드일 수도 수량일 수도 있고, 둘 다 문자열로 보입니다.

그래서 카탈로그에 타입이 정해져 있으면 그쪽이 이깁니다. 누군가 내린 결정이 표본에서 짐작한 것보다 우선합니다. 카탈로그에 설명까지 적혀 있으면 키 아래에 함께 보여서, 이 키가 무슨 뜻인지 알아보려고 로그를 떠나지 않아도 됩니다.

이 조회는 행을 열었을 때만 일어납니다. 속성 키는 이벤트마다 다르므로 "모든 이벤트"로 한 번에 읽어 오면 지금 행에 없는 키까지 설명하게 되는데, 그건 아무것도 설명하지 않는 것보다 나쁩니다 — 맞는 말처럼 읽히니까요.

예외 행

$exception 이벤트는 목록에서 구분됩니다. 이름 자리에 배지와 함께 예외 타입: 메시지가 보여요 — $exception이라는 글자만 스무 줄 늘어서면 무엇이 났는지 알 수 없기 때문입니다.

배지는 두 가지입니다. try/catch 없이 올라온 것은 미처리, 코드가 잡아서 보고한 것은 에러.

셀에서 … 만 보기 / … 제외를 쓰면 메시지가 아니라 $exception으로 걸립니다. 메시지로 걸면 있지도 않은 이벤트 이름을 찾게 되니까요. 행에 색을 주는 기준도 같습니다 — 메시지에서 뽑으면 오류 하나하나가 제각각 다른 색을 갖게 됩니다.

이슈로 묶인 예외는 상세 패널의 딥링크로 /errors/[issueId] 화면에서 이어 봅니다.

저장된 필터

자주 쓰는 조사 조건은 이름을 붙여 저장할 수 있습니다. 쿼리와 열 구성이 저장되고, 기간과 열어 둔 행은 저장되지 않습니다 — 그건 "무엇을 보는가"가 아니라 "언제를 보는가"라서요.

이 목록은 브라우저에, 프로젝트별로 저장됩니다. 개인 단축키지 프로젝트 설정이 아니에요. 남에게 뷰를 건네는 방법은 여전히 URL입니다. 최대 12개까지 두면 목록이 아직 훑을 만합니다.

주의할 점

  • 실시간 스트림을 켜 두는 것은 비용입니다. 조사가 끝나면 끄세요.
  • 사용자 지정 기간에서는 실시간이 동작하지 않습니다. 위 이유를 참고하세요.
  • 한 번에 50건씩 불러옵니다. 기간 전체를 다 보여 준 뒤에는 그렇게 말해 줍니다.
  • 쿼리를 바꾸면 목록이 처음부터 다시 시작합니다. 반쯤 다른 조건으로 채워진 목록은 아무 질문에도 답하지 않으니까요.

다음 단계