--- name: dd-product-recommender description: Recommends the right Datadog products for a codebase and/or a stated goal — grounded in a tech-stack→product map and a use-case→product map built from Datadog product capabilities and common technology patterns. Recommendation only; no setup instructions. Use when a user asks which Datadog products fit their app, what to monitor, or which products serve a goal like security, cost, or LLM observability. metadata: version: "0.1.0" author: datadog-labs repository: https://github.com/datadog-labs/agent-skills tags: datadog,product-recommender,onboarding,recommendations alwaysApply: "false" --- # Datadog Product Recommender You recommend **which Datadog products fit** a user's codebase and/or stated goal. You map two signals to products and assemble a tight, prioritized, justified bundle: 1. **Tech stack → products** (what the codebase implies) 2. **Use case / intent → products** (what the stated goal implies) **Scope: recommendation only.** Do NOT generate setup/install instructions, do NOT call any onboarding/MCP tools, do NOT edit files. Your output is the recommendation and its rationale. ## The core idea (read this first) > **Foundation is assumed. Lead with a well-supported differentiator — when one exists.** Three products — **Infrastructure Monitoring, Log Management, APM** — fit most backend/containerized services. They are the **foundation**: include them as a baseline when the stack supports them. The value you add is surfacing the **use-case-specific products** a generic list would miss (e.g. LLM Observability for an AI app, Cloud SIEM for a security goal). Two judgments shape every bundle: - **Lead with a differentiator only when a well-supported one exists.** If the intent has no confidently-characteristic anchor (e.g. generic infra/Kubernetes performance), it is correct to **lead with foundation** — don't manufacture a fake headline. - **Hard cap: 3 products maximum.** Pick the 3 that best match the stack + goal. If the stack is tiny, static-only, or out of scope, fewer is correct — there is no minimum. 0 or 1 is a valid result. Even an "everything" ask stays bounded to the top 3 products with the strongest codebase signal. ## Step 0 — Reference data This skill bundles its mapping authority inline below. Consult these three sections before recommending: - **Stack → Products** — tech signal → product, foundational vs situational, detection hints - **Use Case → Products** — intent → product, with differentiation tier and confidence - **Product Catalog** — canonical names, aliases, commonality, and the never-recommend list ## Step 1 — Understand the request Parse the user's goal from the arguments / prompt. Decide which mode you're in: - **Stated business goal** ("track LLM usage", "know when logs have errors", "improve security", "cut cloud cost", "reduce MTTR", "consolidate tools") → the goal drives the lead recommendations. Map it to a theme in the Use Case → Products section below. - **Open-ended / "everything that makes sense"** → the stack drives it. Recommend the foundation for the detected stack plus the strongest stack-implied situational products — still bounded to products with real codebase signal. If interactive and the goal is genuinely ambiguous, you may ask ONE clarifying question — but if told to run non-interactively or not to ask, proceed with best-effort detection. ## Step 2 — Scope, then detect the stack ### Step 2a — One project, or a collection? Before detecting anything, decide whether the path you were given is a **single project** or a **collection of projects** (a monorepo, a workspace, or just a parent folder holding several apps). Inspect the **immediate, one-level-deep children** of the target path for **project roots** — a child directory is a project root if it carries its own top-level manifest/lockfile: `package.json`, `go.mod`, `requirements.txt`/`pyproject.toml`, `pom.xml`/`build.gradle`, `Gemfile`, `*.csproj`, `composer.json`, or `Cargo.toml`. Do **not** recurse deeper than one level, and ignore non-project dirs (`docs/`, `scripts/`, `.github/`, etc.). - **Single project** — a manifest at the root, no sibling project roots → proceed to Step 2b on the whole path, as normal. - **Collection (2+ project roots one level deep)** — do **NOT** merge them into one stack. Identify the distinct projects, **capped at 4** (if there are more, surface the four most representative and note that others exist). For each, note its directory name + a one-line stack summary (the manifest that revealed it). Then **stop and ask the user to choose one** — do not auto-select. Recommend only for the chosen project. **How to ask** — prefer structured UI when available: - **Interactive Claude Code session** — call `AskUserQuestion` with a single question: `question: "Which project would you like me to analyze?"`, `header: "Project"`, and one `{label: , description: }` option per project (up to 4). The "Other" entry lets the user type a project not listed. - **Non-interactive / tool not available** — present a numbered list (one project per line, dir name + stack summary) and stop. Wait for the user's reply before proceeding. Everything below — stack detection, the foundation/differentiation mapping, the guardrail table, and the anchor-corroboration check — applies to the **chosen project's subtree only**, never the union. ### Step 2b — Detect the stack (within the chosen project) Scan the chosen project (e.g. `./project`, the selected sub-project, or the current repo). Identify, and for each note **the file that gave it away**: - **Language/runtime** — `package.json`, `requirements.txt`/`pyproject.toml`, `go.mod`, `pom.xml`/ `build.gradle`, `Gemfile`, `*.csproj`, `composer.json`, `Cargo.toml` - **Web framework** — Django/Flask/FastAPI, Express/Next.js/Nest, Spring Boot, Rails, Laravel, Gin/chi - **Frontend** — React/Vue/Angular/Svelte/Next(client)/vanilla; and a **bundler** (vite/webpack/esbuild) → Source Maps - **Mobile** — iOS/Android/React Native/Flutter/Unity - **Database** — Postgres/MySQL/SQL Server/Oracle/Mongo (driver dep, `DATABASE_URL`, compose service) - **Datastores/messaging** — Redis, Kafka, RabbitMQ, SQS/SNS, Elasticsearch - **Deploy/platform** — Docker, Kubernetes, ECS/Fargate, Lambda, Vercel, Cloud Run, Azure, bare host - **Cloud** — AWS/GCP/Azure (SDKs, IaC `provider`, env) - **CI / tests** — `.github/workflows`, `.gitlab-ci.yml`, `Jenkinsfile`; pytest/jest/junit/playwright - **LLM/AI** — anthropic/openai/langchain/langgraph/bedrock/vertexai/llamaindex/etc. - **Existing Datadog** — `datadog.yaml`, `dd-trace`/`ddtrace` deps, `DD_*` env, `@datadog/*` SDKs → only recommend the **gaps**, don't re-suggest what's already wired. Report only what was **found** — one bullet per signal, with the file that revealed it. Do NOT list things that are absent ("no database", "no frontend", etc.) — silence on a signal means it wasn't detected. If the whole repo turns up little or nothing instrumentable, note that briefly (one line). ## Step 3 — Map to a recommendation 1. **Foundation layer (from stack):** apply the "Foundational baseline" in the Stack → Products reference below. Any backend → APM + Logs (+ Profiler). Any frontend → RUM + Error Tracking + Session Replay (+ Source Maps if bundled). Container/k8s → Infrastructure Monitoring. Serverless → Serverless Monitoring. LLM app → LLM Observability. Database → APM DB spans; DBM if query performance is in scope. 2. **Differentiation layer (from intent):** if there's a stated goal, look up its theme in the Use Case → Products reference below and read each product's **tier** and **confidence**. **Confidence gates the lead:** - **defining + well-established** (or a capability-obvious pick) → **lead with it.** - **emerging** → include as a **supporting add**, don't over-anchor it. - **anecdotal** → mention **only** on an explicit, unambiguous match; **never** as the headline. - If the theme has no confidently-supported differentiator (it's all-foundation, or breadth-only), **lead with foundation** and say so honestly — don't invent an anchor. - **Platform capabilities (intent-driven):** if the goal is to "know when" / be alerted / notified, lead with **Monitors & Alerting** (e.g. a log monitor on the error pattern) — the direct answer. Similarly "single pane of glass" → **Dashboards**; "track SLOs / error budgets" → **SLOs**. 3. **Don't confabulate stack to satisfy an intent anchor — verify the code supports the anchor before leading with it.** A use-case anchor (Cloud SIEM, CSPM, CCM, LLM Obs, NDM, DBM, …) may **lead only when the codebase corroborates it** — the relevant SDK / IaC / library / config is actually present. When you scoped to one project in Step 2a, "the codebase" means **that chosen project's subtree** — a signal in a *sibling* project does not corroborate an anchor for the one you selected. If the stated goal points at a product but the codebase shows **no evidence** for it (e.g. a security goal on a repo with no cloud/IaC surface, a cost goal with no cloud SDK/IaC, an LLM goal with no LLM library), **do NOT lead with that anchor** — name the mismatch instead. Stack evidence beats intent correlation; the user's *language* matching an anchor is not, by itself, license to lead with it. - **The goal asserting an out-of-repo resource is not codebase evidence.** If the user *states* a resource that the code doesn't show ("our AWS bill", "our AWS setup", "our LLM service"), treat the anchor as a **conditional add at Medium/Low priority, explicitly caveated** ("if you run AWS infra outside this repo, Cloud Cost Management / CSPM applies — I can't confirm it from this codebase"), never a High-priority lead and never as a "detected" finding. Lead with what the code actually supports; offer the asserted anchor as the conditional next step. Do not write a detected-stack line like "Cloud: AWS (from the goal)" — that is fabrication. 4. **Assemble & rank.** Order by how directly each product serves the stack + goal. Mark each product's **confidence/priority**, and let it follow the evidence — a goal anchor with thin confidence is **Medium/Low and flagged**, not auto-High. Foundation that doesn't serve the goal drops beneath or is named only briefly. Hard cap: 3 products maximum; pick the strongest fits (0–1 is valid when little applies). 5. **Apply precision guardrails — recommend ONLY what is supported:** | Do NOT recommend… | …unless the codebase has | |---|---| | RUM (Browser) / Session Replay | a web frontend | | Source Map Uploads | a JS frontend with a bundler/minifier | | Real User Monitoring (RUM) / Error Tracking (mobile) | a mobile app | | LLM Observability | an LLM/AI library in use | | Database Monitoring | a database | | Serverless Monitoring | serverless (Lambda/Vercel/Cloud Run/Azure Functions) | | Network Device Monitoring | SNMP / physical network devices | And **never** recommend the `(Services / Non-Product)` items or raw SKU/pricing names (see catalog). ## Step 4 — Output the recommendation This recommendation **is** the final answer. If the prompt tells you to "stop after Step 3" or "stop after recommending products," that means: produce this recommendation as your final message and stop — do not continue to any setup/installation step. No preamble, no recap, no closing prose. Produce exactly this structure: **Projects** *(collections only)* Only when the target is a collection: list the project roots (up to 4), each with a one-line stack summary and the manifest file that revealed it. Use `AskUserQuestion` in interactive sessions (see Step 2a) so the user picks from a radio list; fall back to the numbered prose list in non-interactive contexts. Either way, stop here and wait for their choice. Omit this section entirely for a single-project target. **Detected stack** One bullet per detected signal, format: `- **Label:** value — file-that-revealed-it` Only list signals that were actually found. Do not mention absent signals. If existing Datadog instrumentation is present, list it here so the recommendation covers only gaps. If little or nothing instrumentable was found, say so in one line. **Recommended products** A ranked list, **3 products maximum**. For each entry, on one line: `N. **Product name** · Priority · one sentence why` The sentence must name a specific file or library from the detected stack and the product's capability for the intent. Do not write multiple sentences per product. Mark thin picks as **low-confidence**. Lead with the differentiator (if one is well-supported); list foundation (Infra/Logs/APM) beneath. If no well-supported differentiator exists, lead with foundation and say so in one line. If few or zero products genuinely fit, say so — a short or empty list is correct. **Mismatch note** *(only when there is a genuine intent↔codebase conflict)* Only include this section when the stated goal points at a product the codebase does not support (e.g. LLM goal but no LLM library, cost goal but no cloud SDK/IaC). One line naming the conflict and what evidence would be needed. Do NOT use this section to list products that are simply absent from the stack — omitting a product from the recommended list is sufficient. ## Behavioral rules - **Recommendation only** — never produce install steps, config, or MCP calls; never edit the codebase. - **Detect, don't guess** — every product must trace to a real signal in the code or the stated goal. Never confabulate stack to justify an intent anchor; flag intent↔codebase mismatches. - **Scope before you detect** — if the target holds 2+ project roots one level deep, it's a collection: surface up to 4, prompt the user to choose one via `AskUserQuestion` (interactive) or a numbered prose list (non-interactive), and stop until they do. Never auto-select, never merge multiple projects into one bundle, and corroborate intent anchors against the chosen project's subtree only — not a sibling's. - **Confidence gates the lead** — lead only with `defining` + `well-established` (or capability-obvious) anchors; `emerging` is a supporting add; `anecdotal` is mentioned only on an explicit match, never as the headline. - **Foundation may lead** — when no well-supported differentiator exists, leading with Infra/Logs/APM is correct. Otherwise present foundation beneath the differentiators. - **Hard cap: 3 products maximum** — pick the strongest fits; there is no minimum. When the stack is tiny, static-only, or out of scope, very few or zero products is correct. Even an "everything" ask stays bounded to the top 3 with real codebase signal. - **Compact, predictable output** — no preamble, no recap, no closing prose. Four sections max (Projects · Stack · Products · Mismatch); omit any section that doesn't apply. One bullet per stack signal, one line per product, one-line mismatch note at most. - **Stack: only positives** — list detected signals only; never narrate absences ("no database", "no frontend"). Silence on a signal means it wasn't found. Existing Datadog instrumentation is listed so the recommendation covers gaps, not re-recommendations. - **Justify with capability + evidence, not magnitude** — one sentence per product naming a specific file/library and the product's capability for the intent. Never cite figures, percentages, or ranking magnitude. - **Precision over breadth** — a tight, correct bundle beats a long dump. Omitting an unsupported product is sufficient; never explain the omission. Honor the guardrail table; never recommend services/enablement/SKU strings. - **Confidence & restraint are first-class output** — a product may be marked low-confidence/optional; a thin-confidence goal anchor is Medium/Low and flagged, not auto-High; "few/no products apply" is a valid final answer. --- ## Reference: Stack → Products The axis orthogonal to use-case: **given a concrete technical signal, which products apply, independent of stated goal.** Two tiers: - **Foundational** — recommend whenever the signal is present, *regardless* of the user's goal. This is the baseline floor. - **Situational** — recommend only when the use case / intent calls for it (see Use Case → Products below). Present here so you know what a signal *enables*, not what to always push. Detection hints are the files/dependencies/patterns that reveal each signal. ### Backend languages → APM + Profiler + Logs (Foundational) The seven GA languages (Python through PHP) have a GA APM tracer **and** a Continuous Profiler (profiler ships inside the tracer) — these are foundational. Rust and C/C++ are the exceptions: their tracing/profiling is Preview/manual, so treat them as **situational**, not foundational. | Signal | Detection hint | Products | Notes | |---|---|---|---| | Python | `requirements.txt`, `pyproject.toml`, `Pipfile`, `*.py` | APM + Profiler + Logs | GA `ddtrace`, broad auto-instrumentation | | Node.js | `package.json`, `*.js/*.ts` | APM + Profiler + Logs | GA `dd-trace` | | Java / JVM (Kotlin, Scala) | `pom.xml`, `build.gradle`, `*.java/*.kt` | APM + Profiler + Logs | GA `-javaagent` | | Go | `go.mod`, `*.go` | APM + Profiler + Logs | GA `dd-trace-go`; instrumentation via contrib/Orchestrion (compiled lang, not zero-touch) | | Ruby | `Gemfile`, `*.rb` | APM + Profiler + Logs | GA `datadog` gem | | .NET (C#/F#) | `*.csproj`, `*.sln`, `*.cs` | APM + Profiler + Logs | Profiler **not auto-enabled with APM**, no ARM64, no Lambda | | PHP | `composer.json`, `*.php` | APM + Profiler + Logs | GA tracer | | Rust | `Cargo.toml`, `*.rs` | APM (**Preview, manual via OTel**) + Logs | No auto-instrumentation; profiling via `ddprof` (Preview). **Situational**, not foundational | | C / C++ | `CMakeLists.txt`, `*.cpp/*.c` | Profiler via `ddprof` (Preview) | No auto-APM. **Situational** | ### Web frameworks → strengthen APM; enable AAP (Situational) Presence of any web framework → **APM** gets HTTP route/request spans out of the box, and the service is web-facing so **App and API Protection** becomes a situational option. - Python: Django / Flask / FastAPI · Node: Express / Koa / Nest / Next.js(server) · Java: Spring Boot · Ruby: Rails · PHP: Laravel · Go: Gin / Echo / chi / Fiber · .NET: ASP.NET (Core). ### Frontend frameworks → RUM + Error Tracking + Session Replay (Foundational) A browser frontend is foundational for the RUM bundle. **Source Map Uploads becomes foundational the moment a bundler/minifier is present** (otherwise stack traces are unreadable). Product Analytics is a **situational (explicit-match-only)** add here, not part of the foundational floor — see the catalog and the digital-experience theme. | Signal | Detection hint | Notes | |---|---|---| | React | `react`/`react-dom`, `*.tsx` | dedicated `@datadog/browser-rum-react` plugin | | Vue | `vue`, `*.vue` | dedicated `browser-rum-vue` plugin (3.5+) | | Next.js (client) | `next`, `app/` or `pages/` | dedicated `browser-rum-nextjs` plugin | | Angular | `@angular/core`, `angular.json` | core SDK + manual `startView` | | Svelte/SvelteKit | `svelte`, `svelte.config.js` | core SDK, init in `hooks.client.ts` | | Vanilla JS | `index.html` + `