Skip to content

Use S2S-only OBS with isolated app-token providers across samples - #339

Open
Krishnadheeraj (DheerajPannala) wants to merge 1 commit into
mainfrom
users/DheerajPannala/obs-s2s-only-20260909
Open

Use S2S-only OBS with isolated app-token providers across samples#339
Krishnadheeraj (DheerajPannala) wants to merge 1 commit into
mainfrom
users/DheerajPannala/obs-s2s-only-20260909

Conversation

@DheerajPannala

Copy link
Copy Markdown

Summary

  • Select S2S OBS endpoints throughout Node.js, Python, .NET, and Salesforce samples.
  • Give interactive samples dedicated app-only OBS token providers: blueprint client_credentials with fmi_path, followed by agent-instance client_credentials with the exchange assertion. Keep business MCP/Graph/OBO authentication separate.
  • Reject delegated, missing, malformed, expired, or identity/audience-mismatched OBS tokens without stale/user-token fallback. Harden existing autonomous token handling.
  • Retain API-compatible published SDK families, reject the legacy per-request context-token bypass, and disable published-distro replay where stored routes could select legacy ingestion.
  • Update configuration templates, documentation, and regression coverage. Salesforce ignores its deprecated endpoint-selection flag.

Compatibility and setup

  • Node/Python interactive samples require dedicated AGENT365_OBS_* settings. .NET uses dedicated Agent365Observability configuration and supports blueprint secrets or managed identity.
  • The runtime agent ID must identify the provisioned instance, not its blueprint.
  • Compatible legacy Node SDKs retain their supported non-/otlp S2S suffix. That route's authorization policy is not asserted to be equivalent to the public OTLP route.
  • S2S ingestion does not establish trusted user attribution merely because user baggage was preserved in the submitted payload.

Validation

  • 278 Node, 835 Python, and 59 .NET targeted tests passed.
  • All eight Node and four .NET sample builds passed.
  • Tests exercise both app-token requests, token validation/cache behavior, AI Teammate/OBO workload contexts, installed exporter routes, and no OBO fallback.
  • Salesforce/Apex execution requires a configured test org and was not run.
  • Authenticated live ingestion remains blocked by incomplete test provisioning/credentials and no authentic OBO assertion. Offline checks are not evidence of live authorization success.

Configure S2S OBS across sample languages, add isolated blueprint-to-agent application-token providers, preserve workload OBO, and cover routing and authentication failure paths.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI lite review requested due to automatic review settings September 9, 2026 20:56
@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown

⚠️ Deprecation Warning: The deny-licenses option is deprecated for possible removal in the next major release. For more information, see issue 997.

Dependency Review

The following issues were found:
  • ✅ 0 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 1 package(s) with unknown licenses.
See the Details below.

License Issues

python/crewai/sample_agent/pyproject.toml

PackageVersionLicenseIssue Type
microsoft_agents_a365_observability_core>= 1.0.0NullUnknown License
Denied Licenses: GPL-3.0-only, AGPL-3.0-only

OpenSSF Scorecard

