Skip to content

Commit

Permalink
Beginning work on new Svelte UI (#1417)
Browse files Browse the repository at this point in the history
* Created new sveltekit project

* Added VS Code launch support for svelte.

* Added tailwind and dasiyui

* Added helpful resources

* Added models generated from swagger.

* WIP Added login page

* Updated login

* Fixed launch config and updated login styles

* WIP - login page validation work.

* Added api client.

* Added problem details

* Fixed tests

* Fixed tests

* WIP Problem details.

* Login page refactor

* Some cleanup and get events list page

* Minor

* Store token in localstorage, redirect back to page after login

* Logout page

* Added api launch config

* Fixed formatting.

* Change default proxy port to match API. Some work on OAuth login.

* Login page fixes

* Fixed login page

* Swagger fixes

* Google login working

* Adding other oauth providers

* State is google specific

* Added shared layout for auth pages.

* Few minor oauth updates

* Fixed merge build errors

* Fixed build errors

* Update deps

* Applied linting

* Regenerated models after Nullable reference types

* Added default templates

npx swagger-typescript-api generate-templates -o api-templates

* Updates to client side model generation

* Added ability to pull in fluent validation rules into swagger.

* Updated generation

* more generation improvements

* Improved code gen

* More code gen fixes

* Updated signup model validation

* code gen improvements

* Removed constructor

* Some cleanup of problem details / validation

* Updated swagger config

* WIP: MiniValidation with automatic problem details

DamianEdwards/MiniValidation#51

* Login and logout flow + dashboard with auth detection.

* Reverted some model state changes

* Reworked how api client redirects

* Added websockets and layout auth redirection

* Added samples for both paging and infinity paging

* Updated to tanstack query (other one was deprecated)

* More example resources

* Updated deps

* Added paging helpers to json response

* Updated server response types and base summary model

* Added Events Table component which supports column selection, default summaries (WIP)

* Pushed summary updates

* FetchClient changes to add middleware and make it more generic

* Add global default options to FetchClient, setup global model validator, and global middleware to redirect on 401.

* Some small fixes.

* some fetch updates

* Fixed build warnings

* Early WIP - Taillog component

* Greatly improved summaries

* some query client work

* WIP event tail log

* Always return search tokens

* Updated deps

* Added default public env file

* Conditionally turn off account creation

* Moved oauth to use env

* Added exceptionless client

* Fixed client warnings and errors by adding trace logging.

* changed file type of hook

* Fixed app login

* Fixed summary formatters

* More efficient events tail log.

* Added temporary drawer

* Added live mode, start of pager.

* Moving app base to /next, more FetchClient updates, fix unmount code for eventstail component.

* Some styling

* More style

* Conditionally render summaries

* Added new websocket message component to streamline how we listen to events

* Working on getting both client apps to run together

* Remove lint from build

* Handle fallback for /next client app

* Fixed logo

* Change URL to /next for SPA startup

* Change launchUrl to match SPA url

* Some paging updates

* Added paging summary

* Fixed paging

* Fixed paging

* Fixed the pager on mobile.

* Created generic table component (WIP)

* forward events

https://learn.svelte.dev/tutorial/event-forwarding

* Ensure json doesn't get new line inserted

* Fixed summary tests

* Fixed validation tests

* Fixed all tests

* Fixed bad auto git merge

* Fixed redirect

* Added pagination helper.

* WIP: Added column sorting

* Added column picker

* Added ability to navigate to the first page

* Fixed binding issue

* Fixed callback

* Fixed drawer

* Use store for drawer and for live view

* WIP search and filtering

* Added empty table message.

* Workaround for $$Generic

sveltejs/svelte-eslint-parser#306

* Fixed linting errors, updated deps

* Use global fetch / loading

* Updated deps

* Work arounds for slot forwarding, couldn't reuse let:variable syntax and had to use writables for page.

sveltejs/svelte#7021

* use persisted storage for events column options

* WIP events drawer

* Updated deps

* Rearranged models a bit and pulled in some models from the exceptionless client

* Added components for time formatting

* WIP: Events drawer and overview.

* Fix issue with code formatter changing line endings and causing git issues. Turn daisyui banner off.

* Parallelize build

* Events Sidebar

* Ran formatting

* Try building just exceptionless all in one image during docker build step

* Don't run client tests yet

* Try only building app docker image

* Set artifact retention

* Tweak how we start docker services

* Don't wait for docker compose

* Debug

* Try different approach

* Checkout on deploy

* Try different docker build

* Another parallel approach

* Break out deploy

* More build tweaks

* Add code coverage

* Use run-all to run multiple tasks

* Revert some CSP policy changes

* Comment out unused code to pass lint rules

* Allow http gravatar

* Add missing logo back

* increased sidebar width

* WIP - Error and Simple error stack traces

* Fixed http file

* Updated deps

* Reworked how stack traces are rendered

* removed extra whitespace.

* Whitespace formatting

* More styling fixes

* make stack trace look nicer

* Updated deps

* WIP: Clickable filters with ability to enter custom keyword filters.

* rearranged loading rendering order in component due to global loader.

* Renamed functions

* Added more search + log level component

* Fixed warning

---------

Co-authored-by: Blake Niemyjski <bniemyjski@gmail.com>
  • Loading branch information
ejsmith and niemyjski committed Oct 15, 2023
1 parent 724e6b4 commit dda5dbe
Show file tree
Hide file tree
Showing 472 changed files with 22,590 additions and 9,747 deletions.
3 changes: 3 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ indent_style = space
indent_size = 4
trim_trailing_whitespace = true

[*.json]
insert_final_newline = false

# Generated code
[*{_AssemblyInfo.cs,.notsupported.cs,AsmOffsets.cs}]
generated_code = true
Expand Down
219 changes: 193 additions & 26 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,98 +8,265 @@ env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}

