Skip to content
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

feat: logs v2 data fetching #2825

Merged
merged 81 commits into from
Jan 31, 2025
Merged

feat: logs v2 data fetching #2825

merged 81 commits into from
Jan 31, 2025

Conversation

ogzhanolguncu
Copy link
Contributor

@ogzhanolguncu ogzhanolguncu commented Jan 17, 2025

What does this PR do?

Fixes # (issue)

If there is not an issue for this, please create one first. This is used to tracking purposes and also helps use understand why this PR exists

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • Chore (refactoring code, technical debt, workflow improvements)
  • Enhancement (small improvements)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

How should this be tested?

  • Test A
  • Test B

Checklist

Required

  • Filled out the "How to test" section in this PR
  • Read Contributing Guide
  • Self-reviewed my own code
  • Commented on my code in hard-to-understand areas
  • Ran pnpm build
  • Ran pnpm fmt
  • Checked for warnings, there are none
  • Removed all console.logs
  • Merged the latest changes from main onto my branch with git pull origin main
  • My changes don't cause any responsiveness issues

Appreciated

  • If a UI change was made: Added a screen recording or screenshots to this PR
  • Updated the Unkey Docs if changes were necessary

Summary by CodeRabbit

Release Notes

  • New Features

    • Enhanced log filtering capabilities with new options for time range selection, including a since filter.
    • Added real-time log viewing toggle with visual feedback.
    • Introduced bookmarked filter groups for quick access to saved filter combinations.
    • Improved log search functionality with AI-powered structured search.
    • New components for datetime selection and live log switching, including DatetimePopover and LogsLiveSwitch.
    • Added loading and error states for charts and tables to improve user experience.
    • Introduced new LogsChartError and LogsChartLoading components for better error handling in charts.
    • Implemented a new LogsRefresh component for refreshing log data.
    • New useFetchTimeseries hook for fetching and formatting timeseries data.
    • Added LogsDateTime component for enhanced datetime filtering.
  • Improvements

    • Redesigned logs table and chart components with better performance and styling.
    • Updated datetime and filter controls for a more intuitive user experience.
    • Enhanced error handling and loading states in log components.
    • Improved filter parsing and serialization logic for better flexibility.
    • Streamlined the handling of query parameters for logs, including dynamic fetching of distinct paths.
    • Enhanced the useLogsQuery hook for better state management and real-time updates.
  • Bug Fixes

    • Resolved issues with log data fetching and pagination.
    • Fixed timestamp formatting and display inconsistencies.
    • Addressed various issues related to filter management and state synchronization.

Copy link

vercel bot commented Jan 17, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
dashboard ✅ Ready (Inspect) Visit Preview 6 resolved Jan 31, 2025 2:14pm
engineering ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jan 31, 2025 2:14pm
play ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jan 31, 2025 2:14pm
www ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jan 31, 2025 2:14pm

Copy link

changeset-bot bot commented Jan 17, 2025

⚠️ No Changeset found

Latest commit: d05a0c4

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Copy link
Contributor

coderabbitai bot commented Jan 17, 2025

📝 Walkthrough

Walkthrough

This pull request introduces comprehensive changes to the logs and audit components in the dashboard application. The modifications focus on enhancing the functionality, structure, and user experience of log filtering, displaying, and managing components. Key changes include updating import statements, restructuring components, introducing new hooks and utilities for log management, and improving the overall data fetching and rendering mechanisms for logs and audit logs.

Changes

