Skip to content

Add TelemetryRepository.GetSpans, move text search into repository, and add SearchTextParser#17482

Open
JamesNK wants to merge 7 commits into
mainfrom
jnewman/repository-getspans
Open

Add TelemetryRepository.GetSpans, move text search into repository, and add SearchTextParser#17482
JamesNK wants to merge 7 commits into
mainfrom
jnewman/repository-getspans

Conversation

@JamesNK
Copy link
Copy Markdown
Member

@JamesNK JamesNK commented May 26, 2026

Summary

Adds a GetSpans method to TelemetryRepository, moves text-fragment matching from the API service layer into the repository, introduces a shared SearchTextParser for structured search queries, and simplifies CLI log search to treat all input as free-text.

Changes

New: TelemetryRepository.GetSpans

  • Adds GetSpansRequest/GetSpansResponse models and a GetSpans method on TelemetryRepository that supports filtering by resource, trace ID, error status, attribute filters, and text fragments.
  • Removes the minDuration option (was unused).

Move text-fragment search into TelemetryRepository

  • GetTracesRequest and GetLogsContext now accept optional TextFragments arrays.
  • Text matching for traces and logs is performed inside the repository rather than post-query in TelemetryApiService, improving consistency and enabling the repository to skip non-matching items earlier.
  • GetTracesRequest.TraceNameFilterText (renamed from FilterText) remains for the dashboard UI's trace-name-only filter (matches trace.FullName).

New: SearchTextParser (shared)

A shared parser for search queries supporting free-text fragments, field qualifiers, attribute qualifiers, negation, and comparison operators.

Search syntax

Syntax Meaning
word Free-text fragment — must appear in at least one searchable field
"quoted phrase" Single fragment containing spaces
field:value Field qualifier — value must match the named field
field:"value with spaces" Quoted field qualifier value
@attr:value Attribute qualifier — matches custom span/log attributes
-field:value / -@attr:value Negated qualifier — excludes matches
field:>N / field:>=N / field:<N / field:<=N Numeric comparison

All terms are AND'd: every fragment and qualifier must independently match.

Available field qualifiers

Spans / Traces:

Field Aliases Description
name Span name
resource Resource/service name
scope source Instrumentation scope name
status Span status (Ok, Error, Unset)
kind Span kind (Client, Server, Producer, Consumer, Internal)
trace-id traceid Trace ID
span-id spanid Span ID
duration Span duration in ms (supports >, >=, <, <=)

Structured Logs:

Field Aliases Description
severity level Log severity (Trace, Debug, Information, Warning, Error, Critical)
resource Resource/service name
scope category Logger category/scope name
message msg Log message
trace-id traceid Trace ID
span-id spanid Span ID
event Event name

Console Logs (CLI):
All search text is treated as free-text fragments (no field qualifiers). Console logs have no structured attributes — search matches against log content and resource name.

Text fragment matching candidates

When text fragments are used (plain words without qualifiers), they match against:

  • Spans: name, spanId, traceId, scope, resource, status, kind, statusMessage, all attribute keys/values, event names
  • Traces: trace full name ("{resource}: {spanName}"), then falls back to searching all spans
  • Structured Logs: message, scope, traceId, spanId, severity, resource, eventName, all attribute keys/values
  • Console Logs: raw content, ANSI-stripped content, resource name

Simplify CLI log search

  • LogsCommand.MatchesSearch and ListConsoleLogsTool now use SearchTextParser.ParseFragments + MatchesAllFragments instead of the full qualifier-aware MatchesFilter. Since console logs have no structured attributes, all search input (including key:value-like text) is treated as plain free-text fragments.

Tests

  • SearchTextParserTests — comprehensive tests for parsing and matching
  • TelemetryApiServiceTests — attribute filter tests for spans, traces, and logs
  • TraceTestsTextFragments matching in repository for traces
  • LogsCommandTests — multi-word search, qualifier-as-freetext behavior
  • ListConsoleLogsToolTests — multi-word search, qualifier-as-freetext behavior

