Skip to content

Create Aspire.Hosting.SqlServer exports#14239

Merged
sebastienros merged 2 commits intomainfrom
sebros/sqlserverimports
Jan 30, 2026
Merged

Create Aspire.Hosting.SqlServer exports#14239
sebastienros merged 2 commits intomainfrom
sebros/sqlserverimports

Conversation

@sebastienros
Copy link
Copy Markdown
Contributor

Description

Export all Aspire.Hosting.SqlServer methods. Verified locally with a custom TypeScript apphost.

This required a change in the codegen for dev-mode since the SqlClient assembly is pinned in the source repository when using SqlServer, through health-checks reference. We now point to the same Directory.Packages.props. The JsonRPC and Protobuf references are also only generated in dev-mode so we don't need to render the <ProjectReference> package conditionally.

@sebastienros sebastienros requested review from Copilot and davidfowl and removed request for Copilot January 30, 2026 01:51
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Jan 30, 2026

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 14239

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 14239"

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Jan 30, 2026

🎬 CLI E2E Test Recordings

The following terminal recordings are available for commit c90a2e2:

Test Recording
CreateAndDeployToDockerCompose ▶️ View Recording
CreateAndDeployToDockerComposeInteractive ▶️ View Recording
CreateAndRunAspireStarterProject ▶️ View Recording
CreateAndRunJsReactProject ▶️ View Recording
CreateAndRunPythonReactProject ▶️ View Recording
CreateEmptyAppHostProject ▶️ View Recording
CreateStartAndStopAspireProject ▶️ View Recording
CreateTypeScriptAppHostWithViteApp ▶️ View Recording
DoctorCommand_WithSslCertDir_ShowsTrusted ▶️ View Recording
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted ▶️ View Recording
PsCommandListsRunningAppHost ▶️ View Recording

📹 Recordings uploaded automatically from CI run #21524583863

@davidfowl
Copy link
Copy Markdown
Contributor

Add it to the TypeScript apphsot in the playground until we have more tests

@sebastienros
Copy link
Copy Markdown
Contributor Author

I can create an apphost per component with potentially all the methods we export. In a special polyglot folder. Otherwise I am afraid of what the sample would become as we add integrations, we wouldn't even dare to start.

With that we could then think about generating the source and build all these apps in the polyglot validation scripts.
/playground/polyglot/[language]/[integration]

@davidfowl
Copy link
Copy Markdown
Contributor

That would be a LOT of projects... But maybe a good idea since we essentially do the same today

Copilot AI review requested due to automatic review settings January 30, 2026 17:26
Copy link
Copy Markdown
Contributor

Copilot AI left a 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 exports SQL Server hosting extension methods for use in TypeScript apphosts and fixes dev-mode codegen to properly handle transitive dependencies through central package management.

Changes:

  • Adds AspireExport attributes to seven SQL Server extension methods (addSqlServer, addDatabase, withDataVolume, withDataBindMount, withCreationScript, withPassword, withHostPort)
  • Implements Directory.Packages.props generation in dev mode to ensure consistent transitive dependency versions
  • Adds TypeScript playground validation app demonstrating all exported SQL Server methods

Reviewed changes

Copilot reviewed 7 out of 9 changed files in this pull request and generated no comments.