File Path Change Summary
apps/dashboard/app/(app)/audit/components/filters/datepicker-with-range.tsx Updated import statement for TimeSplitInput from default to named import.
apps/dashboard/app/(app)/audit/components/filters/index.tsx Modified import for DatePickerWithRange to use a local file.
apps/dashboard/app/(app)/audit/components/filters/timesplit-input.tsx Changed export method for TimeSplitInput from default to named export.
apps/dashboard/app/(app)/audit/components/table/audit-log-table-client.tsx Introduced STATUS_STYLES constant for event type styling and updated related functions.
apps/dashboard/app/(app)/audit/components/table/columns.tsx Enhanced column properties and rendering adjustments for the audit log table.
apps/dashboard/app/(app)/audit/components/table/log-footer.tsx Updated import for RequestResponseDetails and modified styling for the description field.
apps/dashboard/app/(app)/audit/components/table/log-header.tsx Replaced icon import and modified JSX structure for improved styling.
apps/dashboard/app/(app)/audit/components/table/table-details.tsx Refactored _LogDetails component to LogDetails with simplified logic and new width constraints.
apps/dashboard/app/(app)/logs-v2/components/charts/index.tsx Removed utility functions for timestamp handling, replaced with imports and new hooks for data fetching.
apps/dashboard/app/(app)/logs-v2/components/charts/util.ts Deleted util.ts containing mock data generation functions.
apps/dashboard/app/(app)/logs-v2/components/table/logs-table.tsx Replaced generateMockLogs with useLogsQuery for fetching logs, updated props for the VirtualTable.
apps/dashboard/app/(app)/logs-v2/utils.ts Introduced new ResponseBody type and removed timeseries-related constants and types.
apps/dashboard/app/(app)/logs/components/controls/components/logs-filters/index.tsx Updated import paths for hooks and types to reflect new directory structure.
apps/dashboard/lib/trpc/routers/logs/query-logs/index.ts Updated input schema for queryLogs to use queryLogsPayload, enhanced error handling.
apps/dashboard/lib/trpc/routers/logs/query-timeseries/index.ts Changed input type for queryTimeseries to queryTimeseriesPayload, updated response structure.

Sequence Diagram

sequenceDiagram
    participant User
    participant LogsControls
    participant LogsContext
    participant LogsTable
    participant LogsQuery

    User->>LogsControls: Select filters
    LogsControls->>LogsContext: Update filters
    LogsContext->>LogsQuery: Fetch logs with new filters
    LogsQuery-->>LogsTable: Return filtered logs
    LogsTable->>User: Display updated logs
Loading

Possibly related PRs

Suggested Labels

Improvement, Needs Approval

Suggested Reviewers

  • mcstepp
  • chronark
  • perkinsjr

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

github-actions bot commented Jan 17, 2025

Thank you for following the naming conventions for pull request titles! 🙏

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (1)

120-125: 🛠️ Refactor suggestion

Add error handling and make polling interval configurable.

The real-time polling implementation needs error handling and configuration improvements.

Consider these improvements:

+const POLL_INTERVAL_MS = 2000;
+const MAX_RETRIES = 3;
+const BACKOFF_MS = 1000;

 export const LogsTable = () => {
   const { displayProperties, setSelectedLog, selectedLog, isLive } = useLogsContext();
-  const { realtimeLogs, historicalLogs, isLoading, isLoadingMore, loadMore } = useLogsQuery({
+  const { realtimeLogs, historicalLogs, isLoading, isLoadingMore, loadMore, error } = useLogsQuery({
     startPolling: isLive,
-    pollIntervalMs: 2000,
+    pollIntervalMs: POLL_INTERVAL_MS,
+    maxRetries: MAX_RETRIES,
+    backoffMs: BACKOFF_MS,
   });

+  if (error) {
+    return (
+      <div className="w-full flex justify-center items-center h-full">
+        <Empty className="w-[400px] flex items-start">
+          <Empty.Icon className="w-auto text-error-9" />
+          <Empty.Title>Error loading logs</Empty.Title>
+          <Empty.Description className="text-left">
+            {error.message}
+            <button
+              onClick={() => loadMore()}
+              className="ml-2 text-accent-11 hover:underline"
+            >
+              Retry
+            </button>
+          </Empty.Description>
+        </Empty>
+      </div>
+    );
+  }
🧹 Nitpick comments (1)
apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (1)

100-118: Add null checks and extract header text transformation.

The column generation logic could be improved for better maintainability and robustness.

Consider these improvements:

+const toTitleCase = (key: string) => 
+  key.split('_')
+    .map(word => word.charAt(0).toUpperCase() + word.slice(1))
+    .join(' ');

 const additionalColumns: Column<Log>[] = [
   "response_body",
   "request_body",
   // ...
 ].map((key) => ({
   key,
-  header: key
-    .split("_")
-    .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
-    .join(" "),
+  header: toTitleCase(key),
   width: "1fr",
   render: (log: Log) => (
     <div className="font-mono whitespace-nowrap truncate">
-      {log[key as keyof Log]}
+      {log[key as keyof Log] ?? '-'}
     </div>
   ),
 }));
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 62e635a and adbc345.

📒 Files selected for processing (1)
  • apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (1 hunks)
🧰 Additional context used
📓 Learnings (1)
apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (1)
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#2143
File: apps/dashboard/app/(app)/logs/logs-page.tsx:77-83
Timestamp: 2024-12-03T14:17:08.016Z
Learning: The `<LogsTable />` component already implements virtualization to handle large datasets efficiently.
⏰ Context from checks skipped due to timeout of 90000ms (9)
  • GitHub Check: Test Packages / Test ./packages/nextjs
  • GitHub Check: Test Packages / Test ./internal/clickhouse
  • GitHub Check: Test Packages / Test ./internal/id
  • GitHub Check: Test GO API Local / test_agent_local
  • GitHub Check: Test API / API Test Local
  • GitHub Check: Build / Build
  • GitHub Check: Test Agent Local / test_agent_local
  • GitHub Check: autofix
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (4)
apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (4)

16-63: LGTM! Well-structured type definitions and styling constants.

The styling system is well-organized, using semantic color tokens and covering all necessary states.


65-98: LGTM! Clean and focused utility functions.

The utility functions follow good practices:

  • Pure functions with clear responsibilities
  • Correct HTTP status code ranges
  • Consistent styling patterns

127-148: LGTM! Well-structured row styling logic.

The complex row styling logic is well-organized and handles all edge cases appropriately:

  • Real-time log highlighting
  • Selected state emphasis
  • Status-based styling

150-264: LGTM! Clean column definitions and informative empty state.

The implementation shows attention to detail:

  • Proper memoization of columns
  • Clear empty state messaging
  • Efficient warning icon integration

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (1)

122-125: Make polling interval configurable.

The polling interval is hardcoded to 2000ms. Consider making it configurable through environment variables or component props to allow for different requirements across environments.

+const DEFAULT_POLLING_INTERVAL = 2000;
+
 export const LogsTable = () => {
   const { displayProperties, setSelectedLog, selectedLog, isLive } = useLogsContext();
   const { realtimeLogs, historicalLogs, isLoading, isLoadingMore, loadMore } = useLogsQuery({
     startPolling: isLive,
-    pollIntervalMs: 2000,
+    pollIntervalMs: process.env.NEXT_PUBLIC_LOGS_POLLING_INTERVAL 
+      ? parseInt(process.env.NEXT_PUBLIC_LOGS_POLLING_INTERVAL, 10)
+      : DEFAULT_POLLING_INTERVAL,
   });
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between adbc345 and 07d530e.

📒 Files selected for processing (1)
  • apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (1 hunks)
🧰 Additional context used
📓 Learnings (1)
apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (1)
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#2143
File: apps/dashboard/app/(app)/logs/logs-page.tsx:77-83
Timestamp: 2024-12-03T14:17:08.016Z
Learning: The `<LogsTable />` component already implements virtualization to handle large datasets efficiently.
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: Test Packages / Test ./packages/rbac
  • GitHub Check: Test Packages / Test ./packages/nextjs
  • GitHub Check: Test Packages / Test ./packages/hono
  • GitHub Check: Test Packages / Test ./internal/clickhouse
  • GitHub Check: Test Agent Local / test_agent_local
  • GitHub Check: Test API / API Test Local
  • GitHub Check: Build / Build
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (3)
apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (3)

16-63: LGTM! Well-structured type definitions and styling constants.

The type definitions and styling constants are well-organized, using semantic color tokens and covering all necessary states.


65-98: LGTM! Clean and well-implemented utility functions.

The utility functions are pure, have clear responsibilities, and handle status codes correctly.


122-125: Consider implementing error boundaries and retry logic.

The real-time polling implementation could benefit from error boundaries and retry logic to handle network failures gracefully.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (3)

16-63: Consider enhancing type safety for HTTP status codes.

The status code handling could benefit from stronger typing to prevent potential edge cases.

+type HttpStatus = 200 | 201 | 400 | 401 | 403 | 404 | 429 | 500 | 502 | 503 | 504;
+
 type StatusStyle = {
   base: string;
   hover: string;
   selected: string;
   badge: {
     default: string;
     selected: string;
   };
   focusRing: string;
 };
 
-const getStatusStyle = (status: number): StatusStyle => {
+const getStatusStyle = (status: HttpStatus): StatusStyle => {

100-118: Consider memoizing additionalColumns and improving type safety.

The column definitions could be optimized for performance and type safety.

-const additionalColumns: Column<Log>[] = [
+const ADDITIONAL_COLUMN_KEYS = [
   "response_body",
   "request_body",
   "request_headers",
   "response_headers",
   "request_id",
   "workspace_id",
   "host",
-].map((key) => ({
+] as const;
+
+type AdditionalColumnKey = typeof ADDITIONAL_COLUMN_KEYS[number];
+
+const additionalColumns = useMemo(() => 
+  ADDITIONAL_COLUMN_KEYS.map((key: AdditionalColumnKey) => ({
   key,
   header: key
     .split("_")
     .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
     .join(" "),
   width: "1fr",
   render: (log: Log) => (
     <div className="font-mono whitespace-nowrap truncate">{log[key]}</div>
   ),
-}));
+})), []);

149-150: Document the reason for ignoring exhaustive dependencies.

The biome-ignore comment should include a more detailed explanation of why the exhaustive dependencies check is being ignored.

-  // biome-ignore lint/correctness/useExhaustiveDependencies: it's okay
+  // biome-ignore lint/correctness/useExhaustiveDependencies: selectedLog.request_id is the only dependency needed for re-rendering the columns
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 07d530e and d05a0c4.

📒 Files selected for processing (1)
  • apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (1 hunks)
🧰 Additional context used
📓 Learnings (1)
apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (1)
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#2143
File: apps/dashboard/app/(app)/logs/logs-page.tsx:77-83
Timestamp: 2024-12-03T14:17:08.016Z
Learning: The `<LogsTable />` component already implements virtualization to handle large datasets efficiently.
⏰ Context from checks skipped due to timeout of 90000ms (7)
  • GitHub Check: Test Packages / Test ./packages/rbac
  • GitHub Check: Test Packages / Test ./internal/clickhouse
  • GitHub Check: Test API / API Test Local
  • GitHub Check: Build / Build
  • GitHub Check: autofix
  • GitHub Check: Test Agent Local / test_agent_local
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (3)
apps/dashboard/app/(app)/logs/components/table/logs-table.tsx (3)

81-98: LGTM! Clean utility implementation.

The utility functions are well-implemented with clear separation of concerns and good use of composition.


241-265: LGTM! Well-implemented virtual table with real-time updates.

The implementation effectively handles:

  • Real-time log updates with proper UI feedback
  • Virtual scrolling for performance
  • Clear empty state messaging
  • Proper row selection and styling

120-126: 🛠️ Refactor suggestion

Consider implementing error handling for failed queries.

The real-time polling implementation could benefit from error handling to improve user experience.

 export const LogsTable = () => {
   const { displayProperties, setSelectedLog, selectedLog, isLive } = useLogsContext();
-  const { realtimeLogs, historicalLogs, isLoading, isLoadingMore, loadMore } = useLogsQuery({
+  const { realtimeLogs, historicalLogs, isLoading, isLoadingMore, loadMore, error } = useLogsQuery({
     startPolling: isLive,
     pollIntervalMs: 2000,
   });
+
+  if (error) {
+    return (
+      <div className="w-full flex justify-center items-center h-full">
+        <Empty className="w-[400px]">
+          <Empty.Icon />
+          <Empty.Title>Error loading logs</Empty.Title>
+          <Empty.Description>{error.message}</Empty.Description>
+          <button
+            onClick={() => loadMore()}
+            className="mt-4 px-4 py-2 bg-accent-4 text-accent-11 rounded-md hover:bg-accent-5"
+          >
+            Retry
+          </button>
+        </Empty>
+      </div>
+    );
+  }

Likely invalid or redundant comment.

@chronark chronark added this pull request to the merge queue Jan 31, 2025
Merged via the queue into main with commit 76d337a Jan 31, 2025
30 checks passed
@chronark chronark deleted the feat/logs-v2-data-fetching branch January 31, 2025 15:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants