Improve user experience & AI readability of the Azure Container Apps Instrumentation page by migrating to Customizable Docs - #38440
Conversation
…page Replace the separate in-container and sidecar per-language pages with one filterable Cdocs page driven by instrumentation_method and prog_lang content filters. Extract shared serverless-init content into Markdoc partials, add the instrumentation_method trait and serverless option groups, and remove the now orphaned _index translations. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e nav The per-method pages are consolidated into the single Azure Container Apps Cdocs page, so the child nav items are no longer needed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The ACA instrumentation docs were consolidated from ~16 separate pages (7 runtimes x 2 methods, plus method indexes) into a single Cdocs page driven by runtime + instrumentation-method filters. On one page, all variants "lie flat" in the plaintext/.md version that AI agents (and the serverless llms.txt) consume, so this adds structure back: - Add a heading to each of the 14 content-filter variants (for example "### In-Container: Ruby") so the page exposes stable per-variant anchors (#in-container-ruby, mirroring the former per-variant URLs) and clear section delimiters in the flat plaintext. Headings live inside the filter blocks, so the table of contents stays trait-aware for human readers (verified against the cdocs headings/TOC behavior). - Add `description` frontmatter to improve the serverless llms.txt entry and answer-engine optimization. - Rename the comparison section title to "In-Container vs. Sidecar". Verified with `make build-cdocs` (compiles cleanly; headings render as anchored <h3> inside the filter blocks). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This comment has been minimized.
This comment has been minimized.
Bring the ACA Cdocs migration up to date with master (was 728 commits behind). Conflict resolutions: - content/en/serverless/azure_container_apps/sidecar/nodejs.md: kept deleted. The migration consolidates all sidecar/runtime pages into the single Cdocs page; master's only change to it (#38081, GCP->Azure reference fixes) is already reflected in the consolidated page's partials. - content/.gitignore: union of both sides (kept the ACA _index.md ignore plus master's new cpp / observability_pipelines / session_replay entries). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
removing this file, and all succeeding language-specific files and adding the information to _index.mdoc.md to be accessed using cdocs filtering.
There was a problem hiding this comment.
deleting old language specific guides as we got instruction that new cdocs implementation will be translated to target languages via phase.
ava-silver
left a comment
There was a problem hiding this comment.
One question about the consolidated ACA content.
|
|
||
| | Variable | Description | Container | | ||
| | ------------------------ | ----------- | --------- | | ||
| | `DD_API_KEY` | [Datadog API key](https://app.datadoghq.com/organization-settings/api-keys) - **Required** | Sidecar container | |
There was a problem hiding this comment.
The ACA sidecar table no longer lists DD_AZURE_SUBSCRIPTION_ID and DD_AZURE_RESOURCE_GROUP, although the legacy partial required both for containerapp, can we fix that?
|
|
||
| {% /collapse-content %} | ||
|
|
||
| ## Setup |
There was a problem hiding this comment.
Should this page still state the Azure Integration prerequisite before setup? The further-reading card may be sufficient, but the previous in-container and sidecar landing pages explicitly made it the first step.
There was a problem hiding this comment.
Ah you are right. At least for this PR, I think it would be best to preserve that. I will make the change
Add DD_AZURE_SUBSCRIPTION_ID and DD_AZURE_RESOURCE_GROUP to the sidecar serverless-init env vars table to match the in-container table and the current published documentation. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a prerequisite note to set up the Azure Integration before instrumentation, matching the current published documentation. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ava-silver
left a comment
There was a problem hiding this comment.
overall lgtm, nothing looks like a regression here -- I think there are some things we could do to improve but that's out of scope for this PR
Add a sentence after the prerequisite explaining that the setup instruments the application with serverless-init to enable tracing, enhanced metrics, custom metrics, and direct log collection. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
|
||
| {% /collapse-content %} | ||
|
|
||
| ## Setup |
There was a problem hiding this comment.
One other thing an agent found:
The previous page documented that Serverless Agent instrumentation provides enhanced metrics, linked to the metrics reference, and identified the azure.app_containerapps.enhanced.* namespace. Could we restore that guidance here? Without it, users can no longer discover the enhanced metrics capability or know which namespace to query.
Note that enhanced metrics use the azure.app_containerapps.enhanced.* namespace, linking to the Azure Container Apps integration metrics section, matching the current published documentation. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Nice! Created DOCS-15245 for docs team review 🙂 |
brett0000FF
left a comment
There was a problem hiding this comment.
Looks great! Nice job on this conversion. I left a few comments and suggestions for you to consider.
As we discussed, the main loss for agent-friendliness will be the generated .md page size, but I think the tradeoff is worth it given the content improvements for both humans and agents. And this will inherently resolve after we migrate off of Hugo.
There was a problem hiding this comment.
Can you please revert the deletion of non-english pages? It's better for these to exist until the non-English cdocs pages are translated. Otherwise, we temporarily only have English content.
| {% step title="Set up logs" %} | ||
| To enable logging, set the environment variable `DD_LOGS_ENABLED=true`. This allows `serverless-init` to read logs from stdout and stderr. | ||
|
|
||
| Datadog also recommends setting the environment variables `DD_LOGS_INJECTION=true` and `DD_SOURCE=nodejs` to enable advanced Datadog log parsing. |
There was a problem hiding this comment.
I believe DD_LOGS_INJECTION is for trace/log correlation whereas DD_SOURCE is for parsing? This is repeated a few times on the page. I think it would be more precise to say:
Set DD_LOGS_INJECTION=true to correlate logs and traces, and DD_SOURCE=node.js to enable language-specific parsing.
|
|
||
| | Aspect | In-Container | Sidecar | | ||
| |--------|--------------|---------| | ||
| | Deployment | One container (your app, wrapped with the Datadog Agent) | Two containers (your app, Datadog Agent) | |
There was a problem hiding this comment.
Keeping punctuation consistent through the table.
| | Deployment | One container (your app, wrapped with the Datadog Agent) | Two containers (your app, Datadog Agent) | | |
| | Deployment | One container (your app, wrapped with the Datadog Agent). | Two containers (your app, Datadog Agent). | |
| text: "Azure Integration" | ||
| --- | ||
|
|
||
| {% collapse-content title="In-Container vs. Sidecar" level="h5" %} |
There was a problem hiding this comment.
Nothing wrong with the existing approach but it would be more typical to just have an overview section. I do think we are missing a brief overview telling users about this page. Switching from a collapsed section avoids starting the page with an h5 as well, which could hurt the page structure for agents.
## Overview
Azure Container Apps is a fully managed serverless platform for deploying and scaling
containerized applications. Datadog monitors Container Apps in two layers:
- The Azure integration collects standard metrics and logs.
- The Datadog `serverless-init` Agent adds distributed tracing, enhanced metrics, custom
metrics, and direct log collection.
Instrument your application with `serverless-init` in one of two ways:
- **In-container**: Wraps your application container with the Datadog Agent. Choose this
for a simpler setup, lower cost overhead, and direct log piping.
- **Sidecar**: Runs the Datadog Agent in a separate container alongside your application
container. Choose this if you have multiple containers in a single service, if you prefer
strict isolation of the Datadog Agent, or if you have performance-sensitive workloads.
There was a problem hiding this comment.
made changes to add a short overview and repositioned the collapsed section.
| } | ||
| ``` | ||
|
|
||
| Finally, run `terraform apply`, and follow any prompts. |
There was a problem hiding this comment.
Seems out of order since we include that command after a bit of exposition.
| Finally, run `terraform apply`, and follow any prompts. |
There was a problem hiding this comment.
completely agree, this is something we flagged already. we will make this change in a future PR
| The [Datadog Container App module](https://registry.terraform.io/modules/DataDog/container-app-datadog/azurerm/latest) only deploys the Container App resource, so you need to build and push your container separately. | ||
|
|
||
| See the [Environment variables](#environment-variables) section for more information on the configuration options available through the `env`. | ||
|
|
||
| Make sure the container port for the main container matches the one exposed in your Dockerfile/service. |
There was a problem hiding this comment.
These are sorta floating notes you could bullet under a lead in like "Note the following before you deploy:"
…hooting.mdoc.md Co-authored-by: Brett Blue <84536271+brett0000FF@users.noreply.github.com>
…oc.md Co-authored-by: Brett Blue <84536271+brett0000FF@users.noreply.github.com>
Co-authored-by: Brett Blue <84536271+brett0000FF@users.noreply.github.com>
Co-authored-by: Brett Blue <84536271+brett0000FF@users.noreply.github.com>
Narrow the generated-file gitignore from /*/ to /en/ so it only ignores the compiled English _index.md, and restore the Spanish, Japanese, and Korean _index.md pages that the broad pattern had swept into deletion. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Summary
Migrates the Azure Container Apps instrumentation docs from ~16 separate pages (7 runtimes × 2 instrumentation methods, plus the In-Container/Sidecar index pages) into a single Customizable Docs (Cdocs) page driven by Runtime and Instrumentation method filters — then adds structure so the consolidated page stays friendly to AI agents and answer engines.
Now ready to Merge
Why
llms.txt) receives the entire page "flat." Without added structure, an agent has to self-select the right variant out of one large page.What changed
Migration (
a29c7a64be,90aad733c4)_index.mdoc.mdwithcontent_filtersforinstrumentation_methodandprog_lang; the former per-variant URLs are preserved asaliases.AI-readability additions (
985b05799e)### In-Container: Ruby), giving the consolidated page stable anchors (#in-container-ruby, mirroring the old per-variant URLs) and clear section delimiters in the flat plaintext/.mdthat agents consume. Headings live inside the filter blocks, so the table of contents stays trait-aware for human readers.descriptionfrontmatter — improves the serverlessllms.txtentry and answer-engine optimization (the page previously had none).Validation
make build-cdocscompiles cleanly (108 Markdoc files).<h3>inside eachcdoc__toggleableblock; the TOC updates per active filter (consistent with the cdocs headings/TOC behavior).Not addressed here (for discussion)
Whether consolidating ~16 pages into one 14-variant page crosses the Cdocs "overuse" / long-page threshold (page weight, "Copy page" token cost) is a separate question for the Cdocs / AI-readability team — this PR does not split the page. (Done, docs team concluded that the page length does not exceed the expected limit)
🤖 Generated with Claude Code