Show a summary per file
File Description
src/Aspire.Hosting.SqlServer/SqlServerBuilderExtensions.cs Adds AspireExport attributes to SQL Server extension methods with descriptive names for TypeScript interop
src/Aspire.Cli/Projects/AppHostServerProject.cs Generates Directory.Packages.props for dev mode and removes version constraints from StreamJsonRpc/Protobuf references
playground/polyglot/TypeScript/Aspire.Hosting.SqlServer/tsconfig.json TypeScript configuration for validation playground
playground/polyglot/TypeScript/Aspire.Hosting.SqlServer/package.json NPM package configuration with TypeScript and build tooling dependencies
playground/polyglot/TypeScript/Aspire.Hosting.SqlServer/package-lock.json NPM lock file ensuring reproducible builds
playground/polyglot/TypeScript/Aspire.Hosting.SqlServer/apphost.ts Comprehensive test scenarios validating all exported SQL Server methods
playground/polyglot/TypeScript/Aspire.Hosting.SqlServer/apphost.run.json Runtime configuration for the TypeScript apphost
playground/polyglot/TypeScript/Aspire.Hosting.SqlServer/.aspire/settings.json Aspire CLI settings specifying packages and SDK version
.gitignore Adds exception allowing .aspire folders in polyglot playground apps
Files not reviewed (1)
  • playground/polyglot/TypeScript/Aspire.Hosting.SqlServer/package-lock.json: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@sebastienros sebastienros merged commit e55fdbd into main Jan 30, 2026
664 of 668 checks passed
@sebastienros sebastienros deleted the sebros/sqlserverimports branch January 30, 2026 22:57
@dotnet-policy-service dotnet-policy-service bot added this to the 13.2 milestone Jan 30, 2026
/// <param name="password">The parameter used to provide the administrator password for the SQL Server resource. If <see langword="null"/> a random password will be generated.</param>
/// <param name="port">The host port for the SQL Server.</param>
/// <returns>A reference to the <see cref="IResourceBuilder{T}"/>.</returns>
[AspireExport("addSqlServer", Description = "Adds a SQL Server container resource")]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@sebastienros similar to modelcontextprotocol/csharp-sdk#899, would be nice to be able to leverage the existing C# docs for the code-gen.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think we'll end up there

radical added a commit to radical/aspire that referenced this pull request Jan 31, 2026
commit 412aad7c2b56274e75c8c5666f96c580699b03e8
Merge: 11948bc786 af0e27e
Author: Ankit Jain <radical@gmail.com>
Date:   Sat Jan 31 16:57:35 2026 -0500

    Merge remote-tracking branch 'origin/main' into test/validate-scope-scenarios