Scorecard details
PackageVersionScoreDetails
nuget/Azure.Identity 1.17.1 🟢 6.5
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Maintained🟢 1030 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
License🟢 10license file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Signed-Releases⚠️ -1no releases found
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Binary-Artifacts🟢 9binaries present in source code
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Pinned-Dependencies🟢 8dependency not pinned by hash detected -- score normalized to 8
Fuzzing⚠️ 0project is not fuzzed
npm/@opentelemetry/core 2.1.0 🟢 7.3
Details
CheckScoreReason
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 10all changesets reviewed
Maintained🟢 1030 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Dependency-Update-Tool🟢 10update tool detected
Binary-Artifacts🟢 10no binaries found in the repo
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Pinned-Dependencies🟢 8dependency not pinned by hash detected -- score normalized to 8
License🟢 10license file detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Vulnerabilities⚠️ 19 existing vulnerabilities detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST🟢 10SAST tool is run on all commits
Security-Policy🟢 10security policy file detected
Fuzzing⚠️ 0project is not fuzzed
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 40 contributing companies or organizations
npm/@microsoft/agents-a365-notifications 0.1.0-preview.115 UnknownUnknown
npm/@microsoft/agents-a365-observability 0.1.0-preview.115 UnknownUnknown
npm/@microsoft/agents-a365-observability-hosting 0.1.0-preview.115 UnknownUnknown
npm/@microsoft/agents-a365-runtime 0.1.0-preview.115 UnknownUnknown
npm/@opentelemetry/core 2.1.0 🟢 7.3
Details
CheckScoreReason
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 10all changesets reviewed
Maintained🟢 1030 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Dependency-Update-Tool🟢 10update tool detected
Binary-Artifacts🟢 10no binaries found in the repo
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Pinned-Dependencies🟢 8dependency not pinned by hash detected -- score normalized to 8
License🟢 10license file detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Vulnerabilities⚠️ 19 existing vulnerabilities detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST🟢 10SAST tool is run on all commits
Security-Policy🟢 10security policy file detected
Fuzzing⚠️ 0project is not fuzzed
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 40 contributing companies or organizations
npm/@microsoft/agents-a365-notifications 0.1.0-preview.115 UnknownUnknown
npm/@microsoft/agents-a365-observability 0.1.0-preview.115 UnknownUnknown
npm/@microsoft/agents-a365-runtime 0.1.0-preview.115 UnknownUnknown
npm/@microsoft/agents-a365-tooling 0.1.0-preview.115 UnknownUnknown
npm/@types/express ^4.17.21 UnknownUnknown
npm/dotenv ^17.2.3 UnknownUnknown
npm/@microsoft/opentelemetry ^1.4.0 UnknownUnknown
npm/@opentelemetry/core 2.1.0 🟢 7.3
Details
CheckScoreReason
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 10all changesets reviewed
Maintained🟢 1030 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Dependency-Update-Tool🟢 10update tool detected
Binary-Artifacts🟢 10no binaries found in the repo
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Pinned-Dependencies🟢 8dependency not pinned by hash detected -- score normalized to 8
License🟢 10license file detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Vulnerabilities⚠️ 19 existing vulnerabilities detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST🟢 10SAST tool is run on all commits
Security-Policy🟢 10security policy file detected
Fuzzing⚠️ 0project is not fuzzed
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 40 contributing companies or organizations
npm/@microsoft/agents-a365-observability 0.1.0-preview.115 UnknownUnknown
npm/@microsoft/agents-a365-runtime 0.1.0-preview.115 UnknownUnknown
pip/microsoft_agents_a365_observability_core >= 1.0.0 UnknownUnknown
pip/microsoft-agents-a365-observability-core >= 1.0.0 UnknownUnknown
pip/microsoft-agents-a365-observability-core >= 1.0.0 UnknownUnknown
pip/microsoft-agents-a365-observability-core >= 1.0.0 UnknownUnknown

Scanned Files

  • dotnet/w365-computer-use/sample-agent/W365ComputerUseSample.csproj
  • nodejs/copilot-studio/sample-agent/package.json
  • nodejs/devin/sample-agent/package.json
  • nodejs/langchain/sample-agent/package.json
  • nodejs/perplexity/sample-agent/package.json
  • python/crewai/sample_agent/pyproject.toml
  • python/observability-with-azure-monitor/pyproject.toml
  • python/observability-with-langgraph/pyproject.toml
  • python/observability-with-otlp/pyproject.toml

Comment on lines +195 to +199
catch (Exception)
{
// No exception bodies/inner exceptions: identity SDK and HTTP failures can contain credentials.
throw new InvalidOperationException("Observability app token acquisition failed; check OBS configuration, credentials and application authorization.");
}
Comment on lines +256 to +266
foreach (var claimName in new[] { "appid", "azp" })
{
if (claims.TryGetProperty(claimName, out var clientId))
{
hasClientId = true;
if (!string.Equals(clientId.GetString(), _options.AgentId, StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException();
}
}
}
}

private static string Fixture(string file) =>
File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "ObservabilityFixtures", file));

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.

🟡 Changes recommended

The new OBS-only token helper has an opaque error message (“not a ******”) across multiple samples and the .NET managed-identity assertion scope is likely incorrect without the /.default suffix.

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

Pull request overview

This PR standardizes Agent 365 observability (OBS) export across the repository to use S2S-only ingestion (/observabilityService), and introduces isolated app-only token providers for interactive samples so OBS authentication is kept separate from business MCP/Graph/OBO authentication.

Changes:

  • Adds/updates sample-local OBS app-token resolvers (blueprint FMI → agent client_credentials) and wires them into Node.js, Python, and .NET sample observability configuration.
  • Removes legacy “per-request export” and delegated-token fallback paths, and hardens token/expiry/identity validation behavior in samples and tests.
  • Updates READMEs, .env/appsettings templates, and adds regression coverage for route selection and configuration.
File summaries
File Description
README.md Documents S2S-only OBS routing, token requirements, and validation commands
tests/observability/test_s2s_export.py Adds mocked HTTP regression test ensuring no legacy route fallback
tests/e2e/Agent365.E2E.Tests.csproj Links shared .NET OBS token provider + fixture sources into E2E test project
python/docs/design.md Updates Python design guidance to use OBS-only token service + exporter options
python/openai/sample-agent/README.md Documents dedicated OBS credentials and flow for OpenAI Python sample
python/openai/sample-agent/pyproject.toml Raises observability core minimum to >= 1.0.0
python/openai/sample-agent/host_agent_server.py Removes delegated token exchange/caching for OBS
python/openai/sample-agent/docs/design.md Updates design to use exporter_options with S2S + OBS-only resolver
python/openai/sample-agent/agent.py Switches to OBS-only token resolver + exporter_options S2S configuration
python/openai/sample-agent/AGENT-CODE-WALKTHROUGH.md Updates walkthrough to use exporter_options + OBS-only resolver
python/openai/sample-agent/.env.template Adds AGENT365_OBS_* settings; removes legacy KAIRO flag
python/openai/sample-agent/observability_token_service.py Adds sample-local OBS-only token acquisition/cache helper
python/observability-with-otlp/README.md Adds optional A365 S2S export section + prerequisites
python/observability-with-otlp/pyproject.toml Pins observability core minimum to >= 1.0.0
python/observability-with-otlp/main.py Uses exporter_options with S2S + OBS-only resolver; stamps AgentDetails IDs
python/observability-with-otlp/.env.template Adds AGENT365_OBS_* settings for optional exporter
python/observability-with-otlp/observability_token_service.py Adds sample-local OBS-only token acquisition/cache helper
python/observability-with-langgraph/README.md Documents optional S2S export + removes stub-token narrative
python/observability-with-langgraph/pyproject.toml Pins observability core minimum to >= 1.0.0
python/observability-with-langgraph/main.py Updates to exporter_options S2S + OBS-only resolver and newer scope APIs
python/observability-with-langgraph/.env.template Adds AGENT365_OBS_* settings for optional exporter
python/observability-with-langgraph/observability_token_service.py Adds sample-local OBS-only token acquisition/cache helper
python/observability-with-azure-monitor/README.md Documents optional S2S export + removes stub-token narrative
python/observability-with-azure-monitor/pyproject.toml Pins observability core minimum to >= 1.0.0
python/observability-with-azure-monitor/main.py Uses exporter_options S2S + adds explicit baggage context for standalone demo
python/observability-with-azure-monitor/.env.template Adds AGENT365_OBS_* settings for optional exporter
python/observability-with-azure-monitor/observability_token_service.py Adds sample-local OBS-only token acquisition/cache helper
python/google-adk/sample-agent/README.md Documents OBS S2S auth + clarifies app-id vs agent-user attribution
python/google-adk/sample-agent/pyproject.toml Raises observability core minimum to >= 1.0.0
python/google-adk/sample-agent/main.py Uses exporter_options S2S + OBS-only resolver
python/google-adk/sample-agent/agent.py Uses agentic_app_id (or OBS env) instead of agent-user ID for OBS baggage
python/google-adk/sample-agent/.env.template Adds AGENT365_OBS_* settings
python/google-adk/sample-agent/observability_token_service.py Adds sample-local OBS-only token acquisition/cache helper
python/crewai/sample_agent/start_with_generic_host.py Switches to exporter_options S2S + OBS-only resolver
python/crewai/sample_agent/README.md Documents shared OBS-only resolver for both bootstraps
python/crewai/sample_agent/pyproject.toml Raises observability core minimum to >= 1.0.0
python/crewai/sample_agent/host_agent_server.py Removes delegated token exchange/caching; wires exporter_options S2S + OBS-only resolver
python/crewai/sample_agent/.env.template Adds AGENT365_OBS_* settings
python/crewai/sample_agent/observability_token_service.py Adds sample-local OBS-only token acquisition/cache helper
python/claude/sample-agent/README.md Documents dedicated OBS credentials and flow
python/claude/sample-agent/pyproject.toml Raises observability core minimum to >= 1.0.0
python/claude/sample-agent/observability_config.py Uses exporter_options S2S + OBS-only resolver
python/claude/sample-agent/host_agent_server.py Removes delegated token exchange/caching for OBS
python/claude/sample-agent/.env.template Adds AGENT365_OBS_* settings
python/claude/sample-agent/observability_token_service.py Adds sample-local OBS-only token acquisition/cache helper
python/agent-framework/sample-agent/README.md Documents required OBS-only credentials when distro export is enabled
python/agent-framework/sample-agent/host_agent_server.py Uses distro S2S + OBS-only resolver; removes delegated token exchange/caching
python/agent-framework/sample-agent/agent.py Removes legacy cached-token resolver block from agent
python/agent-framework/sample-agent/AGENT-CODE-WALKTHROUGH.md Updates observability section to distro S2S + OBS-only resolver
python/agent-framework/sample-agent/.env.template Adds required AGENT365_OBS_* settings
python/agent-framework/sample-agent/observability_token_service.py Adds sample-local OBS-only token acquisition/cache helper
python/autonomous/github-trending/observability_token_service.py Hardens OBS token acquisition expiry validation and cache behavior
python/autonomous/github-trending/main.py Fails closed when OBS token missing/expired (no empty-token fallback)
nodejs/docs/design.md Updates Node.js design guidance for S2S + OBS-only token resolver patterns
nodejs/openai/sample-agent/src/otel.ts Adds early OBS bootstrap: S2S enabled + token resolver + per-request export guard
nodejs/openai/sample-agent/src/observability-token-service.ts Adds OBS-only blueprint FMI → agent token resolver with strict validation
nodejs/openai/sample-agent/src/index.ts Imports ./otel first to ensure early OBS configuration
nodejs/openai/sample-agent/src/client.ts Removes in-module manager setup; scopes now use turn context identities
nodejs/openai/sample-agent/src/agent.ts Removes delegated token preloading; stamps agent/tenant baggage explicitly
nodejs/openai/sample-agent/README.md Documents OBS-only app auth + legacy service route behavior
nodejs/openai/sample-agent/docs/design.md Updates design docs to reference otel.ts bootstrap and resolver
nodejs/openai/sample-agent/AGENT-CODE-WALKTHROUGH.md Updates walkthrough for new bootstrap + scope signature changes
nodejs/openai/sample-agent/.env.template Adds AGENT365_OBS_* settings; removes custom resolver toggle
nodejs/langchain/sample-agent/src/observability-token-service.ts Adds OBS-only token resolver helper
nodejs/langchain/sample-agent/src/index.ts Distro S2S enabled + durable delivery replay disabled + OBS-only resolver
nodejs/langchain/sample-agent/src/client.ts Uses turnContext/env tenant+agent IDs for attribution
nodejs/langchain/sample-agent/src/agent.ts Removes delegated token preload logic
nodejs/langchain/sample-agent/README.md Documents OBS-only app auth and S2S exporter behavior
nodejs/langchain/sample-agent/package.json Bumps @microsoft/opentelemetry to ^1.4.0
nodejs/langchain/sample-agent/docs/design.md Updates design docs package references for distro usage
nodejs/langchain/sample-agent/Agent-Code-Walkthrough.md Updates walkthrough imports and scope signature
nodejs/langchain/sample-agent/.env.example Adds AGENT365_OBS_* settings; removes legacy resolver toggle
nodejs/vercel-sdk/sample-agent/src/otel.ts Adds early OBS bootstrap for legacy SDK family + per-request export guard
nodejs/vercel-sdk/sample-agent/src/index.ts Imports ./otel first
nodejs/vercel-sdk/sample-agent/src/client.ts Uses turnContext identities and user details for inference scopes
nodejs/vercel-sdk/sample-agent/src/agent.ts Passes turnContext into client factory for correct attribution
nodejs/vercel-sdk/sample-agent/README.md Documents OBS-only app auth and legacy route selection
nodejs/vercel-sdk/sample-agent/docs/design.md Pins observability package version reference to preview.125
nodejs/vercel-sdk/sample-agent/.env.example Adds AGENT365_OBS_* settings
nodejs/perplexity/sample-agent/src/otel.ts Adds early OBS bootstrap for legacy SDK family + per-request export guard
nodejs/perplexity/sample-agent/src/index.ts Imports ./otel first
nodejs/perplexity/sample-agent/README.md Documents pinned legacy SDK family + OBS-only app auth
nodejs/perplexity/sample-agent/package.json Pins preview.115 dependencies, adds Node >=22 engines, adds @opentelemetry/core
nodejs/perplexity/sample-agent/docs/design.md Documents otel.ts bootstrap + OBS-only app auth settings
nodejs/perplexity/sample-agent/.env.template Adds AGENT365_OBS_* settings and removes legacy flags
nodejs/devin/sample-agent/src/utils.ts Adds caller details + normalizes tenant/agent ID sourcing for OBS
nodejs/devin/sample-agent/src/otel.ts Adds early OBS bootstrap + per-request export guard
nodejs/devin/sample-agent/src/observability-token-service.ts Adds OBS-only token resolver helper
nodejs/devin/sample-agent/src/index.ts Imports ./otel first; keeps shutdown hook for ObservabilityManager
nodejs/devin/sample-agent/src/agent.ts Removes in-constructor OBS init; improves scope disposal/error recording
nodejs/devin/sample-agent/README.md Documents pinned legacy SDK family + OBS-only app auth
nodejs/devin/sample-agent/package.json Pins preview.115 deps, adds @opentelemetry/core, updates deps
nodejs/devin/sample-agent/docs/design.md Documents otel.ts bootstrap + pinned SDK family
nodejs/devin/sample-agent/.env.example Adds AGENT365_OBS_* settings; removes legacy flags
nodejs/copilot-studio/sample-agent/src/otel.ts Adds early OBS bootstrap + per-request export guard
nodejs/copilot-studio/sample-agent/src/index.ts Imports ./otel first
nodejs/copilot-studio/sample-agent/src/client.ts Refactors scope creation to include baggage + explicit disposal/error recording
nodejs/copilot-studio/sample-agent/src/agent.ts Removes delegated token preload; builds baggage explicitly with IDs
nodejs/copilot-studio/sample-agent/README.md Documents pinned legacy SDK family + OBS-only app auth
nodejs/copilot-studio/sample-agent/package.json Pins preview.115 deps, adds Node >=22 engines, adds @opentelemetry/core
nodejs/copilot-studio/sample-agent/.env.template Adds AGENT365_OBS_* settings; removes legacy resolver toggle
nodejs/claude/sample-agent/src/otel.ts Enables distro S2S + uses OBS-only resolver
nodejs/claude/sample-agent/src/client.ts Removes blueprint secret from subprocess env; uses turnContext/env IDs for scopes
nodejs/claude/sample-agent/README.md Documents OBS-only app auth and distro configuration
nodejs/claude/sample-agent/docs/design.md Updates distro snippet to include S2S + token resolver
nodejs/claude/sample-agent/.env.template Adds AGENT365_OBS_* settings
nodejs/autonomous/github-trending/src/observability-token-service.ts Requires real expiry for cached OBS tokens; sanitizes error bodies
nodejs/autonomous/github-trending/src/index.ts Fails closed if OBS token missing/expired; removes empty-token fallback
dotnet/shared/Observability/ObservabilityAppTokenFactory.cs Adds managed-identity assertion wiring for shared OBS-only token provider
dotnet/w365-computer-use/sample-agent/W365ComputerUseSample.csproj Adds Azure.Identity alias and links shared Observability sources
dotnet/w365-computer-use/sample-agent/Telemetry/ObservabilityServiceCollectionExtensions.cs Uses S2S endpoint + injects dedicated OBS token resolver
dotnet/w365-computer-use/sample-agent/Telemetry/A365OtelWrapper.cs Removes delegated token registration/caching path for OBS
dotnet/w365-computer-use/sample-agent/README.md Documents Agent365Observability config + deployment guidance
dotnet/w365-computer-use/sample-agent/Program.cs Wires shared OBS-only app token provider into OpenTelemetry config
dotnet/w365-computer-use/sample-agent/appsettings.json Adds BlueprintClientId/Secret + managed identity knobs
dotnet/w365-computer-use/sample-agent/Agent/MyAgent.cs Removes exporter token cache dependencies from agent constructor/calls
dotnet/semantic-kernel/sample-agent/SemanticKernelSampleAgent.csproj Adds Azure.Identity alias and links shared Observability sources
dotnet/semantic-kernel/sample-agent/README.md Documents dedicated OBS-only credentials and S2S configuration
dotnet/semantic-kernel/sample-agent/Program.cs Injects shared OBS-only resolver and enables S2S on exporter
dotnet/semantic-kernel/sample-agent/appsettings.json Adds Agent365Observability configuration template
dotnet/docs/design.md Updates .NET design docs for shared OBS-only provider + S2S-only exporter
dotnet/autonomous/github-trending/sample-agent/Program.cs Fails closed if OBS token missing/expired (no empty-token fallback)
dotnet/agent-framework/sample-agent/README.md Documents dedicated OBS-only credentials and deployment considerations
dotnet/agent-framework/sample-agent/Program.cs Injects shared OBS-only resolver and enables S2S on exporter
dotnet/agent-framework/sample-agent/appsettings.json Replaces legacy client ID/secret fields with OBS-only settings
dotnet/agent-framework/sample-agent/AgentFrameworkSampleAgent.csproj Adds Azure.Identity alias and links shared Observability sources
dotnet/agent-framework/sample-agent/Agent/MyAgent.cs Removes delegated token registration for OBS; keeps business auth separate
agent-platforms/salesforce/apex-observability/README.md Marks endpoint-selection flag deprecated; OBS always uses S2S path
agent-platforms/salesforce/apex-observability/force-app/main/default/objects/A365_Observability_Config__mdt/fields/UseS2SEndpoint__c.field-meta.xml Deprecates legacy route flag metadata and labeling
agent-platforms/salesforce/apex-observability/force-app/main/default/classes/A365TelemetryTest.cls Adds tests asserting no legacy route fallback (including on 401)
agent-platforms/salesforce/apex-observability/force-app/main/default/classes/A365ObsConfig.cls Forces S2S route selection regardless of deprecated flag
Review details
  • Files reviewed: 141/141 changed files
  • Comments generated: 9
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +31 to +33
var assertion = await credential.GetTokenAsync(
new TokenRequestContext(["api://AzureADTokenExchange"]),
cancellationToken).ConfigureAwait(false);
raise ObservabilityTokenError(f"OBS {step} response has no access token.")
token_type = result.get("token_type")
if not isinstance(token_type, str) or token_type.lower() != "bearer":
raise ObservabilityTokenError(f"OBS {step} response is not a Bearer token.")
raise ObservabilityTokenError(f"OBS {step} response has no access token.")
token_type = result.get("token_type")
if not isinstance(token_type, str) or token_type.lower() != "bearer":
raise ObservabilityTokenError(f"OBS {step} response is not a Bearer token.")
raise ObservabilityTokenError(f"OBS {step} response has no access token.")
token_type = result.get("token_type")
if not isinstance(token_type, str) or token_type.lower() != "bearer":
raise ObservabilityTokenError(f"OBS {step} response is not a Bearer token.")
raise ObservabilityTokenError(f"OBS {step} response has no access token.")
token_type = result.get("token_type")
if not isinstance(token_type, str) or token_type.lower() != "bearer":
raise ObservabilityTokenError(f"OBS {step} response is not a Bearer token.")
raise ObservabilityTokenError(f"OBS {step} response has no access token.")
token_type = result.get("token_type")
if not isinstance(token_type, str) or token_type.lower() != "bearer":
raise ObservabilityTokenError(f"OBS {step} response is not a Bearer token.")
raise ObservabilityTokenError(f"OBS {step} response has no access token.")
token_type = result.get("token_type")
if not isinstance(token_type, str) or token_type.lower() != "bearer":
raise ObservabilityTokenError(f"OBS {step} response is not a Bearer token.")
raise ObservabilityTokenError(f"OBS {step} response has no access token.")
token_type = result.get("token_type")
if not isinstance(token_type, str) or token_type.lower() != "bearer":
raise ObservabilityTokenError(f"OBS {step} response is not a Bearer token.")
raise ObservabilityTokenError(f"OBS {step} response has no access token.")
token_type = result.get("token_type")
if not isinstance(token_type, str) or token_type.lower() != "bearer":
raise ObservabilityTokenError(f"OBS {step} response is not a Bearer token.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants