diff --git a/apps/landing/src/lib/guide-highlight.ts b/apps/landing/src/lib/guide-highlight.ts index 3179a89dbf..63ff65ecb4 100644 --- a/apps/landing/src/lib/guide-highlight.ts +++ b/apps/landing/src/lib/guide-highlight.ts @@ -62,7 +62,7 @@ const exposition = (code: string) => const yaml = (code: string) => tokenize(code, [ [/#.*/y, (m) => span("comment", m[0])], - [/(?<=^|\n)(\s*-?\s*)([\w.-]+)(:)/y, (m) => escape(m[1]) + span("name", m[2]) + escape(m[3])], + [/(?<=^|\n)(\s*-?\s*)([\w./-]+)(:)/y, (m) => escape(m[1]) + span("name", m[2]) + escape(m[3])], [/"[^"\n]*"/y, (m) => span("labels", m[0])], [/\b\d+[a-z]*\b/y, (m) => span("value", m[0])], ]); diff --git a/apps/landing/src/pages/guides/dynatrace-pricing.astro b/apps/landing/src/pages/guides/dynatrace-pricing.astro new file mode 100644 index 0000000000..ed4e2e1fe4 --- /dev/null +++ b/apps/landing/src/pages/guides/dynatrace-pricing.astro @@ -0,0 +1,675 @@ +--- +import Layout from "../../layouts/Layout.astro"; +import Nav from "../../components/Nav.astro"; +import Footer from "../../components/Footer.astro"; +import BottomCTA from "../../components/BottomCTA.astro"; +import Breadcrumb from "../../components/Breadcrumb.astro"; +import FAQ from "../../components/FAQ.astro"; +import SeoHead from "../../components/SeoHead.astro"; +import TableOfContents from "../../components/TableOfContents.astro"; +import { CONTRIBUTORS } from "../../lib/changelog-meta"; +import { highlight } from "../../lib/guide-highlight"; + +const pageTitle = "Dynatrace pricing: DPS rate card and cost per host | Maple"; +const pageDescription = + "Dynatrace pricing explained: the DPS rate card, cost per host and per GiB, what OpenTelemetry data costs, and a worked monthly bill for a small fleet."; +const published = "2026-10-19"; +const updated = "2026-10-20"; +const updatedLabel = "October 20, 2026"; +const verified = "2026-10-20"; +const author = CONTRIBUTORS.jeremyfunk; +const authorUrl = `https://github.com/${author.github}`; + +const toc = [ + { depth: 2, slug: "how-it-works", text: "How Dynatrace pricing works" }, + { depth: 3, slug: "commitment", text: "The annual commitment" }, + { depth: 3, slug: "not-published", text: "What isn't published" }, + { depth: 2, slug: "rate-card", text: "The rate card" }, + { depth: 3, slug: "per-host", text: "Cost per host" }, + { depth: 3, slug: "kubernetes", text: "Kubernetes and containers" }, + { depth: 3, slug: "data", text: "Logs, traces and metrics" }, + { depth: 3, slug: "front-end", text: "RUM and synthetic" }, + { depth: 2, slug: "example", text: "A worked monthly bill" }, + { depth: 3, slug: "retention-choice", text: "The retention choice" }, + { depth: 3, slug: "levers", text: "What moves the bill" }, + { depth: 2, slug: "opentelemetry", text: "OpenTelemetry data" }, + { depth: 3, slug: "otel-traces", text: "Which traces are included" }, + { depth: 3, slug: "otel-collector", text: "Drop data in the Collector" }, + { depth: 2, slug: "vs-new-relic", text: "Dynatrace vs New Relic" }, + { depth: 2, slug: "maple", text: "Maple's pricing" }, +]; +const sectionNav = toc.filter((h) => h.depth === 2); + +// One color per kind of meter, used by every badge, chart and table on the page. +const meters = { + hosts: { name: "Hosts", color: "var(--chart-1)" }, + data: { name: "Data", color: "var(--chart-2)" }, + frontEnd: { name: "Front end", color: "var(--chart-3)" }, +} as const; +type Meter = keyof typeof meters; + +const HOURS = 730; +const usd = (n: number) => `$${n.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; + +const rateCard: { meter: Meter; capability: string; price: string; month?: string }[] = [ + { meter: "hosts", capability: "Full-Stack Monitoring", price: "$0.01 per memory-GiB-hour", month: "$58.40 a month for an 8 GiB host" }, + { meter: "hosts", capability: "Infrastructure Monitoring", price: "$0.04 per host-hour, any size", month: "$29.20 a month per host" }, + { meter: "hosts", capability: "Foundation & Discovery", price: "$0.01 per host-hour, any size", month: "$7.30 a month per host" }, + { meter: "hosts", capability: "Database Monitoring", price: "$0.11 per database-instance-hour", month: "$80.30 a month per instance" }, + { meter: "hosts", capability: "Kubernetes Platform Monitoring", price: "$0.002 per pod-hour, any size", month: "$1.46 a month per pod" }, + { meter: "hosts", capability: "Code Monitoring", price: "$0.005 per container-hour", month: "$3.65 a month per container" }, + { meter: "data", capability: "Logs: ingest & process", price: "$0.20 per GiB" }, + { meter: "data", capability: "Logs: retain", price: "$0.0007 per GiB-day" }, + { meter: "data", capability: "Logs: query", price: "$0.0035 per GiB scanned" }, + { meter: "data", capability: "Logs: retain with included queries", price: "$0.02 per GiB-day" }, + { meter: "data", capability: "Traces and events: ingest / retain / query", price: "$0.20 per GiB / $0.0007 per GiB-day / $0.0035 per GiB scanned" }, + { meter: "data", capability: "Metrics: ingest & process", price: "$0.15 per 100,000 data points", month: "queries included" }, + { meter: "frontEnd", capability: "Real User Monitoring", price: "$0.00225 per session", month: "$2.25 per 1,000 sessions" }, + { meter: "frontEnd", capability: "RUM with Session Replay", price: "$0.0045 per replay capture", month: "$4.50 per 1,000 replays" }, + { meter: "frontEnd", capability: "Browser monitor or clickpath", price: "$0.0045 per synthetic action", month: "$4.50 per 1,000 actions" }, + { meter: "frontEnd", capability: "HTTP monitor", price: "$0.001 per synthetic request", month: "$1 per 1,000 requests" }, +]; + +// Full-Stack cost per host by RAM, against the flat Infrastructure and Foundation prices. +const hostSizes = [2, 4, 8, 16, 32, 64].map((gib) => ({ gib, billed: Math.max(gib, 4), month: Math.max(gib, 4) * HOURS * 0.01 })); +const hostMax = hostSizes[hostSizes.length - 1].month; +const infraMonth = HOURS * 0.04; +const foundationMonth = HOURS * 0.01; + +// The worked example: one fleet, list prices, 730 host-hours and 30 days of data. +const bill: { meter: Meter; line: string; calc: string; amount: number }[] = [ + { meter: "hosts", line: "Full-Stack, 6 app hosts", calc: `6 × 16 GiB × ${HOURS} h × $0.01`, amount: 6 * 16 * HOURS * 0.01 }, + { meter: "hosts", line: "Infrastructure, 4 utility hosts", calc: `4 × ${HOURS} h × $0.04`, amount: 4 * HOURS * 0.04 }, + { meter: "data", line: "Log ingest & process", calc: "300 GiB × $0.20", amount: 300 * 0.2 }, + { meter: "data", line: "Log retain, included queries", calc: "300 GiB × 30 days × $0.02", amount: 300 * 30 * 0.02 }, + { meter: "data", line: "Traces and metrics", calc: "within the hosts' included volume", amount: 0 }, + { meter: "frontEnd", line: "Real User Monitoring", calc: "100,000 sessions × $0.00225", amount: 100_000 * 0.00225 }, + { meter: "frontEnd", line: "HTTP monitors", calc: "5 × 8,640 requests × $0.001", amount: 5 * 8640 * 0.001 }, +]; +const billTotal = bill.reduce((sum, b) => sum + b.amount, 0); + +const levers = [ + ["Monitoring mode per host", "Full-Stack only where you need traces and code-level data. A 64 GiB cache host costs $467.20 a month in Full-Stack and $29.20 in Infrastructure."], + ["OneAgent 1.301 on Kubernetes nodes", "From that version, pods on Full-Stack hosts are covered by the host price instead of billed per pod-hour."], + ["Retention per log bucket", "Included queries for logs that dashboards and alerts read every day, pay-per-query for audit logs kept for years."], + ["Synthetic frequency and locations", "Every location multiplies every check. One HTTP check a minute from five locations is 216,000 requests, $216 a month."], + ["Budgets and cost monitors", "Dynatrace's cost management tools set budgets against the commitment, flag anomalies and forecast to the end of the period."], + ["Size the commitment from a trial", "Run the trial on real traffic, read consumption per capability in Account Management, and commit to that rather than a host count."], +]; + +const dropDebugConfig = `receivers: + otlp: + protocols: + http: + endpoint: 0.0.0.0:4318 + +processors: + filter/drop-debug: + error_mode: ignore + logs: + log_record: + - severity_number < SEVERITY_NUMBER_INFO + cumulative_to_delta: + max_staleness: 25h + +exporters: + otlp_http/dynatrace: + endpoint: "https://\${env:DT_ENVIRONMENT_ID}.live.dynatrace.com/api/v2/otlp" + headers: + Authorization: "Bearer \${env:DT_PLATFORM_TOKEN}" + +service: + pipelines: + traces: + receivers: [otlp] + exporters: [otlp_http/dynatrace] + logs: + receivers: [otlp] + processors: [filter/drop-debug] + exporters: [otlp_http/dynatrace] + metrics/dynatrace: + receivers: [otlp] + processors: [cumulative_to_delta] + exporters: [otlp_http/dynatrace]`; + +const mapleExporterConfig = `exporters: + otlp_http/maple: + endpoint: "https://ingest.maple.dev" + headers: + Authorization: "Bearer \${env:MAPLE_INGEST_KEY}" + +service: + pipelines: + traces: + exporters: [otlp_http/dynatrace, otlp_http/maple] + logs: + exporters: [otlp_http/dynatrace, otlp_http/maple] + metrics/maple: + receivers: [otlp] + exporters: [otlp_http/maple]`; + +const faqs = [ + { + question: "How much does Dynatrace cost per host?", + answer: + "At list price, Full-Stack Monitoring is $0.01 per memory-GiB-hour with a 4 GiB minimum, so an 8 GiB host running all month (730 hours) is $58.40 and a 16 GiB host is $116.80. Infrastructure Monitoring is $0.04 per host-hour for any size host ($29.20 a month) and Foundation & Discovery is $0.01 per host-hour ($7.30). Prices last verified 2026-10-20 on dynatrace.com/pricing.", + }, + { + question: "Is Dynatrace free?", + answer: + "No. Dynatrace has no free plan. There is a 15-day free trial with no credit card required, and a Playground with sample data that needs no installation. Production use runs on a Dynatrace Platform Subscription with a minimum annual spend.", + }, + { + question: "What is DPS in Dynatrace?", + answer: + "DPS is the Dynatrace Platform Subscription. You commit to a minimum annual spend, typically on a 1 to 3 year contract, and every capability you use (host-hours, GiB of logs, sessions, queries) draws down that commitment at the prices on your rate card. Every generally available capability is included; there are no modules to buy and no per-seat fees.", + }, + { + question: "What is the minimum Dynatrace commitment?", + answer: + "Dynatrace does not publish it. The pricing page and licensing docs say DPS requires a minimum annual spend commitment, set in your order form with sales. The discount for a larger commitment is not published either.", + }, + { + question: "What happens if I use more than my Dynatrace commitment?", + answer: + "Dynatrace says it never charges penalty-style overages. Usage beyond the commitment is billed monthly on demand at the same rates as prepaid usage, or you can raise the commitment to get a lower unit price.", + }, + { + question: "Is Dynatrace cheaper than New Relic?", + answer: + "It depends on what drives your bill. Dynatrace charges for monitored hosts by memory and hour plus data volume, with no per-seat fees. New Relic charges per GB ingested after 100 GB free each month, plus a monthly fee per core or full platform user. A large team on a small fleet tends to favour Dynatrace's model; many hosts and a few engineers tends to favour New Relic's.", + }, +]; + +const siteUrl = Astro.site?.toString().replace(/\/$/, "") ?? "https://maple.dev"; +const articleJsonLd = { + "@context": "https://schema.org", + "@type": "TechArticle", + headline: "Dynatrace pricing, explained", + description: pageDescription, + datePublished: published, + dateModified: updated, + author: { "@type": "Person", name: author.name, url: authorUrl }, + publisher: { + "@type": "Organization", + name: "Maple", + logo: { "@type": "ImageObject", url: `${siteUrl}/logo192.png` }, + }, + mainEntityOfPage: `${siteUrl}/guides/dynatrace-pricing`, +}; +--- + + + +