commit af0e27e
Author: David Pine <david.pine@microsoft.com>
Date:   Sat Jan 31 10:55:49 2026 -0600

    Expose doc slug in search_docs tool result so that if the LLM decides… (microsoft#14268)

    * Expose doc slug in search_docs tool result so that if the LLM decides to call get_doc it works.

    * Apply suggestions from code review

    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

    ---------

    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

commit 85fee2a
Author: James Newton-King <james@newtonking.com>
Date:   Sat Jan 31 21:44:47 2026 +0800

    Use DefaultTimeout in CLI tests (microsoft#14241)

commit 913701a
Author: dotnet-maestro[bot] <42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date:   Fri Jan 30 18:40:37 2026 -0800

    Update dependencies from https://github.com/microsoft/dcp build 0.22.2 (microsoft#14263)

    On relative base path root
    Microsoft.DeveloperControlPlane.darwin-amd64 , Microsoft.DeveloperControlPlane.darwin-arm64 , Microsoft.DeveloperControlPlane.linux-amd64 , Microsoft.DeveloperControlPlane.linux-arm64 , Microsoft.DeveloperControlPlane.linux-musl-amd64 , Microsoft.DeveloperControlPlane.windows-amd64 , Microsoft.DeveloperControlPlane.windows-arm64 From Version 0.22.1 -> To Version 0.22.2

    Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>

commit 11948bc786bb251b6dd0a7874a1c668b1a17f509
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 18:42:33 2026 -0500

    improve test selection json

commit d056f5bcb231fafe866b9626601a36baa36a53bf
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 18:37:06 2026 -0500

    improve test selection json

commit a18bafa5c539876018e1a1e51854c725974fef2c
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 18:17:36 2026 -0500

    Add NuGet-only validation scenario for packable src change

    Scenario 18 tests that changing a packable src project (Hosting.Redis)
    triggers NuGet-dependent test detection via dotnet-affected.

    Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

commit e55fdbd
Author: Sébastien Ros <sebastienros@gmail.com>
Date:   Fri Jan 30 14:57:32 2026 -0800

    Create Aspire.Hosting.SqlServer exports (microsoft#14239)

    * Create Aspire.Hosting.SqlServer exports

    * Add validation app

commit b71c1d56903297d0454998979f63f40a8ffe543b
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 17:38:24 2026 -0500

    Add NuGet-dependent test detection to TestSelector

    When a source project that produces a NuGet package (IsPackable=true) or
    archive (matching packageOrArchiveProducingProjects globs) changes, detect
    and trigger NuGet-dependent test projects (those with
    <RequiredNuGetsForTesting>true</RequiredNuGetsForTesting> in their csproj).

    - Rename <RequiresNuGets> to <RequiredNuGetsForTesting> in 3 test csprojs
    - Add packageOrArchiveProducingProjects config (schema + JSON)
    - Add NuGetDependentTestDetector analyzer with IsPackable XML parsing
    - Integrate detection as step 10 in evaluation flow
    - Populate NuGetDependentTests for RunAll/CriticalPath cases
    - Add run_nuget_tests and nuget_test_projects GitHub outputs
    - Add validation scenario 17 to validate-scenarios.sh
    - Add unit tests (225 total, all passing)

    Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

commit a5f508f
Author: Copilot <198982749+Copilot@users.noreply.github.com>
Date:   Fri Jan 30 11:58:32 2026 -0800

    Display pipeline summary info after pipeline succeeds (microsoft#13970)

    * Display pipeline summary info after pipeline succeeds

    * Fix concurrency issue

    * Use options object

    * Fix build

    * Update surface API

    ---------

    Co-authored-by: Sebastien Ros <sebastienros@gmail.com>

commit bc2d7702cd8cdac1d69ee8ed79998973954340bb
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 14:52:28 2026 -0500

    Update docs to match current TestSelector implementation

    - Fix config field names: projectMappings→sourceToTestMappings, sourcePattern→source, testPattern→test
    - Replace core category (triggerAll:true) with top-level triggerAllPaths
    - Update all example JSON snippets to match real test-selection-rules.json
    - Add missing categories (cli_e2e, endtoend, playground, polyglot) to examples
    - Fix CLI examples: --solution is required, --config is optional
    - Mark NuGet-dependent tests as planned (not yet implemented)
    - Fix file structure: remove NuGetDependencyChecker.cs, add DotNetAffectedResult.cs
    - Update testProjectPatterns examples to match real config

    Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

commit a94d0e0
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 13:59:02 2026 -0500

    Make dotnet-affected results additive to pattern-based mappings

    The union of both sources gives the most complete test coverage:
    pattern-based mappings provide precise direct matches, while
    dotnet-affected catches transitive dependencies the mappings miss.

    Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

commit 6bf7f6c
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 13:53:28 2026 -0500

    Normalize dotnet-affected test project paths to directory format

    Convert csproj file paths (tests/Foo.Tests/Foo.Tests.csproj) to
    directory paths with trailing slash (tests/Foo.Tests/) to match
    the pattern-based mapping format. This ensures proper deduplication
    when combining results from both sources.

    Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

commit 35a10e0
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 13:51:55 2026 -0500

    Normalize dotnet-affected paths from absolute to relative

    dotnet-affected returns absolute FilePath values but downstream
    consumers (glob matchers, enumerate-tests action) expect relative
    paths like "tests/Foo.Tests/Foo.Tests.csproj". Strip the working
    directory prefix to produce consistent relative paths.

    Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

commit d57670e
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 13:50:17 2026 -0500

    Fix ParseOutput to recognize dotnet-affected's FilePath JSON key

    dotnet-affected writes objects with "Name" and "FilePath" keys, but
    ParseOutput was looking for "path" and "ProjectPath". Added "FilePath"
    as the first property to check since it's the actual format.

    Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

commit 6de09d5
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 13:45:51 2026 -0500

    Fix dotnet-affected output parsing: read affected.json file instead of stdout

    dotnet-affected --format json writes results to affected.json on disk,
    not to stdout (stdout contains a human-readable table). The previous
    code parsed stdout, which yielded nearly zero projects due to truncated
    table output. Now reads the JSON file, with a stdout fallback.

    Also deletes any stale affected.json before invoking dotnet-affected
    to avoid reading outdated results.

    Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

commit a6f89bb
Author: Ankit Jain <radical@gmail.com>
Date:   Fri Jan 30 13:44:53 2026 -0500

    temp scenario 14

commit 7e6f9d8
Author: David Pine <david.pine@microsoft.com>
Date:   Fri Jan 30 12:32:53 2026 -0600

    Add unit and end-to-end tests for DocsIndexService and DocsSearchService (microsoft#14200)

    * Add unit and end-to-end tests for DocsIndexService and DocsSearchService

    - Implemented comprehensive unit tests for DocsIndexService, covering document listing, searching, and retrieval functionalities.
    - Added tests for various scenarios including empty results, case insensitivity, and error handling.
    - Created unit tests for DocsSearchService to validate search response formatting and scoring.
    - Developed end-to-end tests for MCP documentation tools, ensuring correct integration with the CLI and validation of tool outputs.
    - Included tests for tool schemas and descriptions to ensure compliance with expected formats.

    * chore: Address PR review feedback.

    * chore: Remove McpDocsE2ETests.cs file

    * Update tests/Aspire.Cli.EndToEnd.Tests/McpDocsE2ETests.cs

    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

    * fix: clarify comment in FetchDocsAsync_NullContent_ReturnsEmptyString test

    ---------

    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

commit 4b9e452
Author: Copilot <198982749+Copilot@users.noreply.github.com>
Date:   Fri Jan 30 12:04:26 2026 -0500

    Add test projects for CodeGeneration.Go/Java/Rust to Aspire.slnx (microsoft#14244)

    * Initial plan

    * Add test projects for CodeGeneration.Go/Java/Rust to Aspire.slnx

    Co-authored-by: radical <1472+radical@users.noreply.github.com>

    ---------

    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: radical <1472+radical@users.noreply.github.com>

commit 3f163aa
Author: Kieron Lanning <kieronlanning@users.noreply.github.com>
Date:   Fri Jan 30 15:05:45 2026 +0000

    Fix PostgreSQL v18+ data volume path (microsoft#14202)

    PostgreSQL 18+ changed the default data directory from /var/lib/postgresql/data
    to /var/lib/postgresql. This commit updates WithDataVolume and WithDataBindMount
    to automatically detect the PostgreSQL version from the container image tag and
    use the appropriate data directory path.

    - Added GetPostgresDataDirectoryPath helper method
    - Added TryParsePostgresMajorVersion helper method
    - Updated WithDataVolume to use version-aware path
    - Updated WithDataBindMount to use version-aware path
    - Added comprehensive unit tests for version parsing and path selection

    Fixes microsoft#13792

commit b9d318e
Author: David Fowler <davidfowl@gmail.com>
Date:   Thu Jan 29 21:31:54 2026 -0800

    Add Dashboard Telemetry HTTP API (microsoft#14168)

    * Add Dashboard Telemetry HTTP API

    This PR adds a REST API to the Dashboard for accessing telemetry data (traces and logs).

    ## New Endpoints

    - GET /api/telemetry/traces - List traces with filtering
    - GET /api/telemetry/traces/{traceId} - Get single trace by ID
    - GET /api/telemetry/traces/{traceId}/logs - Get logs for a trace
    - GET /api/telemetry/logs - List logs with filtering
    - GET /api/telemetry/logs/{logId} - Get single log by ID

    All endpoints support:
    - Query parameters: resource, limit, hasError (traces), severity (logs), traceId (logs)
    - Streaming via ?follow=true (NDJSON format)
    - JSON responses with dashboard links

    ## Authentication

    Introduces unified API authentication with new Dashboard:Api config section:
    - Dashboard:Api:AuthMode (Unsecured or ApiKey)
    - Dashboard:Api:PrimaryApiKey
    - Dashboard:Api:SecondaryApiKey (for key rotation)

    Backward compatible with existing Dashboard:Mcp config.

    ### Header Support
    - Telemetry API: accepts x-api-key header
    - MCP: accepts both x-api-key (new) and x-mcp-api-key (legacy)

    ## Files Added
    - src/Aspire.Dashboard/Api/TelemetryApiService.cs
    - src/Aspire.Dashboard/Api/TelemetryApiAuthenticationHandler.cs
    - src/Aspire.Dashboard/Model/Api/TelemetryDtos.cs
    - src/Aspire.Dashboard/Configuration/ApiAuthMode.cs
    - tests/Aspire.Dashboard.Tests/Integration/TelemetryApiTests.cs (15 tests)

    ## Bug Fixes
    - Fixed severity filter on logs (LevelField case in OtlpLogEntry.GetFieldValue)
    - Fixed trace lookup by shortened ID

    * Refactor telemetry API to use OTLP JSON format and streaming repository

    Changes:
    - Replace custom DTOs (TraceDto, SpanDto, LogEntryDto, etc.) with standard OTLP JSON format
    - Add WatchTracesAsync and WatchLogsAsync to TelemetryRepository for push-based streaming
    - Simplify TelemetryApiService by using TelemetryExportService for JSON conversion
    - Remove TelemetryDtos.cs - using OtlpTelemetryDataJson from existing serialization
    - Add TelemetryApiResponse<T> wrapper for list endpoints
    - Fix bugs: add opt-out resource filtering to streaming, resolve traceId once before loop
    - Update tests to use new OTLP format

    API response format is now standard OTLP JSON with wrapper:
    {
      "data": { "resourceSpans": [...] or "resourceLogs": [...] },
      "totalCount": N,
      "returnedCount": N
    }

    * Fix unbounded memory growth in trace streaming

    Replace HashSet<string> with DateTime-based tracking:
    - HashSet grows forever as new traces arrive
    - DateTime lastSeenTimestamp is fixed 8 bytes
    - Uses trace.LastUpdatedDate for deduplication

    Logs already used bounded InternalId tracking.

    * Implement push-based streaming (O(1) per item)

    - Add TraceWatcher and LogWatcher classes to receive pushed items
    - Modify AddTracesCore to push traces to watchers
    - Modify AddLogsCore to push logs to watchers
    - Rewrite WatchTracesAsync to yield existing then read from channel
    - Rewrite WatchLogsAsync with same pattern
    - Use bounded channels (1000 items) to prevent memory growth
    - This eliminates O(n) re-query cost on every notification

    * Fix code review issues in push-based streaming

    - Fix race condition: register watcher BEFORE getting snapshot
    - Add deduplication using trace ID and log internal ID
    - Fix off-by-one error in limit handling for streaming
    - Complete watcher channels on repository dispose for graceful shutdown

    * Use O(1) memory for trace deduplication

    Replace HashSet<string> (up to 320KB for 10k traces) with
    single DateTime timestamp (8 bytes) for deduplication.

    * Update spec to reflect OTLP JSON format and push-based streaming

    * Fix markdown lint - add language to code block

    * Handle OperationCanceledException in streaming endpoints

    When clients disconnect from streaming endpoints, catch the expected
    OperationCanceledException and exit cleanly instead of letting it
    propagate as an unhandled exception.

    * Normalize MCP API keys to Api options in PostConfigure

    This allows Dashboard:Mcp:PrimaryApiKey and SecondaryApiKey to work
    for the Telemetry API as well as MCP, providing unified auth handling
    when only the legacy MCP key is configured.

    Also ensures the auth handler fails explicitly when ApiKey mode is
    set but no key is configured.

    * Address PR review feedback

    - Use AIHelpers.TryGetResource for resource resolution (matches MCP)
    - Use TelemetryRepository.GetTrace() for single trace lookup
    - Return 404 for unknown resources, 200 with empty data for trace logs
    - Use severity GreaterThanOrEqual filter (Error returns Error+Critical)
    - Remove GetLogById endpoint
    - Lazy-initialize trace/log watchers in TelemetryRepository
    - Extract StreamNdjsonAsync helper method
    - Reorder DashboardOptions.Api below Mcp

    * Use shared AIHelpers.TryResolveResourceForTelemetry

    Extract resource resolution logic to AIHelpers so it can be shared
    between TelemetryApiService, AspireTelemetryMcpTools, and
    AssistantChatDataContext.

    * Rename traces API to spans API

    The API returns spans in OTLP format, not traces. Renamed:
    - GET /api/telemetry/traces → GET /api/telemetry/spans
    - GET /api/telemetry/traces/{id} → GET /api/telemetry/spans/{id}
    - GET /api/telemetry/traces/{id}/logs → GET /api/telemetry/spans/{id}/logs
    - Added traceId query param to filter spans by trace
    - GetTraces → GetSpans, GetTraceById → GetSpanById
    - FollowTracesAsync → FollowSpansAsync
    - Added TelemetryRepository.GetSpan(spanId) and WatchSpansAsync
    - Added TelemetryExportService.ConvertSpansToOtlpJson

    * Address remaining PR review comments

    - Update spec: rename traces to spans, document 404 for unknown resources
    - Update spec: document severity filter uses GreaterThanOrEqual
    - Add NDJSON content-type tests for streaming
    - Add configuration startup tests (ApiOptions defaults, key inheritance)
    - Add Dashboard:Api:Enabled setting to enable/disable the API
    - Update spec with configuration documentation including Enabled option

    * Fix NDJSON streaming to use compact JSON

    NDJSON format requires each line to be a single compact JSON object,
    not indented. Changed ConvertSpanToJson to accept indent parameter
    and pass indent=false when streaming.

    * Fix auth mode defaults: use ApiKey when key is configured

    * Fix code review issues: WithCancellation, query cap, off-by-one, O(1) lookup

    * Address JamesNK review: remove spanId endpoint, rename handler, simplify options

    * Refactor: TraceWatcher to SpanWatcher, push spans directly

    * Lazy init addedLogs list (avoid allocation when no watchers)

    * Add unit tests for WatchSpansAsync and WatchLogsAsync

    Add 5 tests covering watcher functionality in TelemetryRepository:
    - WatchSpansAsync_ReturnsExistingSpans_ThenNewSpans
    - WatchSpansAsync_CanBeCancelled
    - WatchSpansAsync_FiltersById_WhenResourceKeyProvided
    - WatchLogsAsync_ReturnsExistingLogs_ThenNewLogs
    - WatchLogsAsync_CanBeCancelled

    * Update spec documentation to reflect final implementation

    - Update design decisions table (no /{spanId} endpoint)
    - Update configuration notes (shared API keys with MCP)
    - Update authentication notes (unsecured warning)
    - Update files table (new partial class, renamed handler)
    - Update tests section (21 API tests, 5 watcher tests)

    * Fix code review issues in watcher implementation

    1. Cap initial snapshot to 10,000 items (MaxWatcherSnapshotCount)
       - Prevents unbounded memory usage on large repositories

    2. Drain channel after snapshot to fix race condition
       - Items that arrive during snapshot read are now properly handled
       - Prevents data loss in the gap between registration and snapshot

    3. Log warning when channel overflow drops data
       - Consumers now get visibility into data loss
       - Helps diagnose slow consumer issues

    * Add trace API endpoints and CLI commands to spec

    API:
    - GET /api/telemetry/traces - List trace summaries (grouped spans)
    - GET /api/telemetry/traces/{traceId} - Get specific trace with all spans

    CLI commands:
    - aspire telemetry logs - List/stream logs (supports --follow)
    - aspire telemetry spans - List/stream raw spans (supports --follow)
    - aspire telemetry trace - List traces or show waterfall (snapshot only)

    Streaming support: logs and spans support --follow, traces do not
    (traces are groupings with no 'complete' signal)

    * Add trace API endpoints

    Endpoints:
    - GET /api/telemetry/traces - List traces in OTLP format
    - GET /api/telemetry/traces/{traceId} - Get specific trace

    Both return standard OTLP JSON format (resourceSpans), consistent with spans endpoint.
    Supports ?resource, ?hasError, ?limit query params for traces list.

    Adds 5 new tests for trace endpoints (25 total TelemetryApiTests).

    * Update spec with accurate test list and endpoint descriptions

    - Fix traces endpoint table (returns OTLP JSON, not summaries)
    - Update error responses to include trace not found
    - Update test count to 25 (was 21)
    - List all test names organized by category

    * Remove shadowed local MaxQueryCount constant

    Use the class-level MaxQueryCount constant instead of redefining it locally in GetLogs method.

    * Address JamesNK PR review feedback

    - Move unsecured API warning to startup log (not first request)
    - Add unsecured API warning in dashboard UI
    - Fix TryParseOptions to return bool with error message
    - Clear HashSet after drain phase to prevent unbounded growth
    - Move filter application to watcher push for efficiency
    - Use EqualsCompositeName instead of GetCompositeName to avoid allocations
    - Remove unused OpenAPI tag from endpoint group

    * Add comment explaining HashSet usage for span deduplication

    * Remove opt-out resource filtering from telemetry API

    The API returns all telemetry data for all resources. Added TODO comment
    to consider ExcludeFromApi property in the future if needed.

    This simplifies the code significantly by removing:
    - GetOptOutResources helper
    - IsOptOutResource helper
    - dashboardClient dependency
    - All opt-out filtering logic in all methods

    * Add severity filter to FollowLogs and tests for watcher filtering

    - Move severity filter from inline to TelemetryFilter passed to WatchLogsAsync
    - Add WatchLogsAsync_FiltersAppliedWhenPushing test
    - Add WatchLogsAsync_SeverityFilterApplied test

    Now 7 watcher tests total (was 5).

    * Fix off-by-one error in streaming limit handling

    Previously, when streaming with a limit parameter, the first item after
    the limit was skipped when switching to streaming mode. Now all items
    are yielded correctly - the first 'limit' items, then all new items.

    Added tests:
    - FollowSpansAsync_WithLimit_DoesNotSkipItems
    - FollowLogsAsync_WithLimit_DoesNotSkipItems

    * Fix hasError filter bug and remove dead code

    - Fix hasError=false not filtering out error spans/traces in GetSpans/GetTraces
    - Remove unused limit parameter from FollowSpansAsync/FollowLogsAsync (was dead code)
    - Remove Task.Delay from watcher tests, use TaskCompletionSource for reliability
    - Add 4 new tests for hasError filter behavior
    - Update spec and PR description with latest API shape

commit d713404
Author: Ankit Jain <radical@gmail.com>
Date:   Thu Jan 29 20:57:22 2026 -0500

    Strip tests.yml to detect_scope + setup_for_tests_lin for validation

    Temporarily modify CI to validate conditional test scope detection:
    - Add conditional-test-runs-with-msbuild as a PR trigger branch in ci.yml
    - Remove all test execution jobs from tests.yml, keeping only detect_scope
      and setup_for_tests_lin to validate detection logic and test enumeration
      without burning CI resources

    Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

commit 526bb5a
Author: James Newton-King <james@newtonking.com>
Date:   Fri Jan 30 08:47:02 2026 +0800

    Fix dashboard URL logged in app host to be the actual port (for randomization) (microsoft#14191)
@github-actions github-actions bot locked and limited conversation to collaborators Mar 3, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants