Skip to content

Create per-server daemon telemetry sessions - #85155

Open
dibarbet wants to merge 12 commits into
mainfrom
dev/dibarbet/daemon-telemetry-sessions
Open

Create per-server daemon telemetry sessions#85155
dibarbet wants to merge 12 commits into
mainfrom
dev/dibarbet/daemon-telemetry-sessions

Conversation

@dibarbet

@dibarbet dibarbet commented Sep 3, 2026

Copy link
Copy Markdown
Member

Summary

This PR stacks on #85151. It gives each language server hosted by a daemon its own telemetry session.

  • Partition daemon pipe names by each client's effective telemetry level so a daemon cannot mix clients with different consent settings.
  • Keep one daemon session for process and connection lifecycle events, while creating a fresh session for every server connection. Per-server sessions include vs.roslyn.languageserver.daemonsessionid for correlation.
  • Make LanguageServerHost create and own each per-server telemetry session from the ambient daemon owner. The connection manager remains transport/lifetime coordination only, and the daemon source captures its daemon instance when constructed for explicit lifecycle logging.
  • Establish the server ambient before constructing RoslynLanguageServer; request dispatch and lazy service construction reapply it, while non-request asynchronous boundaries capture RoslynTelemetry.Current and restore it with nested scopes.
  • Move remaining request/project-load/Razor telemetry state to per-server ownership and add daemon isolation coverage.
Microsoft Reviewers: Open in CodeFlow

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
2 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dibarbet
dibarbet force-pushed the dev/dibarbet/daemon-telemetry-sessions branch from 7d3a453 to f7dbc47 Compare September 4, 2026 23:04
@dibarbet
dibarbet marked this pull request as ready for review September 4, 2026 23:10
@dibarbet
dibarbet requested a review from a team as a code owner September 4, 2026 23:10
Copilot AI lite review requested due to automatic review settings September 4, 2026 23:10
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
2 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

Copilot AI left a comment

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.

Copilot review overview

🟡 Changes recommended

There are merge-blocking gaps around cancellation handling in ServiceBrokerConnectHandler and a regression in telemetry flush isolation coverage that should be restored.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review tier: Lite
Findings: 1 Medium severity · 1 Low severity

New issues introduced by this change (2)
Severity Finding
Medium severity src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​BrokeredServices/​ServiceBrokerConnectHandler.cs — The broker connection is started via Task.Run with CancellationToken.None, so a cancellation…
Low severity src/​Workspaces/​CoreTest/​Log/​RoslynTelemetryTests.cs — RecordingMetricSink.Flush was changed to a no-op, which removes the ability for these tests to…
What changed in this PR

Introduces per-language-server telemetry isolation when running under the daemon host model, so each server connection can own its own telemetry session and sinks without cross-contamination between concurrently hosted servers.

Changes:

  • Partition daemon discovery/pipe naming by effective telemetry level and plumb --telemetryLevel through thin-client argument parsing.
  • Create/own per-server RoslynTelemetry + optional TelemetrySession per daemon connection; re-establish telemetry ambient across request dispatch, service creation, broker activations, and async boundaries.
  • Move remaining language-server request/project-load/Razor bridge telemetry state to per-server ownership and add/adjust unit tests for daemon isolation and session settings.