- Remove minDuration option from CLI spans/traces commands and dashboard API
- Add GetSpansRequest/GetSpansResponse types for repository-level span querying
- Add TelemetryRepository.GetSpans with filtering by resource, traceId, hasError, duration, text fragments, and telemetry filters
- Refactor TelemetryApiService.GetSpans to delegate filtering to the repository
- Move GetSpans tests from TelemetryApiServiceTests to TraceTests
- Add comprehensive GetSpans repository tests including pagination and shortened trace ID matching
Copilot AI review requested due to automatic review settings May 26, 2026 00:57
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 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/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 17482

Or

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

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 refactors telemetry span querying to support span-level filtering at the repository layer (TelemetryRepository.GetSpans), removes the unused minDuration parameter/option across CLI + dashboard endpoints, and introduces a shared SearchTextParser to support structured key:value-style search qualifiers.

Changes:

  • Removed minDuration/minDurationMs from CLI commands, dashboard API endpoints, and shared URL builders.
  • Added TelemetryRepository.GetSpans (+ request/response types) and updated TelemetryApiService.GetSpans to delegate filtering to the repository.
  • Added shared SearchTextParser and expanded test coverage for span querying + search parsing.

Reviewed changes

Copilot reviewed 34 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
tests/Aspire.Dashboard.Tests/TelemetryRepositoryTests/TraceTests.cs Adds repository-level GetSpans tests (resource/traceId/hasError/duration/text/pagination).
tests/Aspire.Dashboard.Tests/TelemetryApiServiceTests.cs Removes/moves span-specific tests; updates trace tests to reflect minDuration removal and duration filtering via search.
tests/Aspire.Dashboard.Tests/DashboardUrlsTests.cs Updates URL tests to remove minDurationMs expectations.
tests/Aspire.Cli.Tests/Utils/SearchTextParserTests.cs Adds comprehensive unit tests for structured search parsing + matching.
tests/Aspire.Cli.Tests/Commands/TelemetryTracesCommandTests.cs Updates CLI tests to use --search "duration:>=..." instead of --min-duration and asserts exact URLs.
tests/Aspire.Cli.Tests/Commands/TelemetrySpansCommandTests.cs Updates CLI tests to assert exact URLs and use duration filtering via --search.
src/Shared/SearchTextParser.cs Introduces shared parser/matcher for text fragments + qualifiers (incl. negation and comparisons).
src/Shared/DashboardUrls.cs Removes minDurationMs from telemetry URL builders.
src/Aspire.Dashboard/Otlp/Storage/TelemetryRepository.cs Adds repository GetSpans implementation and span text-fragment matching.
src/Aspire.Dashboard/Otlp/Storage/GetSpansResponse.cs Adds response type for repository GetSpans.
src/Aspire.Dashboard/Otlp/Storage/GetSpansRequest.cs Adds request type for repository GetSpans.
src/Aspire.Dashboard/DashboardEndpointsBuilder.cs Removes minDurationMs query param from telemetry endpoints and updates service calls.
src/Aspire.Dashboard/Aspire.Dashboard.csproj Links shared SearchTextParser.cs into the dashboard project.
src/Aspire.Dashboard/Api/TelemetryApiService.cs Refactors spans/traces/logs search handling: parses qualifiers into TelemetryFilters and applies text fragments separately.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.zh-Hant.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.zh-Hans.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.tr.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.ru.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.pt-BR.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.pl.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.ko.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.ja.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.it.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.fr.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.es.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.de.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/xlf/TelemetryCommandStrings.cs.xlf Removes min-duration option string.
src/Aspire.Cli/Resources/TelemetryCommandStrings.resx Removes min-duration option description.
src/Aspire.Cli/Resources/TelemetryCommandStrings.Designer.cs Removes generated accessor for min-duration option description.
src/Aspire.Cli/Mcp/Tools/ListConsoleLogsTool.cs Switches MCP console log search to structured qualifier parsing/matching.
src/Aspire.Cli/Commands/TelemetryTracesCommand.cs Removes --min-duration option and stops appending minDurationMs to URLs.
src/Aspire.Cli/Commands/TelemetrySpansCommand.cs Removes --min-duration option and stops appending minDurationMs to URLs.
src/Aspire.Cli/Commands/TelemetryCommandHelpers.cs Removes creation of --min-duration option.
src/Aspire.Cli/Commands/LogsCommand.cs Switches CLI log search to structured qualifier parsing/matching.
src/Aspire.Cli/Aspire.Cli.csproj Links shared SearchTextParser.cs into the CLI project.
Files not reviewed (1)
  • src/Aspire.Cli/Resources/TelemetryCommandStrings.Designer.cs: Language not supported

Comment thread src/Aspire.Dashboard/Api/TelemetryApiService.cs
Comment thread src/Aspire.Dashboard/Api/TelemetryApiService.cs
Comment thread src/Shared/SearchTextParser.cs
Comment thread src/Shared/SearchTextParser.cs Outdated
Comment thread src/Aspire.Dashboard/Otlp/Storage/GetSpansRequest.cs
Comment thread tests/Aspire.Cli.Tests/Commands/TelemetrySpansCommandTests.cs Outdated
…earch

- Add TextFragments to GetTracesRequest and GetLogsContext so text
  matching is performed inside TelemetryRepository instead of post-query
  in TelemetryApiService.
- Rename FilterText to TraceNameFilterText to clarify it only matches
  trace.FullName (used by dashboard UI).
- Simplify LogsCommand and ListConsoleLogsTool search to treat all input
  as free-text fragments (no qualifier parsing) since console logs have
  no structured attributes.
- Add tests for multi-word search and qualifier-as-freetext behavior.
@JamesNK JamesNK changed the title Add TelemetryRepository.GetSpans and remove minDuration option Add TelemetryRepository.GetSpans, move text search into repository, and add SearchTextParser May 26, 2026
JamesNK added 3 commits May 26, 2026 09:59
The MatchesFilter overloads and their private helpers (QualifierMatches,
AttributeMatches, CompareNumeric, StringMatchesQualifier) had no product
callers — only test references. Remove them and their tests.

Add test for quoted qualifier syntax treated as text fragment.
- Add WatchSpansRequest and WatchLogsRequest to encapsulate watcher filters
- WatchSpansAsync/WatchLogsAsync now accept request objects with ResourceKey,
  Filters, TextFragments (and TraceId/HasError for spans)
- WatchSpansAsync uses GetSpans for initial snapshot instead of GetTraces
- Extract shared MatchesSpanCriteria for both GetSpans and PushSpansToWatchers
- Remove dead MatchesLogTextFragments/MatchesSpanTextFragments from TelemetryApiService
- TelemetryApiService constructs request objects and delegates filtering to repository
Replace the ReadOnlySpan<string> overload that allocated a List<string>
per call with a generic delegate version that passes state directly,
eliminating per-call allocations in hot paths like span/log filtering.

All callers updated to use the new API:
- TelemetryRepository: passes span/log/trace state directly
- LogsCommand: passes tuple of (content, prefix, stripped)
- ListConsoleLogsTool: passes tuple of (content, prefix, stripped)
- Tests: updated to exercise the delegate API
@github-actions
Copy link
Copy Markdown
Contributor

Re-running the failed jobs in the CI workflow for this pull request because 1 job was identified as retry-safe transient failures in the CI run attempt.
GitHub was asked to rerun all failed jobs for that attempt, and the rerun is being tracked in the rerun attempt.
The job links below point to the failed attempt jobs that matched the retry-safe transient failure rules.

@davidfowl
Copy link
Copy Markdown
Contributor

Do we need to update the skill and help text so agents can effectively use these filters?

- Refactor TelemetryRepository to support filtered GetSpans/GetLogs queries
- Remove watcher-based filtering in favor of direct repository filtering
- Fix SearchTextParser to handle empty input without throwing
- Add LogsCommand_FollowWithSearch_FiltersExistingAndStreamedLogs test
- Add TelemetryRepository filtering tests for logs, traces, and spans
- Update monitoring.md with --search filtering documentation
@davidfowl
Copy link
Copy Markdown
Contributor

How do you combine free text with filters?

GetSpans returns spans grouped by trace, not globally sorted by time.
When traces have overlapping time ranges, the initial snapshot was
yielded out of chronological order. Add .OrderBy(s => s.StartTime) to
restore the global sort guarantee for streaming clients.

Add test covering multi-span traces with interleaved timestamps.
@JamesNK
Copy link
Copy Markdown
Member Author

JamesNK commented May 26, 2026

How do you combine free text with filters?

Check out monitoring.md. If you can understand it, then hopefully so will agents 😄

@davidfowl
Copy link
Copy Markdown
Contributor

Well I did and I just had more questions so I asked my agent:

Main ambiguities

  1. Quoted qualifier examples conflict with the described model
--search "severity:error \"connection failed\""

The outer shell quotes are not part of the query; the parser receives:

severity:error "connection failed"

That is fine, but the docs could confuse users into thinking quotes are part of the search language. More importantly, this example implies quoted phrases are free-text fragments, but it does not say whether this is valid:

message:"connection failed"

If structured qualifiers can take quoted values, that should be explicit.

  1. key:value vs free-text containing colons

Any token with : may be parsed as a qualifier:

http://localhost:5000
error: timeout
trace:abc

Questions to resolve:

  • Is foo:bar always a structured qualifier?
  • What happens for unknown keys?
  • Are unknown key:value tokens treated as free text, errors, or custom attributes?

Recommendation: only known keys and @... should become qualifiers; unknown x:y should either be rejected with a clear error or treated as free text consistently.

  1. Custom attribute keys overlap with free text and negation
-@db.system:redis

This is clear if - binds to the whole qualifier. But these are ambiguous unless defined:

@db.system:"redis cache"
-"connection failed"
-foo

Can negation apply to free-text fragments, quoted phrases, and quoted qualifier values, or only structured qualifiers?

  1. Comparison syntax is underspecified
duration:>100
duration:>=50

Ambiguities:

  • Is whitespace allowed? duration: >100
  • Are units allowed? duration:>100ms, duration:<2s
  • What is the default unit?
  • Are <, <=, =, != supported?
  • Does duration:100 mean equality, substring match, or exact numeric duration?

Recommendation: explicitly define duration comparison grammar and units.

  1. AND semantics with negative terms need definition

“Multiple words are AND’d” is clear for positives, but mixed queries need formal semantics:

resource:api -severity:debug timeout

Likely intended meaning:

resource contains api AND severity != debug AND free-text contains timeout

Say that explicitly.

  1. Field matching semantics are unclear

For structured qualifiers, does resource:api mean:

  • exact match,
  • case-insensitive substring,
  • case-sensitive substring,
  • glob/prefix match,
  • regex?

Same for:

severity:error
status:error
kind:server
@http.method:GET

This matters a lot. Severity and kind probably want exact enum matching; message/resource may want substring matching.

  1. The event log key is unclear

For logs:

event:foo

Does this match event name, event body, event ID, structured log event attributes, or OpenTelemetry log event fields? “event” needs a definition.

  1. Trace/span command naming is inconsistent

The heading says:

aspire otel logs/traces/spans --search

But examples use logs and spans. If traces is a separate command, clarify whether it searches trace-level fields, root span fields, or all spans in a trace.

  1. Escaping rules are missing

If quoted phrases exist, define escaping:

"connection \"failed\""
message:"user said \"hi\""
@path:"C:\temp\file.txt"

On Windows especially, backslashes and quotes can become confusing across shell parsing and search-language parsing.

  1. Console logs and structured telemetry have different languages under the same option

For console logs:

aspire logs --search resource:api

The text says only free-text is supported, so this would search literally for resource:api. For OTEL, it would be a qualifier. That is a potential UX surprise.

Recommendation: call this out directly, or consider rejecting qualifier-looking syntax in console logs with “structured filters are only supported for aspire otel ...”.

Suggested clarifications

A compact grammar would remove most ambiguity:

query       := term+
term        := ["-"] (phrase | qualifier | word)
qualifier   := key ":" value | attr ":" value | key ":" comparison
attr        := "@" attrName
key         := one of the documented built-in keys
value       := word | phrase
comparison  := (">" | ">=" | "<" | "<=" | "=") number [unit]
phrase      := '"' characters-with-escapes '"'
word        := non-whitespace characters

Then define:

  • all terms are AND’d;
  • - negates the following term;
  • built-in key matching rules by field;
  • unknown key:value behavior;
  • case sensitivity;
  • duration units and default unit;
  • escaping inside quoted phrases.

Biggest decision to make: should unknown foo:bar be treated as free text or as an error? For CLI usability, I’d recommend treating it as an error in structured telemetry search, because silent fallback can hide typos like severtiy:error.

@JamesNK
Copy link
Copy Markdown
Member Author

JamesNK commented May 26, 2026

Good questions from the agent. Here are answers to each:

1. Quoted qualifier values — Yes, message:"connection failed" is valid. Quoted values work for any qualifier. The shell quoting in the example is separate from the search language quoting.

2. Unknown key:value tokens — Unknown bare keys (no @ prefix) are silently skipped as qualifiers. The value does NOT fall back to free text. Only @-prefixed keys are always treated as attribute qualifiers. I agree this is the biggest usability question — currently a typo like severtiy:error silently matches nothing. I'll add a warning/error for unrecognized keys in a follow-up.

3. Negation scope — Negation (-) only applies to qualifiers (-key:value or -@attr:value). -foo by itself (no colon) is parsed as the literal text fragment -foo. Negating free-text fragments is not supported.

4. Comparison syntax — No whitespace allowed between key, colon, and operator (duration:>100 not duration: >100). Default unit is milliseconds. Only >, >=, <, <= are supported. duration:100 means contains-substring "100" (same as any other qualifier without an operator). No unit suffixes — always ms.

5. AND semantics with negation — Correct: resource:api -severity:debug timeout means "resource contains api AND severity does NOT contain debug AND free-text 'timeout' appears in at least one searchable field." All terms are AND'd.

6. Field matching semantics — All qualifier matching uses case-insensitive substring (Contains). This includes severity:error, status:error, kind:server, and attributes. There's no exact/regex/glob mode. This matches the GitHub search UX where is:open works because "open" is a substring of "Open".

7. event log key — Maps to KnownStructuredLogFields.EventNameField, which is the OpenTelemetry log record's event name field (the EventName attribute on LogRecord).

8. Trace/span commandsaspire otel traces searches at the trace level (matches trace full name, then falls back to searching all spans within the trace). aspire otel spans searches individual spans. They are different commands with different search semantics.

9. Escaping — No escape sequences inside quoted phrases. A backslash is literal. You cannot embed a literal double-quote inside a quoted phrase currently. This is a known limitation — for the use cases we have, attribute values rarely contain quotes.

10. Console vs structured search — This is intentional and called out in monitoring.md: "Only free-text is supported (no structured qualifiers)" for aspire logs. So aspire logs --search "resource:api" literally searches for the text resource:api in log output. The alternative (rejecting qualifier syntax) would be worse because console output often contains key:value-shaped text that users want to search for.


Re: the first question about updating the skill — yes, I already updated monitoring.md with the full filter syntax. That's the reference agents use. The --help text for each command also shows the available qualifiers.

@github-actions
Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 107 passed, 0 failed, 2 unknown (commit 532f7fa)

View all recordings
Status Test Recording
AddPackageInteractiveWhileAppHostRunningDetached ▶️ View recording
AddPackageWhileAppHostRunningDetached ▶️ View recording
AgentCommands_AllHelpOutputs_AreCorrect ▶️ View recording
AgentInitCommand_DefaultSelection_InstallsDefaultSkills ▶️ View recording
AgentInitCommand_MigratesDeprecatedConfig ▶️ View recording
AgentMcpListStructuredLogsReturnsLogsFromStarterApp ▶️ View recording
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_DevLocalhost ▶️ View recording
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_Isolated ▶️ View recording
AllPublishMethodsBuildDockerImages ▶️ View recording
AspireAddPackageVersionToDirectoryPackagesProps ▶️ View recording
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost ▶️ View recording
AspireInitWithExistingAppHostDirRecreatesMissingNuGetConfigAndPreservesFiles ▶️ View recording
AspireInitWithSolutionFileGeneratesAppHostThatBuildsAgainstChannelHive ▶️ View recording
AspireStartUpdatesStaleTypeScriptAppHostPath ▶️ View recording
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps ▶️ View recording
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent ▶️ View recording
Banner_DisplayedOnFirstRun ▶️ View recording
Banner_DisplayedWithExplicitFlag ▶️ View recording
Banner_NotDisplayedWithNoLogoFlag ▶️ View recording
CertificatesClean_RemovesCertificates ▶️ View recording
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate ▶️ View recording
CertificatesTrust_WithUntrustedCert_TrustsCertificate ▶️ View recording
ConfigSetGet_CreatesNestedJsonFormat ▶️ View recording
CreateAndRunAspireStarterProject ▶️ View recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View recording
CreateAndRunEmptyAppHostProject ▶️ View recording
CreateAndRunJavaEmptyAppHostProject ▶️ View recording
CreateAndRunJsReactProject ▶️ View recording
CreateAndRunPythonReactProject ▶️ View recording
CreateAndRunTypeScriptEmptyAppHostProject ▶️ View recording
CreateAndRunTypeScriptStarterProject ▶️ View recording
CreateJavaAppHostWithViteApp ▶️ View recording
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain ▶️ View recording
DashboardRunWithAgentMcpListTracesReturnsNoTraces ▶️ View recording
DashboardRunWithAgentMcpListTracesReturnsNoTraces_DevLocalhost ▶️ View recording
DashboardRunWithOtelTracesReturnsNoTraces ▶️ View recording
DashboardRunWithOtelTracesReturnsNoTraces_DevLocalhost ▶️ View recording
DeployK8sBasicApiService ▶️ View recording
DeployK8sWithExternalHelmChart ▶️ View recording
DeployK8sWithGarnet ▶️ View recording
DeployK8sWithMongoDB ▶️ View recording
DeployK8sWithMySql ▶️ View recording
DeployK8sWithPostgres ▶️ View recording
DeployK8sWithRabbitMQ ▶️ View recording
DeployK8sWithRedis ▶️ View recording
DeployK8sWithSqlServer ▶️ View recording
DeployK8sWithValkey ▶️ View recording
DeployTypeScriptAppToKubernetes ▶️ View recording
DescribeCommandResolvesReplicaNames ▶️ View recording
DescribeCommandShowsRunningResources ▶️ View recording
DetachFormatJsonProducesValidJson ▶️ View recording
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance ▶️ View recording
DoListStepsShowsPipelineSteps ▶️ View recording
DocsCommand_RendersInteractiveMarkdownFromLocalSource ▶️ View recording
DoctorCommand_DetectsDeprecatedAgentConfig ▶️ View recording
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain ▶️ View recording
DoctorCommand_WithSslCertDir_ShowsTrusted ▶️ View recording
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted ▶️ View recording
GatewayWithoutExternalEndpoint_FailsPublishWithGuidance ▶️ View recording
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain ▶️ View recording
GlobalMigration_HandlesCommentsAndTrailingCommas ▶️ View recording
GlobalMigration_HandlesMalformedLegacyJson ▶️ View recording
GlobalMigration_PreservesAllValueTypes ▶️ View recording
GlobalMigration_SkipsWhenNewConfigExists ▶️ View recording
GlobalSettings_MigratedFromLegacyFormat ▶️ View recording
IngressWithoutExternalEndpoint_FailsPublishWithGuidance ▶️ View recording
InitTypeScriptAppHost_AugmentsExistingViteRepoAtRoot ▶️ View recording
InteractiveCSharpInitCreatesExpectedFiles ▶️ View recording
InvalidAppHostPathWithComments_IsHealedOnRun ▶️ View recording
JavaScriptHostingApisRunFromTypeScriptAppHost ▶️ View recording
LatestCliCanStartStableChannelAppHost ▶️ View recording
LatestCliCanStartStableChannelTypeScriptAppHost ▶️ View recording
LegacySettingsMigration_AdjustsRelativeAppHostPath ▶️ View recording
LogLevelTrace_ProducesTraceEntriesInCliLogFile ▶️ View recording
LogsCommandShowsResourceLogs ▶️ View recording
OtelLogsReturnsStructuredLogsFromStarterApp ▶️ View recording
OtelLogsReturnsStructuredLogsFromStarterAppIsolated ▶️ View recording
PsCommandListsRunningAppHost ▶️ View recording
PsFormatJsonOutputsOnlyJsonToStdout ▶️ View recording
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts ▶️ View recording
PublishWithConfigureEnvFileUpdatesEnvOutput ▶️ View recording
PublishWithDockerComposeServiceCallbackSucceeds ▶️ View recording
PublishWithoutOutputPathUsesAppHostDirectoryDefault ▶️ View recording
ResourceCommand_FailedExecution_DisplaysAppHostLogPathAndLogContainsEntries ▶️ View recording
ResourceCommand_FailsWhenInteractionServiceIsRequired ▶️ View recording
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput ▶️ View recording
RestoreGeneratesSdkFiles ▶️ View recording
RestoreGeneratesSdkFiles_WithConfiguredToolchain ▶️ View recording
RestoreRefreshesGeneratedSdkAfterAddingIntegration ▶️ View recording
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes ▶️ View recording
RunFromParentDirectory_UsesExistingConfigNearAppHost ▶️ View recording
RunReportsSyntaxErrorsForDotNetAppHost ▶️ View recording
RunReportsSyntaxErrorsForTypeScriptAppHost ▶️ View recording
SecretCrudOnDotNetAppHost ▶️ View recording
SecretCrudOnTypeScriptAppHost ▶️ View recording
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels ▶️ View recording
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets ▶️ View recording
StartReportsSyntaxErrorsForDotNetAppHost ▶️ View recording
StartReportsSyntaxErrorsForTypeScriptAppHost ▶️ View recording
StopAllAppHostsFromAppHostDirectory ▶️ View recording
StopJavaPolyglotAppHostUsingApphostDirectory ▶️ View recording
StopNonInteractiveSingleAppHost ▶️ View recording
StopTypeScriptPolyglotAppHostUsingApphostDirectory ▶️ View recording
StopWithNoRunningAppHostExitsSuccessfully ▶️ View recording
UnAwaitedChainsCompileWithAutoResolvePromises ▶️ View recording
UpdateProjectChannelToStable_CSharpEmptyAppHost_PreservesAspireConfigChannel ▶️ View recording
UpdateProjectChannelToStable_CSharpSingleFileInit_PreservesAspireConfigChannel ▶️ View recording
UpdateProjectChannelToStable_TypeScriptSingleFileInit_PreservesAspireConfigChannel ▶️ View recording
UpdateProjectChannelToStable_TypeScript_PreviewsStablePackagesAndPreservesChannel ▶️ View recording

📹 Recordings uploaded automatically from CI run #26435048028

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants