-
Notifications
You must be signed in to change notification settings - Fork 3
feat: add more spans, events, and attributes #220
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR expands OpenTelemetry instrumentation across backend utilities and route handlers by adding spans, events, and richer attributes (often with masking) to improve observability of auth, email, ticketing, registration, referral, webhook, calendar, and Turnstile flows.
Changes:
- Added spans/events/status reporting around key route handlers (public + admin) and several utility operations.
- Enriched span attributes with domain identifiers/counts and added masking for some sensitive identifiers.
- Added additional tracing around Turnstile validation, magic-link auth, Google Sheets export/auth, and email sending.
Reviewed changes
Copilot reviewed 24 out of 24 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| backend/utils/google-sheets.ts | Adds tracing around Google Sheets auth and export steps with events/attributes. |
| backend/utils/email.ts | Adds additional tracing attributes for email flows (registration confirmation, invitation code, campaign). |
| backend/routes/system.ts | Adds a tracing span for the health route. |
| backend/routes/public/tickets.ts | Adds tracing span + ticket attributes/events for public ticket lookup. |
| backend/routes/public/smsVerification.ts | Adds tracing spans/events/attributes across SMS verification send/verify/status flows. |
| backend/routes/public/registrations.ts | Adds richer tracing throughout registration create/list/get/update/cancel flows. |
| backend/routes/public/referrals.ts | Adds tracing spans/events/attributes for referral link/stats/validation flows and parses localized ticket name. |
| backend/routes/public/invitationCodes.ts | Adds tracing spans/events/attributes (including masking) for invitation code verify/info endpoints. |
| backend/routes/public/events.ts | Adds tracing spans/events/attributes for event info/tickets/list/stats/form-fields endpoints. |
| backend/routes/public/calendar.ts | Adds tracing span around calendar generation and propagates span into generator. |
| backend/routes/public/auth.ts | Adds tracing for auth permissions endpoint with status/events. |
| backend/routes/admin/webhooks.ts | Adds tracing across webhook CRUD, testing, failed-delivery listing and retry. |
| backend/routes/admin/users.ts | Adds tracing across admin user list/get/update routes. |
| backend/routes/admin/tickets.ts | Adds tracing across ticket CRUD, listing, analytics, and reorder endpoints. |
| backend/routes/admin/smsVerificationLogs.ts | Adds tracing for SMS verification log listing + aggregate stats. |
| backend/routes/admin/registrations.ts | Adds tracing for registration list/get/update/export/delete and Google Sheets sync. |
| backend/routes/admin/referrals.ts | Adds tracing across referral admin endpoints (overview/leaderboard/tree/qualified/draw/stats). |
| backend/routes/admin/invitationCodes.ts | Adds tracing across invitation code CRUD, bulk create, and send-email endpoints. |
| backend/routes/admin/events.ts | Adds tracing across admin event CRUD and list endpoints. |
| backend/routes/admin/eventFormFields.ts | Adds tracing across event form field CRUD/list/reorder endpoints. |
| backend/routes/admin/eventDashboard.ts | Adds tracing span + attributes for event dashboard analytics endpoint. |
| backend/routes/admin/emailCampaigns.ts | Adds tracing across email campaign list/create/preview/calc recipients/send/cancel endpoints. |
| backend/lib/turnstile.ts | Adds tracing spans/events/attributes around Turnstile validation + retry logic. |
| backend/lib/auth.ts | Adds tracing around magic-link sending/rate-limiting + related attributes/events. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
Copilot reviewed 24 out of 24 changed files in this pull request and generated 4 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
9b1c1ba to
54e1beb
Compare
現在的 tracing 資訊少到完全不夠用來 debug,所以請 Claude Code 搭配人類 review 補了一大堆上去。
建議使用結構化 diff 工具來 review,GitHub 的 diff 不能正確判讀 try-block 的情況:
# 需要先安裝 difftastic: https://difftastic.wilfred.me.uk git -c diff.external=difft show --ext-diffTracing Attributes Reference (V2)
本文件記錄後端所有 OpenTelemetry spans 及其 attributes 的完整清單。
目錄
認證相關 (Auth)
auth.send_magic_link檔案: lib/auth.ts
登入魔法連結發送流程。
Attributes:
auth.email.masked(string): 遮罩後的 email (格式:XX***@domain.com)auth.token.length(number): token 長度auth.method(string): 固定值"magic_link"auth.ip.masked(string, conditional): 遮罩後的 IP 地址 (前 8 碼 +***)auth.locale(string): 語系 (zh-Hant,en,zh-Hans)magic_link_attempt.id(string, conditional): 嘗試記錄 IDEvents:
auth.rate_limit.check_start: 開始檢查速率限制auth.rate_limit.throttled: 達到速率限制reason: 限制原因 (recent_attempt_30s,failed_attempts_limit,daily_login_limit,ip_daily_limit)count(conditional): 失敗次數或每日登入次數auth.rate_limit.attempt_recorded: 記錄嘗試auth.rate_limit.transaction_conflict: 交易衝突auth.url_parse_error: URL 解析錯誤auth.email.send_start: 開始發送 emailauth.email.send_complete: Email 發送完成route.public.auth.get_permissions檔案: routes/public/auth.ts
取得使用者權限資訊。
Attributes:
auth.authenticated(boolean): 是否已認證auth.user.id(string, conditional): 使用者 IDauth.user.role(string, conditional): 使用者角色auth.permissions.count(number, conditional): 權限數量Events:
auth.permissions.no_session: 無 sessionauth.permissions.user_not_found: 找不到使用者邀請碼相關 (Invitation Codes)
route.invitation_codes.verify檔案: routes/public/invitationCodes.ts
驗證邀請碼是否有效。
Attributes:
invitation_code.masked(string): 遮罩的邀請碼 (格式:XX****XX)ticket.id(string): 票券 IDevent.id(string, conditional): 活動 IDinvitation_code.id(string, conditional): 邀請碼 IDinvitation_code.usage_count(number, conditional): 已使用次數invitation_code.usage_limit(number, conditional): 使用上限 (-1 表示無限制)available_tickets.count(number): 可用票券數量Events:
validation.failed: 驗證失敗error.reason:missing_required_fieldsticket.lookup: 查詢票券validation.result: 驗證結果result:invalid_ticket,code_not_found,expired,not_yet_valid,usage_limit_exceeded,validvalid_until(conditional): 過期時間valid_from(conditional): 生效時間tickets.lookup: 查詢票券列表route.invitation_codes.get_info檔案: routes/public/invitationCodes.ts
取得邀請碼詳細資訊。
Attributes:
invitation_code.masked(string): 遮罩的邀請碼ticket.id(string): 票券 IDinvitation_code.id(string, conditional): 邀請碼 IDinvitation_code.usage_count(number, conditional): 已使用次數invitation_code.usage_limit(number, conditional): 使用上限Events:
invitation_code.lookup: 查詢邀請碼invitation_code.not_found: 找不到邀請碼validation.result: 驗證結果result:expired,not_yet_valid,usage_limit_exceeded,validroute.admin.invitation_codes.create檔案: routes/admin/invitationCodes.ts
建立新邀請碼 (Admin)。
Attributes:
invitation_code.code.masked(string): 遮罩的邀請碼invitation_code.ticket_id(string): 票券 IDinvitation_code.id(string, conditional): 建立後的邀請碼 IDticket.id(string, conditional): 票券 IDevent.id(string, conditional): 活動 IDEvents:
invitation_code.checking_existing: 檢查是否已存在invitation_code.already_exists: 邀請碼已存在invitation_code.creating: 建立邀請碼invitation_code.created: 建立成功route.admin.invitation_codes.get檔案: routes/admin/invitationCodes.ts
取得邀請碼詳細資訊 (Admin)。
Attributes:
invitation_code.id(string): 邀請碼 IDticket.id(string, conditional): 票券 IDevent.id(string, conditional): 活動 IDinvitation_code.code.masked(string, conditional): 遮罩的邀請碼invitation_code.used_count(number, conditional): 已使用次數Events:
invitation_code.fetching: 取得邀請碼invitation_code.not_found: 找不到邀請碼route.admin.invitation_codes.update檔案: routes/admin/invitationCodes.ts
更新邀請碼 (Admin)。
Attributes:
invitation_code.id(string): 邀請碼 IDticket.id(string, conditional): 票券 IDinvitation_code.existing.used_count(number, conditional): 現有使用次數Events:
invitation_code.fetching_existing: 取得現有邀請碼invitation_code.not_found: 找不到邀請碼invitation_code.checking_code_conflict: 檢查邀請碼衝突invitation_code.code_conflict: 邀請碼衝突invitation_code.updating: 更新邀請碼invitation_code.updated: 更新成功route.admin.invitation_codes.delete檔案: routes/admin/invitationCodes.ts
刪除邀請碼 (Admin)。
Attributes:
invitation_code.id(string): 邀請碼 IDticket.id(string, conditional): 票券 IDinvitation_code.used_count(number, conditional): 已使用次數Events:
invitation_code.fetching: 取得邀請碼invitation_code.not_found: 找不到邀請碼invitation_code.has_been_used: 邀請碼已被使用invitation_code.deleting: 刪除邀請碼invitation_code.deleted: 刪除成功route.admin.invitation_codes.list檔案: routes/admin/invitationCodes.ts
列出邀請碼清單 (Admin)。
Attributes:
invitation_codes.has_user_permissions(boolean): 使用者是否有特定權限invitation_codes.count(number): 邀請碼數量Events:
invitation_codes.fetching: 取得邀請碼列表invitation_codes.fetched: 取得成功route.admin.invitation_codes.bulkCreate檔案: routes/admin/invitationCodes.ts
批次建立邀請碼 (Admin)。
Attributes:
invitation_codes.bulk.count(number): 批次數量invitation_codes.bulk.ticket_id(string): 票券 IDticket.id(string): 票券 IDevent.id(string, conditional): 活動 IDinvitation_codes.created_count(number): 實際建立數量Events:
invitation_codes.checking_ticket: 檢查票券invitation_codes.ticket_not_found: 找不到票券invitation_codes.generating_codes: 生成邀請碼invitation_codes.generation_failed: 生成失敗invitation_codes.creating_batch: 批次建立invitation_codes.batch_created: 批次建立成功route.admin.invitation_codes.sendEmail檔案: routes/admin/invitationCodes.ts
發送邀請碼 Email (Admin)。
Attributes:
invitation_code.email.recipient.masked(string): 遮罩的收件人 emailinvitation_code.code.masked(string): 遮罩的邀請碼invitation_code.id(string, conditional): 邀請碼 IDticket.id(string, conditional): 票券 IDevent.id(string, conditional): 活動 IDinvitation_code.event_id(string, conditional): 活動 ID (重複)invitation_code.ticket_id(string, conditional): 票券 ID (重複)Events:
invitation_code.fetching: 取得邀請碼invitation_code.not_found: 找不到邀請碼invitation_code.sending_email: 發送 emailinvitation_code.email_sent: Email 發送成功推薦相關 (Referrals)
route.admin.referrals.overview檔案: routes/admin/referrals.ts
推薦機制總覽統計 (Admin)。
Attributes:
referrals.total_count(number): 總推薦數referrals.conversion_rate(number): 轉換率referrals.top_referrers_count(number): 前幾名推薦者數量Events:
referrals.fetching_stats: 取得統計資料referrals.fetching_top_referrers: 取得排行榜route.admin.referrals.leaderboard檔案: routes/admin/referrals.ts
推薦排行榜 (Admin)。
Attributes:
referrals.leaderboard.limit(number): 限制筆數referrals.leaderboard.count(number): 實際回傳筆數Events:
referrals.fetching_leaderboard: 取得排行榜referrals.leaderboard_fetched: 取得成功route.admin.referrals.tree檔案: routes/admin/referrals.ts
推薦樹狀圖 (Admin)。
Attributes:
referrals.tree.registration_id(string): 報名 IDregistration.id(string, conditional): 推薦 IDEvents:
referrals.fetching_tree: 取得推薦樹referrals.registration_not_found: 找不到報名記錄referrals.building_tree: 建立樹狀結構referrals.tree_built: 建立成功route.admin.referrals.qualified檔案: routes/admin/referrals.ts
達標推薦者名單 (Admin)。
Attributes:
referrals.qualified.min_referrals(number): 最小推薦數referrals.qualified.total_count(number): 總數referrals.qualified.filtered_count(number): 篩選後數量Events:
referrals.fetching_qualified: 取得達標者referrals.qualified_filtered: 篩選完成route.admin.referrals.draw檔案: routes/admin/referrals.ts
推薦者抽獎 (Admin)。
Attributes:
referrals.draw.min_referrals(number): 最小推薦數referrals.draw.count(number): 抽選人數referrals.draw.eligible_count(number): 符合資格人數referrals.draw.actual_count(number): 實際抽選人數Events:
referrals.fetching_candidates: 取得候選人referrals.no_eligible_candidates: 無符合資格者referrals.performing_draw: 執行抽選referrals.draw_completed: 抽選完成route.admin.referrals.stats檔案: routes/admin/referrals.ts
推薦統計報表 (Admin)。
Attributes:
referrals.stats.usage_count(number): 推薦碼使用次數referrals.stats.total_registrations(number): 總報名數referrals.stats.conversion_rate(number): 轉換率referrals.stats.top_sources_count(number): 熱門來源數量Events:
referrals.fetching_usage_data: 取得使用資料referrals.calculating_daily_stats: 計算每日統計referrals.fetching_registration_count: 取得報名數referrals.calculating_top_sources: 計算熱門來源referrals.stats_calculated: 統計完成route.referrals.get_referral_link檔案: routes/public/referrals.ts
取得推薦連結。
Attributes:
registration.id.masked(string): 遮罩的報名 IDregistration.id(string, conditional): 報名 IDregistration.status(string, conditional): 報名狀態event.id(string, conditional): 活動 IDreferral.id(string, conditional): 推薦 IDreferral.code(string, conditional): 推薦碼Events:
referral.fetch_registration: 取得報名記錄referral.fetch_existing: 取得現有推薦碼referral.generate_code: 生成推薦碼referral.create: 建立推薦碼route.referrals.get_referral_stats檔案: routes/public/referrals.ts
取得個人推薦統計。
Attributes:
registration.id.masked(string): 遮罩的報名 IDuser.authenticated(boolean): 是否已認證user.id(string, conditional): 使用者 IDreferral.id(string, conditional): 推薦 IDreferral.total_count(number): 推薦總數referral.successful_count(number): 成功推薦數Events:
auth.check_session: 檢查 sessionreferral.fetch: 取得推薦碼referral.fetch_usages: 取得使用記錄route.referrals.validate_referral檔案: routes/public/referrals.ts
驗證推薦碼。
Attributes:
referral.code(string): 推薦碼event.id(string): 活動 IDreferral.id(string, conditional): 推薦 IDreferral.registration_status(string, conditional): 報名狀態Events:
referral.validate: 驗證推薦碼報名相關 (Registrations)
route.public.registrations.create檔案: routes/public/registrations.ts
建立新報名。
Attributes:
registration.email.masked(string): 遮罩的 emailevent.id(string): 活動 IDticket.id(string): 票券 IDuser.id(string): 使用者 IDticket.sold_count(number): 已售數量ticket.quantity(number): 總數量invitation_code.id(string, conditional): 邀請碼 IDinvitation_code.used_count(number, conditional): 邀請碼已使用次數referral_code.id(string, conditional): 推薦碼 IDregistration.id(string, conditional): 報名 IDEvents:
checking_existing_registration: 檢查已存在報名user_already_registered: 已報名fetching_event_and_ticket: 取得活動和票券event.not_found: 找不到活動ticket.not_found: 找不到票券ticket.sold_out: 票券售完ticket.not_yet_on_sale: 尚未開賣ticket.saleStart: 開賣時間ticket.sale_ended: 販售結束ticket.saleEnd: 結束時間validating_required_invitation_code: 驗證必要邀請碼invitation_code.missing: 缺少邀請碼invitation_code.invalid: 無效邀請碼invitation_code.expired: 邀請碼過期invitation_code.not_yet_valid: 邀請碼尚未生效invitation_code.usage_limit_exceeded: 邀請碼達使用上限invitation_code.wrong_ticket: 邀請碼不適用此票券checking_sms_verification: 檢查簡訊驗證sms_verification.not_verified: 未完成簡訊驗證validating_referral_code: 驗證推薦碼referral_code.invalid: 無效推薦碼validating_form_data: 驗證表單資料form_validation.failed: 表單驗證失敗starting_registration_transaction: 開始交易registration_transaction.success: 交易成功registration.id: 報名 IDsending_confirmation_email: 發送確認 emailconfirmation_email.failed: Email 發送失敗dispatching_webhook: 發送 webhookwebhook.failed: Webhook 失敗transaction_error.ticket_sold_out: 交易中票券售完transaction_error.already_registered: 交易中已報名transaction_error.invitation_code_invalid: 交易中邀請碼無效transaction_error.invitation_code_limit: 交易中邀請碼達上限transaction_error.conflict: 交易衝突prisma.error_code: Prisma 錯誤碼transaction_error.duplicate_email: Email 重複route.public.registrations.list檔案: routes/public/registrations.ts
列出使用者報名清單。
Attributes:
user.id(string): 使用者 IDregistrations.count(number): 報名數量Events:
fetching_user_registrations: 取得使用者報名processing_registrations: 處理報名資料route.public.registrations.get檔案: routes/public/registrations.ts
取得單一報名詳情。
Attributes:
user.id(string): 使用者 IDregistration.id(string): 報名 IDregistration.status(string, conditional): 報名狀態event.id(string, conditional): 活動 IDticket.id(string, conditional): 票券 IDEvents:
fetching_registration: 取得報名registration.not_found: 找不到報名route.public.registrations.update檔案: routes/public/registrations.ts
更新報名資料。
Attributes:
user.id(string): 使用者 IDregistration.id(string): 報名 IDregistration.status(string, conditional): 報名狀態event.id(string, conditional): 活動 IDticket.id(string, conditional): 票券 IDEvents:
form_data.invalid: 表單資料無效fetching_registration_and_form_fields: 取得報名和表單欄位registration.not_found: 找不到報名registration.not_confirmed: 報名未確認event.already_started: 活動已開始edit_deadline.passed: 編輯截止時間已過ticket_sale.ended: 票券販售結束validating_form_data: 驗證表單資料form_validation.failed: 表單驗證失敗updating_registration: 更新報名route.public.registrations.cancel檔案: routes/public/registrations.ts
取消報名。
Attributes:
user.id(string): 使用者 IDregistration.id(string): 報名 IDregistration.status(string, conditional): 報名狀態event.id(string, conditional): 活動 IDticket.id(string, conditional): 票券 IDEvents:
fetching_registration: 取得報名registration.not_found: 找不到報名registration.not_confirmed: 報名未確認event.already_started: 活動已開始starting_cancellation_transaction: 開始取消交易cancellation_transaction.success: 取消成功sending_cancellation_email: 發送取消 emailcancellation_email.failed: Email 發送失敗dispatching_webhook: 發送 webhookwebhook.failed: Webhook 失敗transaction_error.already_cancelled: 已取消transaction_error.conflict: 交易衝突prisma.error_code: Prisma 錯誤碼route.admin.registrations.list檔案: routes/admin/registrations.ts
列出報名清單 (Admin)。
Attributes:
registrations.page(number): 頁碼registrations.limit(number): 每頁筆數registrations.filter.eventId(string): 篩選活動 IDregistrations.filter.status(string): 篩選狀態registrations.filter.userId(string): 篩選使用者 IDregistrations.total(number): 總筆數registrations.found(number): 找到筆數Events:
database.query.count: 計數查詢database.query.findMany: 查詢多筆registrations.parse: 解析報名資料route.admin.registrations.get檔案: routes/admin/registrations.ts
取得報名詳情 (Admin)。
Attributes:
registration.id(string): 報名 IDuser.id(string, conditional): 使用者 IDevent.id(string, conditional): 活動 IDticket.id(string, conditional): 票券 IDregistration.status(string, conditional): 報名狀態Events:
database.query.findUnique: 查詢單筆registration.not_found: 找不到報名registration.parse: 解析報名route.admin.registrations.update檔案: routes/admin/registrations.ts
更新報名 (Admin)。
Attributes:
registration.id(string): 報名 IDuser.id(string, conditional): 使用者 IDevent.id(string, conditional): 活動 IDticket.id(string, conditional): 票券 IDregistration.status.old(string, conditional): 舊狀態registration.status.new(string, conditional): 新狀態Events:
database.query.findUnique: 查詢單筆registration.not_found: 找不到報名registration.update.event_ended: 活動已結束database.query.update: 更新資料registration.updated: 更新成功route.admin.registrations.export檔案: routes/admin/registrations.ts
匯出報名資料 (Admin)。
Attributes:
export.format(string): 匯出格式 (csv,excel)export.filter.eventId(string): 篩選活動 IDexport.filter.status(string): 篩選狀態export.count(number): 匯出筆數export.filename(string): 檔案名稱export.size(number): 檔案大小 (bytes)Events:
database.query.findMany: 查詢多筆export.generate_csv: 生成 CSVroute.admin.registrations.delete檔案: routes/admin/registrations.ts
刪除報名 (Admin)。
Attributes:
registration.id(string): 報名 IDuser.id(string, conditional): 使用者 IDevent.id(string, conditional): 活動 IDticket.id(string, conditional): 票券 IDregistration.ticketId(string, conditional): 票券 ID (重複)Events:
database.query.findUnique: 查詢單筆registration.not_found: 找不到報名database.query.delete: 刪除資料database.query.update_ticket_count: 更新票券計數registration.deleted: 刪除成功route.admin.registrations.google_sheets_sync檔案: routes/admin/registrations.ts
同步到 Google Sheets (Admin)。
Attributes:
googlesheets.eventId(string): 活動 IDgooglesheets.url.masked(string): 遮罩的 Google Sheets URLgooglesheets.spreadsheetId(string, conditional): 試算表 IDevent.id(string, conditional): 活動 IDgooglesheets.registrations.count(number, conditional): 報名筆數Events:
googlesheets.invalid_url: URL 無效database.query.findUnique: 查詢單筆event.not_found: 找不到活動database.query.findMany: 查詢多筆googlesheets.export.start: 開始匯出googlesheets.export.failed: 匯出失敗error.message: 錯誤訊息googlesheets.export.success: 匯出成功database.query.update: 更新資料活動相關 (Events)
route.public.events.get_info檔案: routes/public/events.ts
取得活動公開資訊。
Attributes:
event.lookup_id(string): 查詢 ID (可能是 ID, slug 或短 ID)event.id(string, conditional): 活動 IDevent.slug(string, conditional): 活動 slugEvents:
event.not_found: 找不到活動route.public.events.get_tickets檔案: routes/public/events.ts
取得活動可購買票券。
Attributes:
event.lookup_id(string): 查詢 IDevent.id(string, conditional): 活動 IDtickets.count(number): 票券數量Events:
event.lookup: 查詢活動event.not_found: 找不到活動tickets.lookup: 查詢票券route.public.events.list檔案: routes/public/events.ts
列出所有活動。
Attributes:
events.filter.upcoming(boolean): 是否只顯示即將開始的活動events.count(number): 活動數量Events:
events.lookup: 查詢活動route.public.events.get_stats檔案: routes/public/events.ts
取得活動統計資訊。
Attributes:
event.lookup_id(string): 查詢 IDevent.id(string, conditional): 活動 IDstats.total_tickets(number): 總票券數stats.sold_tickets(number): 已售票券數stats.available_tickets(number): 可用票券數stats.registration_rate(number): 報名率stats.confirmed_registrations(number): 已確認報名數Events:
event.lookup: 查詢活動event.not_found: 找不到活動route.public.events.get_form_fields檔案: routes/public/events.ts
取得票券表單欄位。
Attributes:
ticket.id(string): 票券 IDevent.id(string, conditional): 活動 IDform_fields.count(number): 表單欄位數量Events:
ticket.lookup: 查詢票券ticket.not_found_or_inactive: 找不到或未啟用票券form_fields.lookup: 查詢表單欄位route.admin.events.create檔案: routes/admin/events.ts
建立活動 (Admin)。
Attributes:
event.id(string, conditional): 活動 IDEvents:
event.creating: 建立活動event.created: 建立成功route.admin.events.get檔案: routes/admin/events.ts
取得活動詳情 (Admin)。
Attributes:
event.id(string): 活動 IDevent.tickets_count(number, conditional): 票券數量event.registrations_count(number, conditional): 報名數量Events:
event.fetching: 取得活動event.not_found: 找不到活動route.admin.events.update檔案: routes/admin/events.ts
更新活動 (Admin)。
Attributes:
event.id(string): 活動 IDEvents:
event.fetching_existing: 取得現有活動event.not_found: 找不到活動event.updating: 更新活動event.updated: 更新成功route.admin.events.delete檔案: routes/admin/events.ts
刪除活動 (Admin)。
Attributes:
event.id(string): 活動 IDevent.registrations_count(number, conditional): 報名數量Events:
event.checking_registrations: 檢查報名記錄event.not_found: 找不到活動event.has_registrations: 已有報名event.deleting: 刪除活動event.deleted: 刪除成功route.admin.events.list檔案: routes/admin/events.ts
列出活動清單 (Admin)。
Attributes:
events.filter.is_active(boolean): 是否篩選啟用狀態events.has_user_permissions(boolean): 使用者是否有特定權限events.user_permissions_count(number, conditional): 使用者權限數量events.count(number): 活動數量Events:
events.fetching: 取得活動列表events.fetched: 取得成功票券相關 (Tickets)
route.public.tickets.get_public_ticket檔案: routes/public/tickets.ts
取得票券公開資訊。
Attributes:
ticket.id(string): 票券 IDticket.price(number, conditional): 價格ticket.quantity(number, conditional): 數量ticket.sold_count(number, conditional): 已售數量ticket.require_invite_code(boolean, conditional): 是否需要邀請碼ticket.require_sms_verification(boolean, conditional): 是否需要簡訊驗證ticket.available(number, conditional): 可用數量Events:
ticket.not_found_or_inactive: 找不到或未啟用票券route.admin.tickets.create檔案: routes/admin/tickets.ts
建立票券 (Admin)。
Attributes:
ticket.eventId(string): 活動 IDticket.price(number): 價格ticket.quantity(number): 數量ticket.requireInviteCode(boolean): 是否需要邀請碼ticket.hidden(boolean): 是否隱藏ticket.order(number): 排序ticket.id(string, conditional): 票券 IDEvents:
database.query.findUnique: 查詢單筆event.not_found: 找不到活動ticket.validation.invalid_date_format: 日期格式無效ticket.validation.invalid_date_range: 日期範圍無效ticket.validation.sale_end_after_event_start: 販售結束時間晚於活動開始database.query.findFirst: 查詢第一筆database.query.create: 建立資料ticket.created: 建立成功route.admin.tickets.get檔案: routes/admin/tickets.ts
取得票券詳情 (Admin)。
Attributes:
ticket.id(string): 票券 IDticket.price(number, conditional): 價格ticket.sold_count(number, conditional): 已售數量ticket.registrations.count(number, conditional): 報名數量Events:
database.query.findUnique: 查詢單筆ticket.not_found: 找不到票券route.admin.tickets.update檔案: routes/admin/tickets.ts
更新票券 (Admin)。
Attributes:
ticket.id(string): 票券 IDticket.quantity.new(number, conditional): 新數量ticket.price.new(number, conditional): 新價格Events:
database.query.findUnique: 查詢單筆ticket.not_found: 找不到票券ticket.validation.quantity_below_sold: 數量低於已售數量ticket.quantity.new: 新數量ticket.sold_count: 已售數量ticket.validation.invalid_sale_start_format: 販售開始日期格式無效ticket.validation.invalid_sale_end_format: 販售結束日期格式無效ticket.validation.invalid_sale_date_range: 販售日期範圍無效ticket.validation.sale_end_after_event_start: 販售結束時間晚於活動開始database.query.update: 更新資料ticket.updated: 更新成功route.admin.tickets.delete檔案: routes/admin/tickets.ts
刪除票券 (Admin)。
Attributes:
ticket.id(string): 票券 IDticket.registrations.count(number, conditional): 報名數量Events:
database.query.findUnique: 查詢單筆ticket.not_found: 找不到票券ticket.validation.has_registrations: 已有報名database.query.delete: 刪除資料ticket.deleted: 刪除成功route.admin.tickets.list檔案: routes/admin/tickets.ts
列出票券清單 (Admin)。
Attributes:
tickets.filter.eventId(string): 篩選活動 IDtickets.filter.isActive(string): 篩選啟用狀態tickets.found(number): 找到數量Events:
database.query.findMany: 查詢多筆tickets.calculate_availability: 計算可用性route.admin.tickets.analytics檔案: routes/admin/tickets.ts
取得票券分析 (Admin)。
Attributes:
ticket.id(string): 票券 IDticket.sold_count(number, conditional): 已售數量ticket.price(number, conditional): 價格analytics.totalSold(number): 總銷售數analytics.totalRevenue(number): 總收入analytics.availableQuantity(number): 可用數量Events:
database.query.findUnique: 查詢單筆ticket.not_found: 找不到票券database.query.analytics: 查詢分析資料analytics.calculated: 計算完成route.admin.tickets.reorder檔案: routes/admin/tickets.ts
重新排序票券 (Admin)。
Attributes:
tickets.reorder.count(number): 重新排序數量tickets.eventId(string, conditional): 活動 IDEvents:
tickets.validation.empty_list: 列表為空database.query.findMany: 查詢多筆tickets.validation.some_not_found: 部分票券找不到tickets.requested: 請求數量tickets.found: 找到數量tickets.validation.multiple_events: 多個活動events.count: 活動數量tickets.validation.duplicate_orders: 重複排序database.transaction.reorder: 交易重新排序tickets.reordered: 重新排序成功簡訊驗證 (SMS Verification)
route.sms_verification.send檔案: routes/public/smsVerification.ts
發送簡訊驗證碼。
Attributes:
auth.user.id(string): 使用者 IDsms.phone.masked(string): 遮罩的手機號碼 (格式:****XXXX)sms.locale(string): 語系sms.code.length(number): 驗證碼長度sms_verification.attempt_number(number): 當日第幾次嘗試Events:
sms_verification.unauthorized: 未授權sms_verification.turnstile_validation_start: 開始驗證 Turnstilesms_verification.turnstile_failed: Turnstile 驗證失敗reason: 失敗原因sms_verification.turnstile_validated: Turnstile 驗證成功sms_verification.invalid_phone_format: 手機號碼格式無效sms_verification.already_verified: 已驗證sms_verification.phone_in_use: 手機號碼已被使用sms_verification.rate_limit_check_start: 開始檢查速率限制sms_verification.rate_limited: 達到速率限制error: 限制訊息sms_verification.rate_limit_passed: 通過速率限制sms_verification.send_start: 開始發送簡訊sms_verification.send_complete: 簡訊發送完成sms_verification.send_failed: 簡訊發送失敗sms_verification.transaction_conflict: 交易衝突route.sms_verification.verify檔案: routes/public/smsVerification.ts
驗證簡訊驗證碼。
Attributes:
auth.user.id(string): 使用者 IDsms.phone.masked(string): 遮罩的手機號碼sms.code.length(number): 驗證碼長度Events:
sms_verification.unauthorized: 未授權sms_verification.already_verified: 已驗證sms_verification.lookup_code: 查詢驗證碼sms_verification.code_not_found: 找不到驗證碼sms_verification.code_expired: 驗證碼過期sms_verification.phone_in_use: 手機號碼已被使用sms_verification.update_verification: 更新驗證記錄sms_verification.update_user: 更新使用者route.sms_verification.get_status檔案: routes/public/smsVerification.ts
取得手機驗證狀態。
Attributes:
auth.user.id(string): 使用者 IDsms.phone_verified(boolean): 是否已驗證Events:
sms_verification.unauthorized: 未授權route.admin.sms_verification_logs.list檔案: routes/admin/smsVerificationLogs.ts
取得簡訊驗證記錄 (Admin)。
Attributes:
sms_logs.page(number): 頁碼sms_logs.limit(number): 每頁筆數sms_logs.filter.userId(string): 篩選使用者 IDsms_logs.filter.phoneNumber.masked(string): 篩選遮罩手機號碼sms_logs.filter.verified(string): 篩選驗證狀態sms_logs.total(number): 總筆數sms_logs.found(number): 找到筆數Events:
database.query.count: 計數查詢database.query.findMany: 查詢多筆sms_logs.sanitize: 清理資料route.admin.sms_verification_logs.stats檔案: routes/admin/smsVerificationLogs.ts
取得簡訊驗證統計 (Admin)。
Attributes:
sms_stats.type(string): 統計類型"aggregate"sms_stats.total_sent(number): 總發送數sms_stats.total_verified(number): 總驗證數sms_stats.total_expired(number): 總過期數sms_stats.success_rate(number): 成功率sms_stats.recent_count(number): 最近 7 天數量Events:
database.query.aggregate: 聚合查詢database.query.recent_activity: 查詢最近活動sms.send檔案: lib/sms.ts
發送簡訊 (底層)。
Attributes:
sms.recipient.masked(string): 遮罩的收件人號碼sms.message.length(number): 訊息長度sms.provider(string): 固定值"twsms"http.status_code(number): HTTP 狀態碼sms.api.code(string): API 回應碼sms.msgid(string): 訊息 IDEvents:
twsms.api.request: API 請求twsms.api.error: API 錯誤error.code: 錯誤碼error.message: 錯誤訊息sms.query_status檔案: lib/sms.ts
查詢簡訊狀態 (底層)。
Attributes:
sms.recipient.masked(string): 遮罩的收件人號碼sms.msgid(string): 訊息 IDsms.provider(string): 固定值"twsms"http.status_code(number): HTTP 狀態碼sms.api.code(string): API 回應碼sms.status.code(string): 狀態碼sms.status.text(string): 狀態文字Events:
twsms.api.status_query: 狀態查詢sms.send_verification_code檔案: lib/sms.ts
發送驗證碼簡訊 (底層)。
Attributes:
sms.recipient.masked(string): 遮罩的收件人號碼sms.type(string): 固定值"verification_code"sms.locale(string): 語系sms.code.length(number): 驗證碼長度Turnstile 驗證
turnstile.validate檔案: lib/turnstile.ts
驗證 Cloudflare Turnstile token。
Attributes:
turnstile.token.length(number): Token 長度turnstile.expected_action(string): 預期動作turnstile.expected_hostname(string): 預期主機名稱turnstile.remoteip.masked(string, conditional): 遮罩的遠端 IPhttp.status_code(number): HTTP 狀態碼turnstile.token.age_minutes(number, conditional): Token 年齡 (分鐘)Events:
turnstile.validation.invalid_token_format: Token 格式無效turnstile.validation.bypassed: 使用繞過密鑰turnstile.validation.token_too_long: Token 太長turnstile.validation.misconfigured: 設定錯誤turnstile.api.request: API 請求turnstile.validation.failed: 驗證失敗error.codes: 錯誤碼列表turnstile.validation.action_mismatch: 動作不符expected: 預期動作received: 實際動作turnstile.validation.hostname_mismatch: 主機名稱不符expected: 預期主機名稱received: 實際主機名稱turnstile.validation.token_age_warning: Token 年齡警告age_minutes: 年齡 (分鐘)turnstile.validation.timeout: 驗證逾時turnstile.validate_with_retry檔案: lib/turnstile.ts
重試驗證 Turnstile token。
Attributes:
turnstile.max_retries(number): 最大重試次數turnstile.token.length(number): Token 長度turnstile.idempotency_key(string): 冪等金鑰Events:
turnstile.retry.attempt: 重試嘗試attempt: 嘗試次數max_retries: 最大重試次數turnstile.retry.max_attempts_reached: 達到最大嘗試次數turnstile.retry.backoff: 等待重試backoff_ms: 等待時間 (毫秒)電子郵件 (Email)
email.send_magic_link檔案: utils/email.ts
發送登入魔法連結 email。
Attributes:
email.recipient.masked(string): 遮罩的收件人 emailemail.type(string): 固定值"magic_link"email.provider(string): Email 提供商 (aws-ses,mailtrap)Events:
{provider}.api.request: API 請求 (provider 為aws-ses或mailtrap)email.send_registration_confirmation檔案: utils/email.ts
發送報名確認 email。
Attributes:
email.recipient.masked(string): 遮罩的收件人 emailemail.type(string): 固定值"registration_confirmation"email.provider(string): Email 提供商event.id(string): 活動 IDticket.id(string): 票券 IDregistration.id(string): 報名 IDuser.id(string): 使用者 IDEvents:
{provider}.api.request: API 請求email.send_cancellation檔案: utils/email.ts
發送取消報名 email。
Attributes:
email.recipient.masked(string): 遮罩的收件人 emailemail.type(string): 固定值"cancellation"email.provider(string): Email 提供商Events:
{provider}.api.request: API 請求email.send_invitation_code檔案: utils/email.ts
發送邀請碼 email。
Attributes:
email.recipient.masked(string): 遮罩的收件人 emailemail.type(string): 固定值"invitation_code"email.provider(string): Email 提供商invitation_code.code(string): 邀請碼Events:
{provider}.api.request: API 請求email.calculate_recipients檔案: utils/email.ts
計算郵件收件人。
Attributes:
email.has_filters(boolean): 是否有篩選條件email.recipient_count(number): 收件人數量registration.id(string, conditional): 報名 IDemail.send_campaign檔案: utils/email.ts
發送郵件活動。
Attributes:
email.type(string): 固定值"campaign"email.provider(string): Email 提供商email.total_recipients(number): 總收件人數email.campaign.subject(string): 郵件主旨registration.id(string, conditional): 報名 IDemail.sent_count(number): 成功發送數email.failed_count(number): 失敗數Events:
campaign.batch.start: 批次開始batch.index: 批次索引batch.size: 批次大小campaign.batch.complete: 批次完成batch.index: 批次索引batch.sent: 已發送數batch.failed: 失敗數route.admin.email_campaigns.list檔案: routes/admin/emailCampaigns.ts
列出郵件活動 (Admin)。
Attributes:
pagination.page(number): 頁碼pagination.limit(number): 每頁筆數campaigns.count(number): 活動數量campaigns.total(number): 總數Events:
query.campaigns.start: 開始查詢route.admin.email_campaigns.create檔案: routes/admin/emailCampaigns.ts
建立郵件活動 (Admin)。
Attributes:
campaign.name(string): 活動名稱campaign.subject(string): 郵件主旨campaign.id(string): 活動 IDcampaign.creator_id(string): 建立者 IDcampaign.status(string): 狀態Events:
validation.failed: 驗證失敗reason:missing_contentcampaign.create.start: 開始建立route.admin.email_campaigns.get_status檔案: routes/admin/emailCampaigns.ts
取得郵件活動狀態 (Admin)。
Attributes:
campaign.id(string): 活動 IDcampaign.status(string, conditional): 狀態campaign.sent_count(number, conditional): 已發送數campaign.total_count(number, conditional): 總數Events:
query.campaign.start: 開始查詢campaign.not_found: 找不到活動route.admin.email_campaigns.preview檔案: routes/admin/emailCampaigns.ts
預覽郵件活動 (Admin)。
Attributes:
campaign.id(string): 活動 IDEvents:
query.campaign.start: 開始查詢campaign.not_found: 找不到活動query.sample_registration.start: 查詢範例報名preview.populate_sample_data: 填充範例資料route.admin.email_campaigns.calculate_recipients檔案: routes/admin/emailCampaigns.ts
計算收件人數量 (Admin)。
Attributes:
campaign.id(string): 活動 IDrecipients.count(number): 收件人數量Events:
query.campaign.start: 開始查詢campaign.not_found: 找不到活動calculate_recipients.start: 開始計算route.admin.email_campaigns.send檔案: routes/admin/emailCampaigns.ts
發送郵件活動 (Admin)。
Attributes:
campaign.id(string): 活動 IDcampaign.send_now(boolean): 是否立即發送campaign.status(string, conditional): 狀態recipients.count(number, conditional): 收件人數量campaign.sent_count(number, conditional): 已發送數campaign.total_recipients(number, conditional): 總收件人數Events:
query.campaign.start: 開始查詢campaign.not_found: 找不到活動validation.failed: 驗證失敗reason:already_sent,cancelled,no_recipientscampaign.scheduled: 已排程calculate_recipients.start: 開始計算收件人campaign.update_status_sending: 更新狀態為發送中campaign.send_emails.start: 開始發送 emailcampaign.send_emails.complete: 發送完成campaign.send_failed: 發送失敗route.admin.email_campaigns.cancel檔案: routes/admin/emailCampaigns.ts
取消郵件活動 (Admin)。
Attributes:
campaign.id(string): 活動 IDcampaign.status(string, conditional): 狀態Events:
query.campaign.start: 開始查詢campaign.not_found: 找不到活動validation.failed: 驗證失敗reason:already_sentcampaign.cancel.start: 開始取消Webhooks
route.admin.webhooks.get檔案: routes/admin/webhooks.ts
取得 webhook 設定 (Admin)。
Attributes:
event.id(string): 活動 IDwebhook.id(string, conditional): Webhook IDwebhook.isActive(boolean, conditional): 是否啟用webhook.eventTypes.count(number, conditional): 事件類型數量Events:
database.query.webhook: 查詢 webhookroute.admin.webhooks.create檔案: routes/admin/webhooks.ts
建立 webhook (Admin)。
Attributes:
event.id(string): 活動 IDwebhook.url.masked(string): 遮罩的 webhook URLwebhook.eventTypes.count(number): 事件類型數量webhook.id(string, conditional): Webhook IDvalidation.error(string, conditional): 驗證錯誤validation.field(string, conditional): 驗證欄位Events:
database.query.event: 查詢活動database.check.webhook_exists: 檢查 webhook 是否存在database.create.webhook: 建立 webhookroute.admin.webhooks.update檔案: routes/admin/webhooks.ts
更新 webhook (Admin)。
Attributes:
event.id(string): 活動 IDwebhook.url.masked(string): 遮罩的 webhook URLwebhook.id(string, conditional): Webhook IDvalidation.error(string, conditional): 驗證錯誤validation.field(string, conditional): 驗證欄位Events:
database.query.webhook: 查詢 webhookwebhook.reset_failure_tracking: 重置失敗追蹤database.update.webhook: 更新 webhookroute.admin.webhooks.delete檔案: routes/admin/webhooks.ts
刪除 webhook (Admin)。
Attributes:
event.id(string): 活動 IDwebhook.id(string, conditional): Webhook IDEvents:
database.query.webhook: 查詢 webhookdatabase.delete.webhook: 刪除 webhookroute.admin.webhooks.test檔案: routes/admin/webhooks.ts
測試 webhook (Admin)。
Attributes:
event.id(string): 活動 IDwebhook.url.masked(string): 遮罩的 webhook URLwebhook.test.success(boolean): 測試是否成功Events:
webhook.test.start: 開始測試webhook.test.failed: 測試失敗error.message: 錯誤訊息route.admin.webhooks.getFailedDeliveries檔案: routes/admin/webhooks.ts
取得失敗的 webhook 投遞 (Admin)。
Attributes:
event.id(string): 活動 IDpagination.page(number): 頁碼pagination.limit(number): 每頁筆數deliveries.total(number): 總數deliveries.returned(number): 回傳數Events:
database.query.failed_deliveries: 查詢失敗投遞route.admin.webhooks.retryDelivery檔案: routes/admin/webhooks.ts
重試失敗的 webhook 投遞 (Admin)。
Attributes:
event.id(string): 活動 IDdelivery.id(string): 投遞 IDwebhook.retry.success(boolean): 重試是否成功Events:
webhook.retry.start: 開始重試webhook.retry.not_eligible: 不符合重試資格使用者管理 (Users)
route.admin.users.list檔案: routes/admin/users.ts
列出使用者清單 (Admin)。
Attributes:
user.filter.role(string): 篩選角色user.filter.isActive(string): 篩選啟用狀態user.count(number): 使用者數量Events:
database.query.users: 查詢使用者users.transform: 轉換資料route.admin.users.get檔案: routes/admin/users.ts
取得使用者詳情 (Admin)。
Attributes:
user.id(string): 使用者 IDuser.role(string, conditional): 角色user.registrations.count(number, conditional): 報名數量user.sessions.count(number, conditional): Session 數量Events:
database.query.user: 查詢使用者route.admin.users.update檔案: routes/admin/users.ts
更新使用者 (Admin)。
Attributes:
user.id(string): 使用者 IDuser.role.new(string, conditional): 新角色validation.error(string, conditional): 驗證錯誤validation.field(string, conditional): 驗證欄位validation.validRoles(string, conditional): 有效角色列表Events:
database.query.existing_user: 查詢現有使用者database.check.email_conflict: 檢查 email 衝突database.update.user: 更新使用者表單欄位 (Form Fields)
route.admin.event_form_fields.create檔案: routes/admin/eventFormFields.ts
建立表單欄位 (Admin)。
Attributes:
event.id(string): 活動 IDfield.type(string): 欄位類型field.order(number): 排序field.required(boolean): 是否必填field.id(string, conditional): 欄位 IDEvents:
query.event.start: 開始查詢活動event.not_found: 找不到活動check.order_conflict: 檢查排序衝突validation.failed: 驗證失敗reason:order_conflictfield.create.start: 開始建立route.admin.event_form_fields.get檔案: routes/admin/eventFormFields.ts
取得表單欄位 (Admin)。
Attributes:
field.id(string): 欄位 IDfield.type(string, conditional): 欄位類型field.required(boolean, conditional): 是否必填Events:
query.field.start: 開始查詢field.not_found: 找不到欄位route.admin.event_form_fields.update檔案: routes/admin/eventFormFields.ts
更新表單欄位 (Admin)。
Attributes:
field.id(string): 欄位 IDupdate.has_order_change(boolean): 是否更新排序update.has_type_change(boolean): 是否更新類型field.event_id(string, conditional): 活動 IDEvents:
query.field.start: 開始查詢field.not_found: 找不到欄位check.order_conflict: 檢查排序衝突validation.failed: 驗證失敗reason:order_conflictfield.update.start: 開始更新route.admin.event_form_fields.delete檔案: routes/admin/eventFormFields.ts
刪除表單欄位 (Admin)。
Attributes:
field.id(string): 欄位 IDfield.event_id(string, conditional): 活動 IDfield.type(string, conditional): 欄位類型Events:
query.field.start: 開始查詢field.not_found: 找不到欄位field.delete.start: 開始刪除route.admin.event_form_fields.list檔案: routes/admin/eventFormFields.ts
列出表單欄位清單 (Admin)。
Attributes:
filter.has_event_id(boolean): 是否有篩選活動 IDfilter.event_id(string, conditional): 篩選活動 IDfields.count(number): 欄位數量Events:
query.event.start: 開始查詢活動event.not_found: 找不到活動query.fields.start: 開始查詢欄位route.admin.event_form_fields.reorder檔案: routes/admin/eventFormFields.ts
重新排序表單欄位 (Admin)。
Attributes:
event.id(string): 活動 IDfields.count(number): 欄位數量Events:
query.event.start: 開始查詢活動event.not_found: 找不到活動query.fields.verify: 驗證欄位validation.failed: 驗證失敗reason:fields_not_belong_to_event,duplicate_ordersreorder.transaction.start: 開始重新排序交易活動儀表板 (Event Dashboard)
route.admin.event_dashboard.get檔案: routes/admin/eventDashboard.ts
取得活動儀表板 (Admin)。
Attributes:
event.id(string): 活動 IDregistrations.total(number): 總報名數registrations.confirmed(number): 已確認報名數registrations.pending(number): 待處理報名數registrations.cancelled(number): 已取消報名數tickets.count(number): 票券數量revenue.total(number): 總收入referrals.total(number): 總推薦數referrals.active_referrers(number): 活躍推薦者數referrals.conversion_rate(number): 推薦轉換率Events:
query.event.start: 開始查詢活動event.not_found: 找不到活動query.registration_stats.start: 開始查詢報名統計query.tickets.start: 開始查詢票券query.registration_trends.start: 開始查詢報名趨勢query.referral_stats.start: 開始查詢推薦統計行事曆 (Calendar)
route.calendar.get_event檔案: routes/public/calendar.ts
取得活動行事曆檔案。
Attributes:
event.slug(string): 活動 slugevent.id(string, conditional): 活動 IDcalendar.size(number): 行事曆檔案大小 (bytes)Events:
calendar.generate_start: 開始生成calendar.generate_complete: 生成完成Google Sheets
google_sheets.authenticate檔案: utils/google-sheets.ts
Google Sheets 認證。
Attributes:
google_sheets.service_account.masked(string): 遮罩的服務帳號 emailEvents:
google_sheets.import_libraries: 匯入函式庫google_sheets.parse_service_account: 解析服務帳號google_sheets.create_jwt: 建立 JWTgoogle_sheets.authorize: 授權google_sheets.create_client: 建立客戶端google_sheets.export檔案: utils/google-sheets.ts
匯出到 Google Sheets。
Attributes:
google_sheets.spreadsheet_id.masked(string): 遮罩的試算表 IDgoogle_sheets.registrations_count(number): 報名筆數registration.id(string, conditional): 報名 IDgoogle_sheets.sheet_name(string): 工作表名稱google_sheets.sheet_exists(boolean): 工作表是否存在google_sheets.form_fields_count(number): 表單欄位數量google_sheets.total_columns(number): 總欄位數google_sheets.total_rows(number): 總列數Events:
google_sheets.get_client: 取得客戶端google_sheets.get_spreadsheet: 取得試算表google_sheets.create_sheet: 建立工作表google_sheets.parse_data: 解析資料google_sheets.prepare_headers: 準備標題列google_sheets.prepare_rows: 準備資料列google_sheets.clear_sheet: 清空工作表google_sheets.write_data: 寫入資料系統相關 (System)
route.system.health檔案: routes/system.ts
健康檢查端點。
Attributes: (無)
Events: (無)
總結
本文件涵蓋了後端所有的 OrpenTelemetry spans 及其 attributes。每個 span 都標註了:
此文件可作為監控、除錯和效能分析的參考依據。