jobs:
build:

version:

runs-on: ubuntu-latest
timeout-minutes: 30
outputs:
version: ${{ steps.version.outputs.version }}

steps:

- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Build Reason
env:
GITHUB_EVENT: ${{ toJson(github) }}
run: "echo ref: ${{github.ref}} event: ${{github.event_name}}"

- name: Version
id: version
run: |
dotnet tool install --global minver-cli --version 4.3.0
version=$(minver --tag-prefix v)
echo "version=$version" >> $GITHUB_OUTPUT
echo "### $version" >> $GITHUB_STEP_SUMMARY
test-api:

runs-on: ubuntu-latest
timeout-minutes: 30

steps:

- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Setup .NET Core
uses: actions/setup-dotnet@v3
with:
dotnet-version: 7.0.*
dotnet-quality: ga
- name: Build Version
run: |
dotnet tool install --global minver-cli --version 4.3.0
version=$(minver --tag-prefix v)
echo "MINVERVERSIONOVERRIDE=$version" >> $GITHUB_ENV
echo "VERSION=$version" >> $GITHUB_ENV
echo "### Version: $version" >> $GITHUB_STEP_SUMMARY
- name: Lint .NET
run: dotnet format --verify-no-changes --no-restore --verbosity diagnostic
- name: Build
run: dotnet build --configuration Release /clp:NoSummary

- name: Start Services
working-directory: docker
run: docker compose up -d elasticsearch &

- uses: actions/cache@v3
with:
path: ~/.nuget/packages
key: nuget-${{ runner.os }}-${{ hashFiles('**/packages.lock.json') }}
restore-keys: |
nuget-${{ runner.os }}-
- name: Nuget Restore
run: dotnet restore

- name: Build
run: dotnet build --no-restore --configuration Release

- name: Wait for Elasticsearch
working-directory: docker
run: docker compose up --wait elasticsearch
- name: Run Tests
run: dotnet test --configuration Release --no-build --logger GitHubActions

- name: Run .NET Tests
run: dotnet test --no-restore --no-build --configuration Release --collect:"XPlat Code Coverage" -m:1 --logger trx --results-directory coverage --logger GitHubActions

- name: Copy Coverage to Predictable Location
run: cp coverage/*/coverage.cobertura.xml coverage/coverage.cobertura.xml

- name: Code Coverage Summary Report
uses: irongut/CodeCoverageSummary@v1.3.0
with:
filename: coverage/coverage.cobertura.xml
badge: true
format: "markdown"
output: "both"

- name: Add Coverage PR Comment
uses: marocchino/sticky-pull-request-comment@v2
if: github.event_name == 'pull_request'
with:
recreate: true
path: code-coverage-results.md

- name: Write Coverage to Job Summary
run: cat code-coverage-results.md >> $GITHUB_STEP_SUMMARY

test-client:

runs-on: ubuntu-latest
timeout-minutes: 30
defaults:
run:
working-directory: ./src/Exceptionless.Web/ClientApp

steps:

- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Setup .NET Core
uses: actions/setup-dotnet@v3
with:
dotnet-version: 7.0.*
dotnet-quality: ga

- name: Cache node_modules
uses: actions/cache@v3
with:
path: |
node_modules
key: node-modules-${{ hashFiles('package-lock.json') }}

- name: Setup Node.js environment
uses: actions/setup-node@v3
with:
node-version: 18

- name: Install Npm Packages
working-directory: src/Exceptionless.Web/ClientApp
run: npm ci

- name: Lint Client
working-directory: src/Exceptionless.Web/ClientApp
run: |
npm run lint
npm run prettier:check
run: npm run lint

- name: Run Unit Tests
run: echo "npm run test:unit"

- name: Run Integration Tests
run: echo "npm run test:integration"

build-docker:

runs-on: ubuntu-latest
needs: [version]
timeout-minutes: 30
env:
VERSION: ${{needs.version.outputs.version}}

steps:

- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Set up Docker Buildx
if: "${{ env.DOCKER_USERNAME != '' }}"
uses: docker/setup-buildx-action@v2
with:
platforms: linux/amd64

- name: Build api docker image
run: |
echo "::remove-matcher owner=csc::"
docker buildx build . --target api --platform linux/amd64 --tag exceptionless/api-ci:latest --cache-from type=gha --cache-to type=gha,mode=max --load
- name: Build job docker image
run: |
echo "::remove-matcher owner=csc::"
docker buildx build . --target job --platform linux/amd64 --tag exceptionless/job-ci:latest --cache-from type=gha --cache-to type=gha,mode=max --load
- name: Build app docker image
run: |
echo "::remove-matcher owner=csc::"
docker buildx build . --target app --platform linux/amd64 --tag exceptionless/app-ci:latest --cache-from type=gha --cache-to type=gha,mode=max --load
- name: Build all-in-one docker image
run: |
echo "::remove-matcher owner=csc::"
docker buildx build . --target exceptionless --platform linux/amd64 --tag exceptionless/exceptionless-ci:latest --cache-from type=gha --cache-to type=gha,mode=max --load
- name: Build all-in-one Elasticsearch 7 docker image
if: "${{ env.DOCKER_USERNAME != '' && startsWith(github.ref, 'refs/tags/v') && github.event_name != 'pull_request' }}"
run: |
echo "::remove-matcher owner=csc::"
docker buildx build . --target exceptionless7 --platform linux/amd64 --tag exceptionless/exceptionless:latest-elasticsearch7 --cache-from type=gha --cache-to type=gha,mode=max --load
- name: Login to GitHub Container Registry
if: "${{ env.DOCKER_USERNAME != '' }}"
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Login to DockerHub
if: "${{ env.DOCKER_USERNAME != '' }}"
uses: docker/login-action@v2
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Wait for test jobs
uses: yogeshlonkar/wait-for-jobs@v0
with:
jobs: 'test-api,test-client'
interval: '2500'
ttl: '10'

- name: Publish CI Packages
if: "${{ env.DOCKER_USERNAME != '' }}"
run: |
echo "::remove-matcher owner=csc::"
# tag and push docker image
# tag and push docker images
for image in {"api","job","app","exceptionless"}; do
docker buildx build --target $image --platform linux/amd64 --output "type=image,push=true" . --tag exceptionless/$image-ci:$VERSION --tag exceptionless/$image-ci:latest --tag ghcr.io/exceptionless/exceptionless/$image:$VERSION --tag ghcr.io/exceptionless/exceptionless/$image:latest
docker image tag exceptionless/$image-ci:latest exceptionless/$image-ci:$VERSION
docker image tag exceptionless/$image-ci:latest ghcr.io/exceptionless/exceptionless/$image-ci:$VERSION
docker image tag exceptionless/$image-ci:latest ghcr.io/exceptionless/exceptionless/$image-ci:latest
docker image push --all-tags exceptionless/$image-ci
done
#docker buildx build --target exceptionless7 --platform linux/amd64 --output "type=image,push=true" . --tag exceptionless/exceptionless-ci:$VERSION-elasticsearch7 --tag exceptionless/exceptionless-ci:latest-elasticsearch7 --tag ghcr.io/exceptionless/exceptionless/exceptionless:$VERSION-elasticsearch7 --tag ghcr.io/exceptionless/exceptionless/exceptionless:latest-elasticsearch7
- name: Publish Release Packages
if: "${{ env.DOCKER_USERNAME != '' && startsWith(github.ref, 'refs/tags/v') && github.event_name != 'pull_request' }}"
run: |
# tag and push docker image
echo "::remove-matcher owner=csc::"
# tag and push docker images
# only build elasticsearch 7 all-in-one image for release builds
docker image tag exceptionless/exceptionless:latest-elasticsearch7 exceptionless/exceptionless:$VERSION-elasticsearch7
for image in {"api","job","app","exceptionless"}; do
docker buildx build --target $image --platform linux/amd64 --output "type=image,push=true" . --tag exceptionless/$image:$VERSION --tag exceptionless/$image:latest
docker image tag exceptionless/$image-ci:latest exceptionless/$image:$VERSION
docker image tag exceptionless/$image-ci:latest exceptionless/$image:latest
docker image push --all-tags exceptionless/$image
done
docker buildx build --target exceptionless7 --platform linux/amd64 --output "type=image,push=true" . --tag exceptionless/exceptionless:$VERSION-elasticsearch7 --tag exceptionless/exceptionless:latest-elasticsearch7
deploy:
if: "${{ (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) && github.event_name != 'pull_request' }}"
needs: [version,build-docker]
runs-on: ubuntu-latest
timeout-minutes: 30
env:
VERSION: ${{needs.version.outputs.version}}

steps:

- name: Install Helm
if: "${{ env.DOCKER_USERNAME != '' && github.event_name != 'pull_request' }}"
uses: azure/setup-helm@v3
with:
version: v3.11.1
version: v3.13.0

- name: Deploy Changes to Development Environment
if: "${{ env.DOCKER_USERNAME != '' && github.ref == 'refs/heads/main' && github.event_name != 'pull_request' }}"
run: |
az login --service-principal --username ${{ secrets.AZ_USERNAME }} --password ${{ secrets.AZ_PASSWORD }} --tenant ${{ secrets.AZ_TENANT }} --output none
az aks get-credentials --resource-group exceptionless-v6 --name ex-k8s-v6
sed -i "s/^appVersion:.*$/appVersion: '${VERSION}'/" ./k8s/exceptionless/Chart.yaml
helm upgrade --set "version=${VERSION}" --reuse-values --values ./k8s/ex-dev-values.yaml ex-dev --namespace ex-dev ./k8s/exceptionless
- name: Deploy Changes to Production Environment
if: "${{ env.DOCKER_USERNAME != '' && startsWith(github.ref, 'refs/tags/v') && github.event_name != 'pull_request' }}"
run: |
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ k8s/ex-prod\.yaml
*secrets*
k8s/ex-*-snapshots.yaml
node_modules
src/Exceptionless\.Web/ClientApp/dist/
src/Exceptionless\.Web/ClientApp/build/
src/Exceptionless\.Web/ClientApp.angular/dist/

*.DotSettings
4 changes: 0 additions & 4 deletions .husky/pre-commit

This file was deleted.

11 changes: 0 additions & 11 deletions .husky/task-runner.json

This file was deleted.

7 changes: 6 additions & 1 deletion exceptionless.http
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,12 @@ Hello World!

### get events

GET {{apiUrl}}/events
GET {{apiUrl}}/events?sort=date
Authorization: Bearer {{token}}

### get events with after token

GET {{apiUrl}}/events?sort=date&after=WzE2OTQxNDczMjc1NTgsIjY0ZmFhMmZmZTBhZTljMmY1YzhmZjMxYyJd
Authorization: Bearer {{token}}

###
Expand Down
1 change: 1 addition & 0 deletions k8s/ex-setup.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ $SP_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query se
$SP_SECRET=$(az ad sp credential reset --name $SP_ID --years 3 --query password -o tsv)
# store secret in 1Password (Exceptionless Azure CI Service Principal)
az aks update-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER --reset-service-principal --service-principal $SP_ID --client-secret $SP_SECRET
az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER --overwrite-existing

# delete the entire thing
az aks delete --resource-group $RESOURCE_GROUP --name $CLUSTER
Expand Down
2 changes: 1 addition & 1 deletion src/Exceptionless.Core/Jobs/CloseInactiveSessionsJob.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ protected override async Task<JobResult> RunInternalAsync(JobContext context)
continue;

sessionsToUpdate.Add(sessionStart);
if (heartbeatResult is not null)
if (heartbeatResult?.CacheKey is not null)
{
cacheKeysToRemove.Add(heartbeatResult.CacheKey);
if (heartbeatResult.Close)
Expand Down
1 change: 0 additions & 1 deletion src/Exceptionless.Core/Models/EventSummaryModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,5 @@

public record EventSummaryModel : SummaryData
{
public required string Id { get; set; }
public DateTimeOffset Date { get; set; }
}
1 change: 0 additions & 1 deletion src/Exceptionless.Core/Models/StackSummaryModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ namespace Exceptionless.Core.Models;
[DebuggerDisplay("Id: {Id}, Status: {Status}, Title: {Title}, First: {FirstOccurrence}, Last: {LastOccurrence}")]
public record StackSummaryModel : SummaryData
{
public required string Id { get; init; }
public required string Title { get; init; }
public StackStatus Status { get; init; }
public DateTime FirstOccurrence { get; init; }
Expand Down
1 change: 1 addition & 0 deletions src/Exceptionless.Core/Models/SummaryData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

public record SummaryData
{
public required string Id { get; set; }
public required string TemplateKey { get; set; }
public required object Data { get; set; }
}
Loading

0 comments on commit dda5dbe

Please sign in to comment.