Skip to content

Support S2S#4

Merged
nikhilNava merged 3 commits intomainfrom
nikhilc/supportS2S
Oct 29, 2025
Merged

Support S2S#4
nikhilNava merged 3 commits intomainfrom
nikhilc/supportS2S

Conversation

@nikhilNava
Copy link
Copy Markdown
Contributor

task
Support S2S

Copilot AI review requested due to automatic review settings October 29, 2025 20:23
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 adds support for using a Service-to-Service (S2S) endpoint in the Agent365 exporter. The change allows the exporter to route telemetry data through a different API path when the S2S endpoint is enabled.

  • Adds a new use_s2s_endpoint boolean parameter to control endpoint routing
  • Implements conditional path selection based on the S2S endpoint flag
  • Adds comprehensive test coverage for both S2S and default endpoint scenarios

Reviewed Changes

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

File Description
agent365_exporter.py Adds use_s2s_endpoint parameter and implements conditional endpoint path logic
config.py Passes through the use_s2s_endpoint parameter from kwargs to the exporter
test_agent365_exporter.py Adds two new test cases validating S2S and default endpoint path behavior
Comments suppressed due to low confidence (1)

libraries/microsoft-agents-a365-observability-core/microsoft_agents_a365/observability/core/exporters/agent365_exporter.py:40

  • The docstring comment on line 39 needs to be updated to reflect that the endpoint path can now vary based on the use_s2s_endpoint parameter. The documentation should mention both possible paths: the default /maven/agent365/agents/{agentId}/traces and the S2S path /maven/agent365/service/agents/{agentId}/traces.
    Agent365 span exporter for Agent365:
      * Partitions spans by (tenantId, agentId)
      * Builds OTLP-like JSON: resourceSpans -> scopeSpans -> spans
      * POSTs per group to https://{endpoint}/maven/agent365/agents/{agentId}/traces?api-version=1
      * Adds Bearer token via token_resolver(agentId, tenantId)

threddy
threddy previously approved these changes Oct 29, 2025
Copilot AI review requested due to automatic review settings October 29, 2025 21:42
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

Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (3)

libraries/microsoft-agents-a365-observability-core/microsoft_agents_a365/observability/core/exporters/agent365_exporter.py:1

  • The copyright header format is inconsistent with the required format. It should be 'Copyright (c) Microsoft Corporation.' followed by 'Licensed under the MIT License.' on separate lines per coding guidelines.
# Copyright (c) Microsoft. All rights reserved.

libraries/microsoft-agents-a365-observability-core/microsoft_agents_a365/observability/core/exporters/agent365_exporter.py:41

  • The class docstring should be updated to reflect the conditional endpoint path logic. Line 39 states it always POSTs to '/maven/agent365/agents/{agentId}/traces', but with the new use_s2s_endpoint parameter, it can also POST to '/maven/agent365/service/agents/{agentId}/traces'.
    """
    Agent365 span exporter for Agent365:
      * Partitions spans by (tenantId, agentId)
      * Builds OTLP-like JSON: resourceSpans -> scopeSpans -> spans
      * POSTs per group to https://{endpoint}/maven/agent365/agents/{agentId}/traces?api-version=1
      * Adds Bearer token via token_resolver(agentId, tenantId)
    """

tests/test_agent365_exporter.py:1

  • The copyright header format is inconsistent with the required format. It should be 'Copyright (c) Microsoft Corporation.' followed by 'Licensed under the MIT License.' on separate lines per coding guidelines.
# Copyright (c) Microsoft. All rights reserved.

@nikhilNava nikhilNava merged commit 8826464 into main Oct 29, 2025
14 checks passed
@nikhilNava nikhilNava deleted the nikhilc/supportS2S branch October 29, 2025 21:48
Copilot AI added a commit that referenced this pull request Mar 16, 2026
… asserts, and more

- Fix #1: Downgrade sensitive data logging from INFO to DEBUG in agent365_exporter.py
- Fix #2: Fix unpaired context.attach() in opentelemetry_scope.py add_baggage() by storing
  and detaching baggage tokens on scope end
- Fix #3: Add bounded OrderedDict caps to unbounded dicts in OpenAI trace_processor.py
- Fix #4: Replace 30 assert statements with proper TypeError raises in LangChain utils.py
- Fix #5: Log security warning when HTTP domain override is detected
- Fix #6: Warn when bearer token sent over non-HTTPS connection
- Fix #10: Respect Retry-After header and use exponential backoff in retries
- Fix #13: Rename reset() to _reset() in ObservabilityHostingManager
- Fix #15: Replace print() with logger.warning() in LangChain tracer_instrumentor.py

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>
nikhilNava added a commit that referenced this pull request Mar 17, 2026
* Initial plan

* Replace assert statements with explicit TypeError raises in langchain utils

Replace all 30 assert statements in utils.py with equivalent
if-not-raise TypeError checks. This ensures type validation is not
silently stripped when Python runs with -O (optimized mode).

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

* security: fix sensitive data logging, context leak, unbounded memory, asserts, and more

- Fix #1: Downgrade sensitive data logging from INFO to DEBUG in agent365_exporter.py
- Fix #2: Fix unpaired context.attach() in opentelemetry_scope.py add_baggage() by storing
  and detaching baggage tokens on scope end
- Fix #3: Add bounded OrderedDict caps to unbounded dicts in OpenAI trace_processor.py
- Fix #4: Replace 30 assert statements with proper TypeError raises in LangChain utils.py
- Fix #5: Log security warning when HTTP domain override is detected
- Fix #6: Warn when bearer token sent over non-HTTPS connection
- Fix #10: Respect Retry-After header and use exponential backoff in retries
- Fix #13: Rename reset() to _reset() in ObservabilityHostingManager
- Fix #15: Replace print() with logger.warning() in LangChain tracer_instrumentor.py

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Restore agent/tenant IDs and response text in exporter log messages

Agent IDs and tenant IDs are not sensitive data and are useful for
debugging. Restore them in debug/error log messages. Also restore
truncated response text in HTTP error logs to help developers debug
failures.

Log levels remain at DEBUG (from the prior security fix).

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Remove add_baggage() from OpenTelemetryScope

The method had an unpaired context.attach() that leaked context tokens.
Users should use BaggageBuilder.build() context manager instead, which
properly restores the previous context on exit.

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Security hardening for observability packages

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Fix formatting in test_agent365_exporter.py and replace remaining raise TypeError with isinstance guards in langchain utils.py

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Move _parse_retry_after to exporters/utils.py as standalone parse_retry_after function

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Replace type(e).__name__ with str(e) in exporter error logging per PR review

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* feat: add bounded collections for LangChain tracer and OutputScope

- Convert LangChain _spans_by_run from unbounded DictWithLock to
  bounded OrderedDict with _MAX_TRACKED_RUNS=10000 cap
- Add _cap_ordered_dict helper for FIFO eviction (matching OpenAI pattern)
- Add thread-safe lock usage for _spans_by_run in error handlers
- Add _MAX_OUTPUT_MESSAGES=5000 cap for OutputScope._output_messages
- Add unit tests for both bounded collections

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>
Co-authored-by: Nikhil Navakiran <nikhil.navakiran@gmail.com>
biswapm pushed a commit to biswapm/Agent365-python that referenced this pull request Mar 20, 2026
* Initial plan

* Replace assert statements with explicit TypeError raises in langchain utils

Replace all 30 assert statements in utils.py with equivalent
if-not-raise TypeError checks. This ensures type validation is not
silently stripped when Python runs with -O (optimized mode).

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

* security: fix sensitive data logging, context leak, unbounded memory, asserts, and more

- Fix microsoft#1: Downgrade sensitive data logging from INFO to DEBUG in agent365_exporter.py
- Fix microsoft#2: Fix unpaired context.attach() in opentelemetry_scope.py add_baggage() by storing
  and detaching baggage tokens on scope end
- Fix microsoft#3: Add bounded OrderedDict caps to unbounded dicts in OpenAI trace_processor.py
- Fix microsoft#4: Replace 30 assert statements with proper TypeError raises in LangChain utils.py
- Fix microsoft#5: Log security warning when HTTP domain override is detected
- Fix microsoft#6: Warn when bearer token sent over non-HTTPS connection
- Fix microsoft#10: Respect Retry-After header and use exponential backoff in retries
- Fix microsoft#13: Rename reset() to _reset() in ObservabilityHostingManager
- Fix microsoft#15: Replace print() with logger.warning() in LangChain tracer_instrumentor.py

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Restore agent/tenant IDs and response text in exporter log messages

Agent IDs and tenant IDs are not sensitive data and are useful for
debugging. Restore them in debug/error log messages. Also restore
truncated response text in HTTP error logs to help developers debug
failures.

Log levels remain at DEBUG (from the prior security fix).

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Remove add_baggage() from OpenTelemetryScope

The method had an unpaired context.attach() that leaked context tokens.
Users should use BaggageBuilder.build() context manager instead, which
properly restores the previous context on exit.

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Security hardening for observability packages

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Fix formatting in test_agent365_exporter.py and replace remaining raise TypeError with isinstance guards in langchain utils.py

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Move _parse_retry_after to exporters/utils.py as standalone parse_retry_after function

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* Replace type(e).__name__ with str(e) in exporter error logging per PR review

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

* feat: add bounded collections for LangChain tracer and OutputScope

- Convert LangChain _spans_by_run from unbounded DictWithLock to
  bounded OrderedDict with _MAX_TRACKED_RUNS=10000 cap
- Add _cap_ordered_dict helper for FIFO eviction (matching OpenAI pattern)
- Add thread-safe lock usage for _spans_by_run in error handlers
- Add _MAX_OUTPUT_MESSAGES=5000 cap for OutputScope._output_messages
- Add unit tests for both bounded collections

Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com>
Co-authored-by: Nikhil Navakiran <nikhil.navakiran@gmail.com>
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.

5 participants