Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds a new "Logs" tab to the experiment details page, allowing users to view audit logs specific to a particular experiment. The implementation includes both backend and frontend changes to filter audit logs by experiment ID and display them in a timeline format with search and filtering capabilities.
Changes:
- Backend adds optional
experimentIdparameter to the audit logs API endpoint - Frontend implements experiment-specific log storage in NgRx store using a map indexed by experimentId
- New standalone components for displaying experiment logs with timeline view, search, and pagination
Reviewed changes
Copilot reviewed 28 out of 28 changed files in this pull request and generated 18 comments.
Show a summary per file
| File | Description |
|---|---|
| backend/packages/Upgrade/src/api/controllers/LogController.ts | Added experimentId parameter to audit logs endpoint documentation and implementation |
| backend/packages/Upgrade/src/api/controllers/validators/AuditLogParamsValidators.ts | Added validation for optional experimentId UUID parameter |
| backend/packages/Upgrade/src/api/services/AuditService.ts | Updated service methods to accept and pass experimentId filter |
| backend/packages/Upgrade/src/api/repositories/ExperimentAuditLogRepository.ts | Implemented experimentId filtering in database queries using JSON field extraction |
| frontend/.../logs.actions.ts | Added new actions for experiment-specific log fetching and filtering |
| frontend/.../logs.reducer.ts | Implemented state management for experiment logs stored by experimentId |
| frontend/.../logs.selectors.ts | Added selectors for accessing experiment-specific log state |
| frontend/.../logs.model.ts | Added ExperimentLogsMetadata interface and updated AuditLogParams |
| frontend/.../logs.effects.ts | Implemented effect handlers for fetching experiment-specific logs |
| frontend/.../logs.service.ts | Added service methods for experiment log operations |
| frontend/.../common-section-card-search-header/* | Enhanced search header to support grouped filter options |
| frontend/.../experiment-overview-details-footer/* | Added "Logs" tab to experiment details navigation |
| frontend/.../experiment-log-section-card/* | New component for displaying experiment logs with search and pagination |
| frontend/.../experiment-logs-timeline/* | New timeline component for rendering log entries |
| frontend/.../experiment-log-diff-display/* | New component for displaying log diffs in expandable panels |
| frontend/.../pipes/* | New standalone pipes for formatting log dates and messages |
| frontend/.../experiment-details-page-content.* | Integrated logs tab into experiment details page |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
frontend/projects/upgrade/src/app/core/logs/store/logs.effects.ts
Outdated
Show resolved
Hide resolved
...nt-details-page-content/experiment-log-section-card/experiment-log-section-card.component.ts
Show resolved
Hide resolved
frontend/projects/upgrade/src/app/core/logs/store/logs.model.ts
Outdated
Show resolved
Hide resolved
...experiment-log-section-card/experiment-logs-timeline/experiment-logs-timeline.component.html
Outdated
Show resolved
Hide resolved
...t/experiment-log-section-card/experiment-logs-timeline/experiment-logs-timeline.component.ts
Outdated
Show resolved
Hide resolved
...experiment-log-section-card/experiment-logs-timeline/experiment-logs-timeline.component.html
Outdated
Show resolved
Hide resolved
...experiment-log-section-card/experiment-logs-timeline/experiment-logs-timeline.component.html
Outdated
Show resolved
Hide resolved
...experiment-log-section-card/experiment-logs-timeline/experiment-logs-timeline.component.html
Outdated
Show resolved
Hide resolved
...experiment-log-section-card/experiment-logs-timeline/experiment-logs-timeline.component.html
Outdated
Show resolved
Hide resolved
...-details-page-content/experiment-log-section-card/experiment-log-section-card.component.html
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 31 out of 33 changed files in this pull request and generated 5 comments.
Files not reviewed (1)
- frontend/package-lock.json: Language not supported
Comments suppressed due to low confidence (1)
frontend/projects/upgrade/src/app/features/dashboard/logs/logs.module.ts:13
LogsModuleno longer declaresLogDateFormatPipe, but templates in this module still use| logDateFormatPipe(e.g.audit-logs.component.html/error-logs.component.html). SinceLogDateFormatPipeis non-standalone, it must be declared in this module or exported from an imported module (e.g.SharedModule) to avoid a template compilation error.
import { SharedModule } from '../../../shared/shared.module';
import { ErrorLogsComponent } from './components/error-logs/error-logs.component';
import { AuditLogsComponent } from './components/audit-logs/audit-logs.component';
import { TimelineComponent } from './components/timeline/timeline.component';
import { ErrorLogPipe } from './pipes/error-log.pipe';
import { ExperimentActionMessage } from './pipes/experiment-action-message.pipe';
import { LogsComponent } from './root/logs.component';
import { LogsRoutingModule } from './logs-routing.module';
import { ListOperationsMessage } from './pipes/list-operation-message.pipe';
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
...-details-page-content/experiment-log-section-card/experiment-log-section-card.component.html
Outdated
Show resolved
Hide resolved
...t/experiment-log-section-card/experiment-logs-timeline/experiment-logs-timeline.component.ts
Outdated
Show resolved
Hide resolved
.../components/common-section-card-search-header/common-section-card-search-header.component.ts
Show resolved
Hide resolved
backend/packages/Upgrade/src/api/repositories/ExperimentAuditLogRepository.ts
Show resolved
Hide resolved
|
putting this into draft, i discovered i need to actually make this generalizable so that we can use this component for feature flags also (and/or segments). |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 37 out of 39 changed files in this pull request and generated 12 comments.
Files not reviewed (1)
- frontend/package-lock.json: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
...-audit-log-timeline/common-audit-log-diff-display/common-audit-log-diff-display.component.ts
Show resolved
Hide resolved
...-component-lib/components/common-audit-log-timeline/common-audit-log-timeline.component.html
Show resolved
Hide resolved
backend/packages/Upgrade/src/api/repositories/ExperimentAuditLogRepository.ts
Show resolved
Hide resolved
...nt-details-page-content/experiment-log-section-card/experiment-log-section-card.component.ts
Show resolved
Hide resolved
backend/packages/Upgrade/src/api/repositories/ExperimentAuditLogRepository.ts
Outdated
Show resolved
Hide resolved
.../components/common-section-card-search-header/common-section-card-search-header.component.ts
Show resolved
Hide resolved
8b85547 to
8a97756
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 37 out of 39 changed files in this pull request and generated 6 comments.
Files not reviewed (1)
- frontend/package-lock.json: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
...-component-lib/components/common-audit-log-timeline/common-audit-log-timeline.component.html
Show resolved
Hide resolved
...-component-lib/components/common-audit-log-timeline/common-audit-log-timeline.component.html
Outdated
Show resolved
Hide resolved
.../components/common-section-card-search-header/common-section-card-search-header.component.ts
Show resolved
Hide resolved
...-details-page-content/experiment-log-section-card/experiment-log-section-card.component.html
Show resolved
Hide resolved
...nt-details-page-content/experiment-log-section-card/experiment-log-section-card.component.ts
Show resolved
Hide resolved
...-details-page-content/experiment-log-section-card/experiment-log-section-card.component.scss
Outdated
Show resolved
Hide resolved
8a97756 to
925661a
Compare
|
@danoswaltCL I've opened a new pull request, #2991, to work on those changes. Once the pull request is ready, I'll request review from you. |
5f24e15 to
1389054
Compare
1389054 to
b976728
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 38 out of 40 changed files in this pull request and generated 4 comments.
Files not reviewed (1)
- frontend/package-lock.json: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
backend/packages/Upgrade/src/api/repositories/ExperimentAuditLogRepository.ts
Outdated
Show resolved
Hide resolved
| getExperimentLogs$ = createEffect(() => | ||
| this.actions$.pipe( | ||
| ofType(logsActions.actionGetExperimentLogs), | ||
| withLatestFrom(this.store$.pipe(select(selectExperimentLogsState))), | ||
| map(([action, experimentLogsState]) => ({ | ||
| experimentId: action.experimentId, | ||
| fromStart: action.fromStart || false, | ||
| metadata: experimentLogsState[action.experimentId], | ||
| })), | ||
| filter(({ metadata, fromStart }) => { | ||
| if (fromStart) return true; | ||
| if (!metadata || metadata.total === null) return true; | ||
| return metadata.skip < metadata.total; | ||
| }), | ||
| mergeMap(({ experimentId, fromStart, metadata }) => { | ||
| const skip = fromStart ? 0 : metadata?.skip || 0; | ||
| const filter = metadata?.filter || null; | ||
|
|
||
| let params: AuditLogParams = { | ||
| skip, | ||
| take: NUMBER_OF_LOGS, | ||
| experimentId, | ||
| }; | ||
|
|
||
| if (filter) { | ||
| params = { ...params, filter }; | ||
| } | ||
|
|
||
| return this.logsDataService.getAllAuditLogs(params).pipe( | ||
| map((data: any) => | ||
| logsActions.actionGetExperimentLogsSuccess({ | ||
| experimentId, | ||
| auditLogs: data.nodes, | ||
| totalAuditLogs: data.total, | ||
| fromStart, | ||
| }) | ||
| ), | ||
| catchError(() => [logsActions.actionGetExperimentLogsFailure({ experimentId })]) | ||
| ); | ||
| }) | ||
| ) | ||
| ); |
There was a problem hiding this comment.
New behavior was added in getExperimentLogs$ / changeExperimentLogFilter$, but there are no corresponding unit tests (the existing logs.effects.spec.ts covers other effects but has no coverage for experiment-specific logs). Add tests that verify: (1) experimentId is included in the request params, (2) pagination short-circuits when skip >= total, and (3) actionSetExperimentLogFilter triggers a refetch fromStart.
.../components/common-section-card-search-header/common-section-card-search-header.component.ts
Show resolved
Hide resolved
b976728 to
23e87c5
Compare
|
Do you want to resolve or ignore Copilot's comments? |
? I've been resolving and ignoring many copilot comments. |
|
I meant there's still one opened review comment from Copilot for this PR. It would be nice if you hide it or click "Resolve conversation" so that it's clear no more changes will be added to this PR. |
|
the comment is about adding unit tests, which i ought to do, so i left it open, but that shouldn't keep anyone from reviewing, it's ready. |

SO...
The main new backend functionality here is fetching audit logs by adding the optional
experimentIdto the existing /audit endpoint.The main new frontend functionality (other than adding the new tab) is that when the experiment-specific logs are received, we will save these experiment-specific logs + metadata (skip, filter, take, total) in a map on the
logsstore by experimentId:*** FOLLOW-UPS ***
This is an initial component to get something in there, it's intentionally left ugly, we can sculpt it as we go and make some decisions:
NOTE: because we have a mix of standalone and non-standalone components, it was awkward to try and re-use the "pipes" that are used here, so they are basically duplicated as standalones. these too are a little messy and will need the same attention, but they will do the trick for now.