Skip to content

설정 옵션 v0.5.0 ​

createDicolytics(client, options)에 전달하는 모든 옵션을 정리합니다.

전체 옵션 표 ​

옵션타입기본값설명
apiKeystring(필수)프로젝트 API 키. dk_live_... 형식.
endpointstringhttps://api.dicolytics.comAPI 기본 URL.
disabledEventsstring[][]비활성화할 자동 수집 이벤트 타입 배열.
debugbooleanfalseSDK 진단 로그를 console.warn으로 출력합니다.
snapshotIntervalMsnumber60000하트비트/서버 스냅샷 주기 (ms).
flushIntervalMsnumber5000이벤트 큐 플러시 주기 (ms).
requestTimeoutMsnumber10000HTTP 요청 타임아웃 (ms).
clusterIdnumber--멀티클러스터 환경용 클러스터 식별자.
autoCapturePromiseRejectionsbooleanfalse처리되지 않은 Promise rejection을 자동 보고합니다.

Python SDK (discord.py)

Python SDK(dicolytics)에서는 create_dicolytics(bot, **options)를 사용합니다. 모든 옵션은 snake_case입니다: api_key, disabled_events, snapshot_interval_ms, flush_interval_ms, request_timeout_ms, cluster_id, auto_capture_exceptions, debug, endpoint.

옵션 상세 ​

apiKey 필수 ​

ts
createDicolytics(client, {
  apiKey: process.env.DICOLYTICS_KEY!,
});
python
create_dicolytics(bot, api_key=os.environ["DICOLYTICS_KEY"])

프로젝트의 API 키입니다. dk_live_ 접두사로 시작합니다. HTTP 요청의 Authorization: Bearer 헤더로 전송됩니다.

apiKey가 비어 있거나 누락되면 동기적으로 TypeError를 던집니다. 이 옵션만 유일하게 예외를 발생시킵니다.

endpoint ​

ts
createDicolytics(client, {
  apiKey: '...',
  endpoint: 'https://analytics.example.com',
});
python
create_dicolytics(bot, api_key="...", endpoint="https://analytics.example.com")

API 기본 URL입니다. SDK는 POST {endpoint}/v1/events로 이벤트를 전송합니다. 대부분의 사용자는 변경할 필요 없습니다.

참고

SDK는 HTTP 301/302 리다이렉트를 따르지 않습니다. 리다이렉트가 감지되면 전송이 영구 비활성화됩니다. 반드시 최종 URL을 직접 지정하세요.

disabledEvents ​

ts
createDicolytics(client, {
  apiKey: '...',
  disabledEvents: [
    'guild_snapshot',       // 서버별 스냅샷 비활성화
    'action_message_send',  // 메시지 전송 감지 비활성화
    'event_typing_start',   // 타이핑 이벤트 비활성화
  ],
});
python
create_dicolytics(bot,
    api_key="...",
    disabled_events=[
        "guild_snapshot",       # 서버별 스냅샷 비활성화
        "action_message_send",  # 메시지 전송 감지 비활성화
        "event_typing_start",   # 타이핑 이벤트 비활성화
    ],
)

자동 수집 이벤트 중 특정 타입을 비활성화합니다. custom 타입은 비활성화할 수 없습니다 -- track()을 호출하지 않으면 됩니다.

비활성화 가능한 전체 이벤트 타입은 이벤트 레퍼런스를 참고하세요.

debug ​

ts
createDicolytics(client, {
  apiKey: '...',
  debug: true,
});
python
create_dicolytics(bot, api_key="...", debug=True)

true로 설정하면 SDK 내부 동작, 옵션 검증 결과, 전송 상태 등을 console.warn으로 출력합니다. 프로덕션에서는 끄는 것을 권장합니다.

API 키 경고는 항상 출력

debug가 false여도 잘못된 API 키 경고(401 응답)는 1회 출력됩니다.

snapshotIntervalMs ​

ts
createDicolytics(client, {
  apiKey: '...',
  snapshotIntervalMs: 120_000, // 2분마다
});
python
create_dicolytics(bot, api_key="...", snapshot_interval_ms=120_000)  # 2분마다

하트비트와 서버 스냅샷의 수집 주기를 밀리초로 지정합니다. 벽시계(wall-clock) 경계에 정렬되어 실행됩니다.

항목값
기본값60000 (60초)
최솟값10000 (10초)
벽시계 정렬이란?

예를 들어 주기가 60초이고 봇이 12:00:37에 시작하면, 첫 스냅샷은 12:01:00에 실행됩니다. 이렇게 하면 여러 샤드/클러스터의 스냅샷 시각이 자연스럽게 정렬되어 집계가 정확해집니다.

flushIntervalMs ​

이벤트 큐를 서버로 전송하는 주기입니다. 대기 이벤트가 50개에 도달해도 즉시 플러시됩니다.

항목값
기본값5000 (5초)
최솟값250 (0.25초)

참고

플러시 주기를 짧게 설정하면 네트워크 요청이 더 자주 발생합니다. 실시간성이 중요한 경우가 아니라면 기본값 5초를 유지하세요.

requestTimeoutMs ​

각 HTTP 요청의 타임아웃을 밀리초로 지정합니다. AbortController로 제어됩니다.

항목값
기본값10000 (10초)
최솟값1000 (1초)

clusterId ​

ts
createDicolytics(client, {
  apiKey: '...',
  clusterId: 0,
});
python
create_dicolytics(bot, api_key="...", cluster_id=0)

멀티클러스터 환경에서 각 클러스터를 구분하는 정수 식별자입니다 (0 ~ 32,767). 설정하면 모든 이벤트의 data.clusterId에 포함됩니다. 대시보드 상태 페이지에서 클러스터 > 샤드 계층 구조를 볼 수 있습니다.

자세한 내용은 멀티클러스터를 참고하세요.

참고

단일 프로세스로 봇을 운영한다면 이 옵션을 설정할 필요가 없습니다. shardId는 자동으로 포함됩니다.

autoCapturePromiseRejections ​

ts
createDicolytics(client, {
  apiKey: '...',
  autoCapturePromiseRejections: true,
});
python
create_dicolytics(bot, api_key="...", auto_capture_exceptions=True)

true로 설정하면 프로세스의 unhandledRejection 이벤트를 감지하여 error 타입 이벤트로 자동 보고합니다.

참고

이 옵션은 오류를 보고만 할 뿐, 프로세스를 종료하거나 예외를 삼키지 않습니다. Node.js의 기본 동작에 영향을 주지 않습니다.

옵션 검증 규칙 ​

상황동작
apiKey 누락 또는 빈 문자열TypeError 동기 예외
숫자 옵션이 최솟값 미만기본값으로 대체 (debug: true일 때 경고 로그)
clusterId가 정수가 아니거나 범위 밖무시 (debug: true일 때 경고 로그)
알 수 없는 옵션 키무시

전체 예시 ​

ts
import { Client, GatewayIntentBits } from 'discord.js';
import { createDicolytics } from '@dicolytics/discord.js';

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.GuildMembers,
  ],
});

const analytics = createDicolytics(client, {
  apiKey: process.env.DICOLYTICS_KEY!,
  debug: process.env.NODE_ENV !== 'production',
  disabledEvents: ['event_typing_start'],
  snapshotIntervalMs: 60_000,
  flushIntervalMs: 5_000,
  requestTimeoutMs: 10_000,
  autoCapturePromiseRejections: true,
});

client.login(process.env.DISCORD_TOKEN);
python
import os
import discord
from dicolytics import create_dicolytics

bot = discord.Bot()

analytics = create_dicolytics(bot,
    api_key=os.environ["DICOLYTICS_KEY"],
    debug=os.environ.get("ENV") != "production",
    disabled_events=["event_typing_start"],
    snapshot_interval_ms=60_000,
    flush_interval_ms=5_000,
    request_timeout_ms=10_000,
    auto_capture_exceptions=True,
)

bot.run(os.environ["DISCORD_TOKEN"])

Dicolytics — Discord bot analytics