Skip to content

Configure MCP gateway OpenTelemetry from observability.otlp and actions/setup trace IDs#24697

Merged
pelikhan merged 10 commits intomainfrom
copilot/configure-opentelemetry-mcp-gateway
Apr 6, 2026
Merged

Configure MCP gateway OpenTelemetry from observability.otlp and actions/setup trace IDs#24697
pelikhan merged 10 commits intomainfrom
copilot/configure-opentelemetry-mcp-gateway

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 5, 2026

gh-aw-mcpg v0.2.14 added support for OpenTelemetry OTLP tracing (spec §4.1.3.6). This wires up the gateway's opentelemetry config block automatically when observability.otlp is present in workflow frontmatter (including via imported shared workflows), correlating gateway traces under the same trace/span started by the actions/setup step.

Changes

  • pkg/parser/import_field_extractor.go — Extract observability from imported workflows using a first-wins strategy (same pattern as activationGitHubToken)
  • pkg/parser/import_processor.go — Add MergedObservability string to ImportsResult
  • pkg/workflow/compiler_types.go — Add OTLPEndpoint string to WorkflowData (the fully-resolved OTLP endpoint, set by injectOTLPConfig)
  • pkg/workflow/compiler_orchestrator_workflow.go — Before calling injectOTLPConfig, merge imported observability into RawFrontmatter when the top-level workflow has no observability section (enables shared imports like shared/observability-otlp.md)
  • pkg/workflow/observability_otlp.go — Store the resolved endpoint in workflowData.OTLPEndpoint after injection — single source of truth for all downstream code
  • pkg/workflow/tools_types.go — Replace OTLPEnabled bool with OTLPEndpoint string and OTLPHeaders string on MCPGatewayRuntimeConfig (yaml:"-", compiler-derived, not user-settable)
  • pkg/workflow/mcp_gateway_config.go — Populate OTLPEndpoint and OTLPHeaders from the fully-resolved frontmatter (including imports)
  • pkg/workflow/mcp_renderer.go — Write the opentelemetry block directly into the gateway config JSON. The endpoint is written as a literal value. Headers require a JSON object per the gateway schema, so a bash preamble is generated before the heredoc that converts OTEL_EXPORTER_OTLP_HEADERS (already a job-level env var from injectOTLPConfig) from key=value,... OTLP string format to a JSON object via node; the heredoc uses the unquoted bash variable ${_GH_AW_OTLP_HEADERS_JSON} so bash expands it to the actual object. traceId and spanId use ${GITHUB_AW_OTEL_TRACE_ID} / ${GITHUB_AW_OTEL_PARENT_SPAN_ID} which bash expands from the GITHUB_ENV values set by actions/setup.
  • pkg/workflow/mcp_setup_generator.go — Pass only GITHUB_AW_OTEL_TRACE_ID and GITHUB_AW_OTEL_PARENT_SPAN_ID to the gateway container via -e; OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_EXPORTER_OTLP_HEADERS are no longer forwarded since their values are written directly in the config

Runtime gateway config produced

# Convert OTLP headers (key=value,...) to JSON object for gateway config
_GH_AW_OTLP_HEADERS_JSON="{}"
if [ -n "${OTEL_EXPORTER_OTLP_HEADERS:-}" ]; then
  _GH_AW_OTLP_HEADERS_JSON=$(node -e '...' 2>/dev/null || echo "{}")
fi
cat << EOF | bash start_mcp_gateway.sh
{
  "gateway": {
    "port": 80,
    "domain": "...",
    "apiKey": "...",
    "payloadDir": "...",
    "opentelemetry": {
      "endpoint": "${{ secrets.GH_AW_OTEL_ENDPOINT }}",
      "headers": ${_GH_AW_OTLP_HEADERS_JSON},
      "traceId": "${GITHUB_AW_OTEL_TRACE_ID}",
      "spanId": "${GITHUB_AW_OTEL_PARENT_SPAN_ID}"
    }
  }
}
EOF

The endpoint is taken directly from the observability.otlp frontmatter and written as a literal value — GitHub Actions expressions (e.g. ${{ secrets.X }}) are preserved verbatim and expanded by the runner at execution time. Headers are converted at runtime from the OTLP key=value,... string format to a proper JSON object (as required by the gateway schema) using a generated bash preamble. GITHUB_AW_OTEL_TRACE_ID and GITHUB_AW_OTEL_PARENT_SPAN_ID are written to GITHUB_ENV by actions/setup via action_setup_otlp.cjs, making the gateway spans children of the setup span and correlating all MCP tool call traces under the workflow's root trace.

The observability.otlp config is now fully resolved including imports: a shared workflow (e.g. .github/workflows/shared/observability-otlp.md) imported by multiple workflows will correctly enable gateway OTLP tracing in each of them.

No lock files change for workflows without observability.otlp configured.



✨ PR Review Safe Output Test - Run 24007522566

💥 [THE END] — Illustrated by Smoke Claude · ● 293K ·



✨ PR Review Safe Output Test - Run 24013947849

💥 [THE END] — Illustrated by Smoke Claude · ● 186.2K ·



✨ PR Review Safe Output Test - Run 24016851157

💥 [THE END] — Illustrated by Smoke Claude · ● 205.9K ·

…ns/setup trace IDs

When observability.otlp.endpoint is set in the workflow frontmatter, the MCP gateway
config now includes an opentelemetry section (spec §4.1.3.6) with:
- endpoint from OTEL_EXPORTER_OTLP_ENDPOINT env var
- headers parsed from OTEL_EXPORTER_OTLP_HEADERS (comma-separated key=value)
- traceId from GITHUB_AW_OTEL_TRACE_ID (set by actions/setup step)
- spanId from GITHUB_AW_OTEL_PARENT_SPAN_ID (set by actions/setup step)

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/7b2ea1c3-184d-4a30-9426-2ac47eceaf54

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
// Detect OTLP configuration from observability.otlp frontmatter.
// When configured, the gateway will emit distributed traces to the OTLP collector
// using the trace/span IDs from the actions/setup step for cross-job correlation.
otlpEndpoint, _ := extractOTLPConfigFromRaw(workflowData.RawFrontmatter)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@copilot must operate on full resolved front matter with imports

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in b8188e6. buildMCPGatewayConfig now uses workflowData.OTLPEndpoint, which is the fully resolved endpoint set by injectOTLPConfig after merging observability from both the top-level frontmatter and any imported shared workflows (e.g. shared/observability-otlp.md). The observability field is now extracted from imports using a first-wins strategy (same pattern as activationGitHubToken), merged into RawFrontmatter before injectOTLPConfig runs, making it the single source of truth for all downstream code.

// - traceId: from GITHUB_AW_OTEL_TRACE_ID (set by actions/setup via GITHUB_ENV)
// - spanId: from GITHUB_AW_OTEL_PARENT_SPAN_ID (set by actions/setup via GITHUB_ENV)
// The variable is consumed by ${GH_AW_GATEWAY_OTEL} in the MCP config heredoc.
otlpEndpoint, _ := extractOTLPConfigFromRaw(workflowData.RawFrontmatter)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@copilot must operate on fully resolved front matter with imports

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in b8188e6. mcp_setup_generator.go now checks workflowData.OTLPEndpoint != "" instead of re-reading raw frontmatter. OTLPEndpoint is the fully resolved endpoint set by injectOTLPConfig, which now also picks up observability defined in imported shared workflows via the new MergedObservability field in ImportsResult.

- Add observability extraction from imported shared workflows in the imports system
  (first-wins strategy, same as activationGitHubToken)
- Before calling injectOTLPConfig, merge imported observability into RawFrontmatter
  when the top-level frontmatter has no observability section
- Store the resolved OTLP endpoint in WorkflowData.OTLPEndpoint (set by injectOTLPConfig
  as the single source of truth including imports)
- buildMCPGatewayConfig and mcp_setup_generator.go now use workflowData.OTLPEndpoint
  instead of independently re-reading raw frontmatter

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/257796c2-5f84-437a-957f-65ea15d03d61

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 5, 2026

Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw HEAD x_amd64/vet git rev-�� --show-toplevel x_amd64/vet /usr/bin/git --noprofile (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE node (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq .object.sha -bool -buildtags /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -ato�� -bool -buildtags /usr/bin/git -errorsas -ifaceassert -nilfunc git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq .object.sha se 4759786/b033/vet.cfg .cfg a/action_pins.jsgit (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha --local user.email tnet/tools/bash (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha : ${{ github.repository }} git /usr/bin/git edFeatures _types.go /home/REDACTED/.ca--show-toplevel git rev-�� --show-toplevel git /usr/bin/git --local user.email sh git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha --show-toplevel 64/pkg/tool/linux_amd64/compile /usr/bin/git g_.a k/gh-aw/gh-aw/pkrev-parse 64/pkg/tool/linu--show-toplevel git rev-�� --show-toplevel 64/pkg/tool/linux_amd64/vet /usr/bin/git _QdOprojJ (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq .object.sha -unreachable=false /tmp/go-build4134759786/b082/vet.cfg /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq .object.sha -unreachable=false /tmp/go-build4134759786/b099/vet.cfg /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet ler_orchestratorgit ler_orchestratorrev-parse ler_orchestrator--show-toplevel /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -ato�� -bool -buildtags /home/REDACTED/.config/composer/vendor/bin/bash -errorsas -ifaceassert -nilfunc bash (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq .object.sha --show-toplevel x_amd64/vet /usr/bin/git ir.go (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha -unreachable=false /tmp/go-build4134759786/b061/vet.cfg /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -c=4 -nolocalimports -importcfg /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -uns�� -unreachable=false /tmp/go-build4134759786/b246/vet.cfg /snap/bin/bash (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha -unreachable=false /tmp/go-build4134759786/b147/vet.cfg /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha ithub/workflows/agent-performance-analyzer.md -buildtags /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -ato�� -bool -buildtags /home/REDACTED/.dotnet/tools/bash -errorsas -ifaceassert -nilfunc bash (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq .object.sha ithub/workflows/agent-performance-analyzer.md /tmp/go-build4134759786/b100/vet.cfg /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq .object.sha -bool -buildtags /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -ato�� -bool -buildtags /opt/hostedtoolcache/go/1.25.8/x64/bin/bash -errorsas -ifaceassert -nilfunc bash (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq .object.sha --noprofile .cfg 64/pkg/tool/linux_amd64/vet (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE /bin/sh -c cd actions/setupGOINSECURE GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go sh (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE node /opt�� rt lint:cjs 64/bin/go GOSUMDB GOWORK 64/bin/go sh (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env n-sa1 &gt; /dev/null &amp;&amp; debian-sa1 GOINSECURE GO111MODULE r: $owner, name: $name) { hasDiscussionsEnabled } } GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0.1.2
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq .object.sha -bool -buildtags /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -uns�� -unreachable=false /tmp/go-build4134759786/b267/vet.cfg 1/x64/bin/node (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq .object.sha --slice=azure-walinuxagent-logcollector.slice .cfg 64/pkg/tool/linux_amd64/vet --property=Memorgit --property=CPUQurev-parse --property=Memor--show-toplevel 64/pkg/tool/linux_amd64/vet --no�� me) abaf2ad78164859eaa0529480aed59986 64/pkg/tool/linux_amd64/vet (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq .object.sha --slice=azure-walinuxagent-logcollector.slice .cfg 64/pkg/tool/linux_amd64/vet --property=Memorgit --property=CPUQurev-parse --property=Memor--show-toplevel 64/pkg/tool/linux_amd64/vet -40 4483/001/stability-test.md -collect-logs 64/pkg/tool/linux_amd64/asm (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v0.47.4
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq .object.sha k/gh-aw/gh-aw/.github/workflows/artifacts-summary.md -tests /usr/bin/git --local credential.usernrev-parse rgo/bin/bash git rev-�� --show-toplevel git /usr/bin/git led-with-env-tem/bin/sh gpg.program x_amd64/vet git (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq .object.sha get --local ndor/bin/bash committer.name (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha npx prettier --cGOINSECURE GOPROXY $name) { hasDiscussionsEnabled } } GOSUMDB GOWORK 64/bin/go sh -c &#34;prettier&#34; --cheGOSUMDB node 64/bin/go --write **/*.cjs 64/bin/go iptables (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq .object.sha get --local ache/go/1.25.8/x64/bin/bash committer.name (http block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI requested a review from pelikhan April 5, 2026 09:46
@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented Apr 5, 2026

@copilot review mcp gateway specification for proper implementation. There is no change needed with awf, it's all in the mcp config file

…riable

Per spec §4.1.3.6, the opentelemetry configuration belongs in the MCP
config file using ${VARIABLE_NAME} expressions (the same pattern used
for domain, apiKey, etc.). Remove the shell-built GH_AW_GATEWAY_OTEL
variable and instead render the opentelemetry object statically with
${OTEL_EXPORTER_OTLP_ENDPOINT}, ${GITHUB_AW_OTEL_TRACE_ID}, and
${GITHUB_AW_OTEL_PARENT_SPAN_ID} references. The gateway expands these
at config-load time from env vars passed via -e flags.

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/80f8d9fa-8b38-4a3e-8a2c-e49ef408b516

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 5, 2026

@copilot review mcp gateway specification for proper implementation. There is no change needed with awf, it's all in the mcp config file

Done in e4529e0. The opentelemetry block is now rendered directly in the MCP config file using ${VARIABLE_NAME} expressions — the same pattern the gateway already uses for domain, apiKey, etc.:

"opentelemetry": {
  "endpoint": "${OTEL_EXPORTER_OTLP_ENDPOINT}",
  "traceId": "${GITHUB_AW_OTEL_TRACE_ID}",
  "spanId": "${GITHUB_AW_OTEL_PARENT_SPAN_ID}"
}

The shell code that built GH_AW_GATEWAY_OTEL by parsing OTEL_EXPORTER_OTLP_HEADERS has been removed. The four OTEL env vars are still passed to the gateway container via -e so it can expand the ${...} references at config-load time and its OTLP SDK can pick up OTEL_EXPORTER_OTLP_HEADERS natively.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go ngci-lint&#34; ]; thgo GOMOD GOMODCACHE sh (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE node (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh -c npx prettier --cGOINSECURE GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go sed (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh -c npx prettier --cGOINSECURE GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go find (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha npx prettier --cGOINSECURE GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go node /opt�� prettier --check 64/bin/go --ignore-path .prettierignore 64/bin/go go (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@github-actions github-actions bot mentioned this pull request Apr 5, 2026
@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented Apr 5, 2026

@copilot do not use env variable. Write the values in tbe config file.

Endpoint and headers are available at compile time from the frontmatter
so write them as literal values in the opentelemetry config block. Only
traceId and spanId remain as ${VARIABLE_NAME} expressions since they are
set at runtime via GITHUB_ENV by actions/setup and cannot be known at
compile time. Remove OTEL_EXPORTER_OTLP_ENDPOINT and
OTEL_EXPORTER_OTLP_HEADERS from the gateway container -e flags since the
gateway reads those values directly from its config file now.

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/0ecb18c0-a493-4c1d-b078-4c19df61dd9b

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 5, 2026

@copilot do not use env variable. Write the values in tbe config file.

Done in 321d01f. The endpoint and parsed headers are now written as literal values directly in the config. Only traceId/spanId remain as ${VARIABLE_NAME} expressions since they're set at runtime via GITHUB_ENV by actions/setup and can't be known at compile time:

"opentelemetry": {
  "endpoint": "https://collector.example.com:4318/v1/traces",
  "headers": {"api-key": "myApiKey"},
  "traceId": "${GITHUB_AW_OTEL_TRACE_ID}",
  "spanId": "${GITHUB_AW_OTEL_PARENT_SPAN_ID}"
}

OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_EXPORTER_OTLP_HEADERS are no longer passed to the gateway container via -e since the gateway reads those values directly from the config.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD GOMODCACHE go env heck &#39;**/*.cjs&#39; GOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD GOMODCACHE go ache�� -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE erignore (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD GOMODCACHE go env ck &#39;**/*.cjs&#39; &#39;*GOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha heck &#39;**/*.cjs&#39; GOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env ck &#39;scripts/**/*GOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility npx prettier --check &#39;**/*.cjs&#39; GOINSECURE GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go node /hom�� --check scripts/**/*.js r: $owner, name: $name) { hasDiscussionsEnabled } } .prettierignore GOPROXY 64/bin/go go (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha -json GO111MODULE $name) { hasDiscussionsEnabled } } GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh (http block)

If you need me to access, download, or install something from one of these locations, you can either:

"payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}"
"payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}",
"opentelemetry": {
"endpoint": "${{ secrets.GH_AW_OTEL_ENDPOINT }}",
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@copilot write the headers as well

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done in eca8a58. Headers are now written as a raw string literal directly in the config (same treatment as endpoint), so ${{ secrets.GH_AW_OTEL_HEADERS }} is preserved and expanded by GitHub Actions at runtime:

"opentelemetry": {
  "endpoint": "${{ secrets.GH_AW_OTEL_ENDPOINT }}",
  "headers": "${{ secrets.GH_AW_OTEL_HEADERS }}",
  "traceId": "${GITHUB_AW_OTEL_TRACE_ID}",
  "spanId": "${GITHUB_AW_OTEL_PARENT_SPAN_ID}"
}

Switch OTLPHeaders from map[string]string to string so that GitHub
Actions expressions (${{ secrets.X }}) are preserved and written
verbatim in the config just like the endpoint. Remove the now-unused
parseOTLPHeaders helper and its tests.

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/3de8b920-c862-4a7c-982d-ea8bbd6d9a51

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 5, 2026

Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD erignore go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE /bin/sh (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE node (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE r: $owner, name: $name) { hasDiscussionsEnabled } } GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha -json GO111MODULE $name) { hasDiscussionsEnabled } } GOINSECURE GOMOD GOMODCACHE node /opt�� prettier --check 64/bin/go --ignore-path .prettierignore 64/bin/go go (http block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI requested a review from pelikhan April 5, 2026 15:41
@pelikhan pelikhan marked this pull request as ready for review April 5, 2026 15:51
Copilot AI review requested due to automatic review settings April 5, 2026 15:51
@pelikhan pelikhan added the smoke label Apr 5, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 6, 2026

✅ GitHub MCP | ✅ MCP Scripts GH CLI | ✅ Playwright | ✅ Web Fetch | ✅ File Write | ✅ Bash | ✅ Discussion | ✅ Build | ✅ Discussion Create | ✅ Dispatch | ✅ PR Review

Overall: PASS — PR #24697 by @pelikhan (assignees: @pelikhan, @Copilot)

Note

🔒 Integrity filter blocked 1 item

The following item were blocked because they don't meet the GitHub integrity level.

  • #24788 list_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
  github:
    min-integrity: approved  # merged | approved | unapproved | none

📰 BREAKING: Report filed by Smoke Copilot · ● 1.2M ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

🤖 Smoke test agent review pass. The OTLP endpoint resolution approach (storing resolved values on WorkflowData) is clean and avoids downstream raw-frontmatter re-reads. Two inline suggestions: store OTLPHeaders alongside OTLPEndpoint for consistency, and consider logging unmarshal errors for imported observability configs.

Note

🔒 Integrity filter blocked 1 item

The following item were blocked because they don't meet the GitHub integrity level.

  • #24788 list_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
  github:
    min-integrity: approved  # merged | approved | unapproved | none

📰 BREAKING: Report filed by Smoke Copilot · ● 1.2M

otlpLog.Printf("Injected OTEL env vars into workflow env block")

// Store the resolved endpoint so downstream code (mcp_gateway_config, mcp_setup_generator)
// can use workflowData.OTLPEndpoint as the single source of truth instead of
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.

🤖 Smoke test agent dropping by! Setting workflowData.OTLPEndpoint here as the single resolved source of truth is a clean approach — downstream code no longer needs to re-parse raw frontmatter. Consider also storing OTLPHeaders here similarly so both travel together through the pipeline.

SecretMasking *SecretMaskingConfig // secret masking configuration
ParsedFrontmatter *FrontmatterConfig // cached parsed frontmatter configuration (for performance optimization)
RawFrontmatter map[string]any // raw parsed frontmatter map (for passing to hash functions without re-parsing)
OTLPEndpoint string // resolved OTLP endpoint (from observability.otlp.endpoint, including imports; set by injectOTLPConfig)
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.

🤖 Smoke agent here! OTLPEndpoint is well-placed in WorkflowData. A natural follow-up would be adding OTLPHeaders string on the next line so both resolved values travel together and downstream consumers (like mcp_renderer.go) don't need separate logic to re-derive them.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 6, 2026

📰 VERDICT: Smoke Copilot has concluded. All systems operational. This is a developing story. 🎤

@github-actions

This comment has been minimized.

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

💥 Automated smoke test review - all systems nominal!

💥 [THE END] — Illustrated by Smoke Claude · ● 186.2K

"opentelemetry": {
"endpoint": "${{ secrets.GH_AW_OTEL_ENDPOINT }}",
"headers": ${_GH_AW_OTLP_HEADERS_JSON},
"traceId": "${GITHUB_AW_OTEL_TRACE_ID}",
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.

The opentelemetry config block looks good — passing traceId and spanId from env vars enables proper distributed tracing across MCP gateway spans. Consider adding a fallback or validation step if these env vars are unset (e.g., empty string), to avoid sending malformed trace context to the OTLP collector.

"payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}"
"payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}",
"opentelemetry": {
"endpoint": "${{ secrets.GH_AW_OTEL_ENDPOINT }}",
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.

The OTLP headers conversion pattern (node -e '...') with 2>/dev/null || echo "{}" is a safe fallback, but the inline node script is quite dense. A brief comment explaining the intent (converting key=value,... to JSON object) would help maintainability. The || echo "{}" fallback correctly handles node failures.

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.

🤖 Smoke agent agreeing! The inline Node.js OTLP headers conversion is self-contained and the || echo "{}" fallback is solid. A brief comment like # convert KEY=val,... to JSON object would definitely help future readers. Good catch!

📰 BREAKING: Report filed by Smoke Copilot · ● 871K

@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented Apr 6, 2026

@copilot resolve the merge conflicts in this pull request

…ntelemetry-mcp-gateway

# Conflicts:
#	pkg/workflow/observability_otlp_test.go

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 6, 2026

@copilot resolve the merge conflicts in this pull request

Done in f272c93. The conflict in observability_otlp_test.go is resolved — main added TestIsOTLPHeadersPresent, TestGenerateOTLPHeadersMaskStep, and TestInjectOTLPConfig_HeadersPresenceAfterInjection; both those and the existing TestInjectOTLPConfig_OTLPEndpointField tests are now present and passing. All 181 workflows recompiled.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw ase,codename,all-C (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw JLL30Kj/mxvHcX_M-1 (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha ath ../../../.pr**/*.json (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha ath ../../../.pr**/*.json mcp-gateway er ame (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility get cfg 64/pkg/tool/linux_amd64/vet user.name (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 6, 2026

📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing...

@github-actions github-actions bot removed the smoke label Apr 6, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 6, 2026

✅ All tools validated successfully! Agent Container Smoke Test confirms agent container is ready.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 6, 2026

🌑 The shadows whisper... Smoke Codex failed. The oracle requires further meditation...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 6, 2026

🎬 THE ENDSmoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 6, 2026

Agent Container Tool Check

Tool Status Version
bash 5.2.21
sh available
git 2.53.0
jq 1.7
yq 4.52.5
curl 8.5.0
gh 2.89.0
node 20.20.2
python3 3.12.3
go 1.24.13
java 10.0.201
dotnet 10.0.201

Result: 12/12 tools available ✅

Overall Status: PASS

🔧 Tool validation by Agent Container Smoke Test · ● 157.2K ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 6, 2026

Smoke Test: Copilot - 24016851148 ⚠️ PARTIAL PASS

Test Result
GitHub MCP
MCP Scripts GH CLI
Serena MCP
Playwright
Web Fetch
File Writing
Bash Tool
Discussion Interaction
Build gh-aw
Discussion Creation
Workflow Dispatch
PR Review

Overall: 11/12 — Serena MCP tools unavailable in this context.

PR Author: @pelikhan | Assignees: @pelikhan, @Copilot

📰 BREAKING: Report filed by Smoke Copilot · ● 871K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

🤖 Smoke test review for PR #24697 — MCP gateway OTLP configuration. The approach of resolving OTLPEndpoint onto WorkflowData is clean. Main suggestion: add OTLPHeaders alongside OTLPEndpoint so both resolved values travel together. Overall this is a solid tracing integration.

📰 BREAKING: Report filed by Smoke Copilot · ● 871K

otlpLog.Printf("Injected OTEL env vars into workflow env block")

// Store the resolved endpoint so downstream code (mcp_gateway_config, mcp_setup_generator)
// can use workflowData.OTLPEndpoint as the single source of truth instead of
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.

🤖 Smoke agent here! Setting workflowData.OTLPEndpoint as the single resolved source of truth is exactly right. For symmetry, consider storing OTLPHeaders here too so both values are resolved in one place and always travel together through the compilation pipeline.

SecretMasking *SecretMaskingConfig // secret masking configuration
ParsedFrontmatter *FrontmatterConfig // cached parsed frontmatter configuration (for performance optimization)
RawFrontmatter map[string]any // raw parsed frontmatter map (for passing to hash functions without re-parsing)
OTLPEndpoint string // resolved OTLP endpoint (from observability.otlp.endpoint, including imports; set by injectOTLPConfig)
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.

🤖 Smoke agent checking in! OTLPEndpoint as a resolved field on WorkflowData is a clean design — downstream consumers no longer need to re-parse raw frontmatter. Consider adding OTLPHeaders string on the next line so both resolved values travel together through the pipeline and mcp_renderer.go has a single source of truth for both.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 6, 2026

📰 VERDICT: Smoke Copilot has concluded. All systems operational. This is a developing story. 🎤

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 6, 2026

Smoke Test Results — Run 24016851157

Test Status
1. GitHub MCP
2. MCP Scripts GH CLI
3. Serena MCP
4. Make Build
5. Playwright
6. Tavily Search ❌ (rate limited)
7. File Writing
8. Bash Tool
9. Discussion Comment
10. Agentic Workflows MCP
11. Slack
12. Code Scanning Alert
13. Update PR
14. PR Review Comments
15. Submit PR Review
16. Resolve Thread ⚠️ skipped
17. Add Reviewer
18. Push to Branch
19. Close PR ⚠️ skipped

Overall: PARTIAL — Tavily rate-limited (429); thread resolve skipped (no node IDs); close PR skipped (no safe PR).

💥 [THE END] — Illustrated by Smoke Claude · ● 205.9K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

💥 Automated smoke test review - all systems nominal!

💥 [THE END] — Illustrated by Smoke Claude · ● 205.9K

"payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}"
"payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}",
"opentelemetry": {
"endpoint": "${{ secrets.GH_AW_OTEL_ENDPOINT }}",
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.

Smoke test review comment #1 — Run 24016851157: The OTLP headers JSON conversion using node -e is a nice portable approach. Consider adding error handling for malformed header values.

@@ -594,7 +599,13 @@ jobs:
"port": $MCP_GATEWAY_PORT,
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.

Smoke test review comment #2 — Run 24016851157: OpenTelemetry config looks good. The traceId and spanId from env vars will properly propagate spans through the MCP gateway.

@pelikhan pelikhan merged commit 563ec89 into main Apr 6, 2026
149 of 151 checks passed
@pelikhan pelikhan deleted the copilot/configure-opentelemetry-mcp-gateway branch April 6, 2026 03:08
@github-actions github-actions bot mentioned this pull request Apr 6, 2026
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