File Description
src/​Workspaces/​CoreTest/​Log/​RoslynTelemetryTests.cs Adjusts core telemetry unit tests alongside new per-instance expectations.
src/​LanguageServer/​roslyn-language-server/​ThinClientArguments.cs Parses and carries --telemetryLevel and forwards it to the server args.
src/​LanguageServer/​roslyn-language-server/​Program.cs Passes parsed thin-client arguments into daemon connect flow.
src/​LanguageServer/​roslyn-language-server/​DaemonClient.cs Partitions daemon pipe selection by resolved telemetry level.
src/​LanguageServer/​Protocol/​RoslynLanguageServer.cs Registers RoslynTelemetry as a base service for LSP services.
src/​LanguageServer/​Protocol/​LspServices/​LspServices.cs Captures and reapplies per-server telemetry ambient during lazy service creation.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​Telemetry/​VSCodeRequestTelemetryLogger.cs Converts request telemetry logger state from static to per-server instance state.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​Telemetry/​LanguageServerTelemetry.cs Creates standalone/devkit sessions per server, registers sinks per RoslynTelemetry, and correlates daemon session IDs.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​Program.cs Resolves telemetry level once, creates the process/default session, and reports features telemetry at shutdown.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​LanguageServer/​LanguageServerHost.cs Creates/owns per-server telemetry instance/session in daemon mode and scopes ambient telemetry for server lifetime.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​LanguageServer/​LanguageServerConnectionManager.cs Plumbs daemon session ID into per-connection server host creation.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​HostWorkspace/​WorkspaceProjectFactoryService.cs Uses per-server request telemetry logger instance for project-load start events.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​HostWorkspace/​Razor/​TelemetryReporterWrapper.cs Bridges Razor telemetry via a RoslynTelemetryTelemetrySession association.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​HostWorkspace/​ProjectTelemetry/​ProjectLoadTelemetryReporter.cs Makes project-load correlation ID per-server instead of static/process-wide.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​HostWorkspace/​ProjectInitializationHandler.cs Uses per-server request telemetry logger instance for initialization-complete events.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​HostWorkspace/​LanguageServerProjectLoader.cs Captures per-server telemetry and reapplies it for async project reload batches.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​HostWorkspace/​FileWatching/​LspFileChangeWatcher.cs Captures/reapplies per-server telemetry across watcher disposal/unregistration async boundary.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​HostWorkspace/​FileWatching/​DefaultFileChangeWatcher.FileChangeContext.cs Captures/reapplies per-context telemetry for filesystem watcher callbacks.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​HostWorkspace/​DevKitProjectLoadingServiceContributor.cs Passes per-server request telemetry logger into brokered project services.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​BrokeredServices/​ServiceBrokerConnectHandler.cs Re-establishes telemetry ambient when connecting broker services under suppressed execution context.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer/​BrokeredServices/​BrokeredServiceBridgeProvider.cs Documents execution-context capture point for broker activations.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer.UnitTests/​WorkspaceProjectFactoryServiceTests.cs Updates test wiring for per-server request telemetry logger instance.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer.UnitTests/​VSMetricSinkTests.cs Refactors test helpers (moved to shared utilities file).
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer.UnitTests/​Utilities/​RecordingTelemetrySinks.cs Adds reusable recording sinks/poster for telemetry-related unit tests.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer.UnitTests/​Utilities/​AbstractLanguageServerHostTests.cs Updates daemon test harness to model process vs per-server telemetry sessions.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer.UnitTests/​TelemetryReporterTests.cs Updates reporter/wrapper construction and adds standalone session settings validation.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer.UnitTests/​ServiceBrokerFactoryTests.cs Extends coverage to ensure broker calls/telemetry are isolated per server.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer.UnitTests/​LanguageServerRequestTelemetryTests.cs Refactors/moves test poster helper usage.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer.UnitTests/​Daemon/​LanguageServerDaemonTests.cs Adds test asserting isolated per-server telemetry sessions correlated to daemon session.
src/​LanguageServer/​Microsoft.CodeAnalysis.LanguageServer.UnitTests/​Daemon/​DaemonPipeNameTests.cs Updates expectations and adds test for telemetry-level partitioning.
src/​LanguageServer/​DaemonConnection/​TelemetryLevelResolver.cs Centralizes “effective telemetry level” resolution (arg vs env).
src/​LanguageServer/​DaemonConnection/​DaemonPipeName.cs Includes telemetry level in daemon pipe-name hashing input.
Suppressed comments (1)

src/Workspaces/CoreTest/Log/RoslynTelemetryTests.cs:169

  • This PR removes the only regression test that verifies RoslynTelemetry.Flush() only flushes sinks registered on the instance being flushed (not other instances). With per-server telemetry instances, preserving this isolation invariant seems important; consider restoring the test.

Comment thread src/Workspaces/CoreTest/Log/RoslynTelemetryTests.cs
Base automatically changed from dev/dibarbet/telemetry-instance to main September 9, 2026 23:16
dibarbet and others added 12 commits September 9, 2026 16:54
Partition daemon clients by telemetry consent and isolate server telemetry attribution and lifetime.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Let each LanguageServerHost create and dispose its daemon child session, while Protocol captures only the ambient RoslynTelemetry instance.

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

Copilot-Session: beeb17b9-9104-41c1-a3c0-f95dc9df4d39
Capture telemetry from the ambient context during host and service construction, and remove telemetry plumbing from the connection manager and daemon source APIs.

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

Copilot-Session: beeb17b9-9104-41c1-a3c0-f95dc9df4d39
Remove the unused standalone telemetry owner and keep the daemon root owner scoped to the daemon task.

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

Copilot-Session: beeb17b9-9104-41c1-a3c0-f95dc9df4d39
StreamJsonRpc dispatches inbound brokered calls on the execution context captured when the connection was created, so they already carry the owning server's telemetry. Verified by a test covering both a brokered service call and Dev Kit's initialization observer.

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

Copilot-Session: beeb17b9-9104-41c1-a3c0-f95dc9df4d39
Share telemetry test sinks and remove unrelated formatting and cleanup from the per-server telemetry diff.

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

Copilot-Session: c5d4f77e-69f4-4116-aa63-b7c1ab0822cb
@dibarbet
dibarbet force-pushed the dev/dibarbet/daemon-telemetry-sessions branch from f7dbc47 to 158508c Compare September 10, 2026 00:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants