{"id":33511,"date":"2026-06-23T02:02:21","date_gmt":"2026-06-23T02:02:21","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=33511"},"modified":"2026-06-23T02:02:24","modified_gmt":"2026-06-23T02:02:24","slug":"datadog-tutorials-create-monitor-alerts-using-datadog-api","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/datadog-tutorials-create-monitor-alerts-using-datadog-api\/","title":{"rendered":"Datadog Tutorial: Create Monitors \/ Alerts using Datadog API \u2014 Step by Step"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide uses the <strong>current Datadog Monitor API v1<\/strong>, which is still the main API for creating metric, log, APM, and many other monitor types. Datadog\u2019s API docs list <code>\/api\/v1\/monitor<\/code> for create\/get\/update\/delete monitor operations, and <code>\/api\/v1\/monitor\/validate<\/code> for validating a monitor definition before creating it. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/monitors\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We will create monitors using:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl\nPython\n<span class=\"hljs-built_in\">JSON<\/span> payload files\nDatadog API keys <span class=\"hljs-keyword\">from<\/span> environment variables\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">No outdated <code>dogapi<\/code> or old legacy-only approach. We will use direct REST API and the current <code>datadog-api-client<\/code> Python library where needed.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. What is a Datadog Monitor?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>Datadog Monitor<\/strong> is an alerting rule.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It watches something like:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CPU\nMemory\nDisk\nLogs\nAPM traces\n<span class=\"hljs-built_in\">Error<\/span> rate\nLatency\nSynthetic test result\nKubernetes pod status\nCustom metric\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then it triggers alert states such as:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OK\nWarn\nAlert\nNo Data\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A monitor normally contains:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"Monitor name\"<\/span>,\n  <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"query alert\"<\/span>,\n  <span class=\"hljs-attr\">\"query\"<\/span>: <span class=\"hljs-string\">\"avg(last_5m):avg:system.cpu.user{*} &gt; 80\"<\/span>,\n  <span class=\"hljs-attr\">\"message\"<\/span>: <span class=\"hljs-string\">\"Alert message\"<\/span>,\n  <span class=\"hljs-attr\">\"tags\"<\/span>: &#91;<span class=\"hljs-string\">\"env:prod\"<\/span>, <span class=\"hljs-string\">\"team:devops\"<\/span>],\n  <span class=\"hljs-attr\">\"options\"<\/span>: {\n    <span class=\"hljs-attr\">\"thresholds\"<\/span>: {\n      <span class=\"hljs-attr\">\"critical\"<\/span>: <span class=\"hljs-number\">80<\/span>,\n      <span class=\"hljs-attr\">\"warning\"<\/span>: <span class=\"hljs-number\">70<\/span>\n    }\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For metric monitors, Datadog says any metric reporting to Datadog can be alerted on, and threshold alerts compare metric values to a static threshold over a selected time period. (<a href=\"https:\/\/docs.datadoghq.com\/monitors\/types\/metric\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Monitor API endpoint<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The main API endpoint is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">POST \/api\/v1\/monitor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Full pattern:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">https:\/\/api.<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">DATADOG_SITE<\/span>&gt;<\/span>\/api\/v1\/monitor\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">US1:     https:<span class=\"hljs-comment\">\/\/api.datadoghq.com\/api\/v1\/monitor<\/span>\nUS3:     https:<span class=\"hljs-comment\">\/\/api.us3.datadoghq.com\/api\/v1\/monitor<\/span>\nUS5:     https:<span class=\"hljs-comment\">\/\/api.us5.datadoghq.com\/api\/v1\/monitor<\/span>\nEU:      https:<span class=\"hljs-comment\">\/\/api.datadoghq.eu\/api\/v1\/monitor<\/span>\nAP1:     https:<span class=\"hljs-comment\">\/\/api.ap1.datadoghq.com\/api\/v1\/monitor<\/span>\nAP2:     https:<span class=\"hljs-comment\">\/\/api.ap2.datadoghq.com\/api\/v1\/monitor<\/span>\nGov:     https:<span class=\"hljs-comment\">\/\/api.ddog-gov.com\/api\/v1\/monitor<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog\u2019s monitor API examples use <code>DD-API-KEY<\/code> and <code>DD-APPLICATION-KEY<\/code> headers when creating monitors. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/monitors\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Required API keys<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You need:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">DD_API_KEY\nDD_APP_KEY\nDD_SITE\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog states that API requests must be authenticated. API keys are used for write\/reporting access, and application keys are also required for read operations and many API actions. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/authentication\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3.1 Export environment variables<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use this on your terminal:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> DD_SITE=<span class=\"hljs-string\">\"datadoghq.com\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> DD_API_KEY=<span class=\"hljs-string\">\"replace_with_your_datadog_api_key\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> DD_APP_KEY=<span class=\"hljs-string\">\"replace_with_your_datadog_application_key\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For Japan\/AP1 site, use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> DD_SITE=<span class=\"hljs-string\">\"ap1.datadoghq.com\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For EU:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> DD_SITE=<span class=\"hljs-string\">\"datadoghq.eu\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do <strong>not<\/strong> hardcode real keys inside scripts.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Validate API access<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">First validate your API key.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -sS -X GET <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/validate\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> | jq\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"valid\"<\/span>: <span class=\"hljs-literal\">true<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog\u2019s authentication API includes <code>GET \/api\/v1\/validate<\/code> to check whether an API key is valid; invalid keys return <code>403<\/code>. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/authentication\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Recommended folder structure<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create a small working directory:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mkdir -p datadog-monitor-api-lab\/monitors\ncd datadog-monitor-api-lab\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Recommended structure:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">datadog-monitor-api-lab\/\n\u251c\u2500\u2500 monitors\/\n\u2502   \u251c\u2500\u2500 cpu-idle-low.json\n\u2502   \u251c\u2500\u2500 apache<span class=\"hljs-number\">-5<\/span>xx-log-monitor.json\n\u2502   \u251c\u2500\u2500 apm-error-rate.json\n\u2502   \u2514\u2500\u2500 disk-space-low.json\n\u251c\u2500\u2500 create-monitor.sh\n\u251c\u2500\u2500 validate-monitor.sh\n\u251c\u2500\u2500 <span class=\"hljs-keyword\">get<\/span>-monitor.sh\n\u251c\u2500\u2500 update-monitor.sh\n\u2514\u2500\u2500 delete-monitor.sh\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Validate monitor JSON before creating<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is very important.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Before creating a monitor, use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">POST \/api\/v1\/monitor\/validate\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog provides a monitor validation endpoint and examples for validating monitor definitions before creating them. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/monitors\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create this script:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; validate-monitor.sh &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\nset -euo pipefail\n\nFILE=<span class=\"hljs-string\">\"${1:?Usage: .\/validate-monitor.sh &lt;monitor-json-file&gt;}\"<\/span>\n\ncurl -sS -X POST <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/monitor\/validate\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Content-Type: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-APPLICATION-KEY: ${DD_APP_KEY}\"<\/span> \\\n  -d @<span class=\"hljs-string\">\"${FILE}\"<\/span> | jq\nEOF\n\nchmod +x validate-monitor.sh\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Usage:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/validate-monitor.sh monitors\/cpu-idle-low.json\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If valid, Datadog usually returns an empty object or success-style response.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Create monitor script<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; create-monitor.sh &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\nset -euo pipefail\n\nFILE=<span class=\"hljs-string\">\"${1:?Usage: .\/create-monitor.sh &lt;monitor-json-file&gt;}\"<\/span>\n\ncurl -sS -X POST <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/monitor\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Content-Type: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-APPLICATION-KEY: ${DD_APP_KEY}\"<\/span> \\\n  -d @<span class=\"hljs-string\">\"${FILE}\"<\/span> | jq\nEOF\n\nchmod +x create-monitor.sh\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Usage:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/create-monitor.sh monitors\/cpu-idle-low.json\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Example 1: Create CPU monitor using Datadog API<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This monitor alerts when CPU idle is too low. Low idle means CPU is heavily used.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create JSON file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; monitors\/cpu-idle-low.json &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n{\n  <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"&#91;LAB] High CPU Usage - CPU idle below 10% by host\"<\/span>,\n  <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"query alert\"<\/span>,\n  <span class=\"hljs-string\">\"query\"<\/span>: <span class=\"hljs-string\">\"avg(last_5m):avg:system.cpu.idle{*} by {host} &lt; 10\"<\/span>,\n  <span class=\"hljs-string\">\"message\"<\/span>: <span class=\"hljs-string\">\"CPU idle is below 10% for host {{host.name}}.\\n\\nCurrent value: {{value}}\\n\\nPlease check:\\n- Top processes\\n- Recent deployments\\n- Load average\\n- Container CPU usage\\n\\nNotify: @slack-devops-alerts\"<\/span>,\n  <span class=\"hljs-string\">\"tags\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"lab:datadog-api\"<\/span>,\n    <span class=\"hljs-string\">\"monitor_type:metric\"<\/span>,\n    <span class=\"hljs-string\">\"team:devops\"<\/span>,\n    <span class=\"hljs-string\">\"env:training\"<\/span>\n  ],\n  <span class=\"hljs-string\">\"priority\"<\/span>: <span class=\"hljs-number\">3<\/span>,\n  <span class=\"hljs-string\">\"options\"<\/span>: {\n    <span class=\"hljs-string\">\"thresholds\"<\/span>: {\n      <span class=\"hljs-string\">\"critical\"<\/span>: <span class=\"hljs-number\">10<\/span>,\n      <span class=\"hljs-string\">\"warning\"<\/span>: <span class=\"hljs-number\">20<\/span>\n    },\n    <span class=\"hljs-string\">\"notify_no_data\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"include_tags\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-string\">\"new_group_delay\"<\/span>: <span class=\"hljs-number\">300<\/span>,\n    <span class=\"hljs-string\">\"renotify_interval\"<\/span>: <span class=\"hljs-number\">60<\/span>,\n    <span class=\"hljs-string\">\"require_full_window\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"notification_preset_name\"<\/span>: <span class=\"hljs-string\">\"show_all\"<\/span>\n  }\n}\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/validate-monitor.sh monitors\/cpu-idle-low.json\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/create-monitor.sh monitors\/cpu-idle-low.json\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected response includes an <code>id<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">123456789<\/span>,\n  <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"&#91;LAB] High CPU Usage - CPU idle below 10% by host\"<\/span>,\n  <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"query alert\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Save the monitor ID:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> MONITOR_ID=<span class=\"hljs-string\">\"123456789\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Example 2: Create disk space monitor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This alerts when root filesystem usage is above 85%.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; monitors\/disk-space-low.json &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n{\n  <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"&#91;LAB] Disk Usage High - Root filesystem above 85%\"<\/span>,\n  <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"query alert\"<\/span>,\n  <span class=\"hljs-string\">\"query\"<\/span>: <span class=\"hljs-string\">\"avg(last_5m):avg:system.disk.in_use{device:\/} by {host} &gt; 0.85\"<\/span>,\n  <span class=\"hljs-string\">\"message\"<\/span>: <span class=\"hljs-string\">\"Root disk usage is above 85% on {{host.name}}.\\n\\nCurrent value: {{value}}\\n\\nAction:\\n- Check large files\\n- Check logs\\n- Check Docker\/container disk usage\\n- Clean old temporary files\\n\\nNotify: @slack-devops-alerts\"<\/span>,\n  <span class=\"hljs-string\">\"tags\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"lab:datadog-api\"<\/span>,\n    <span class=\"hljs-string\">\"monitor_type:metric\"<\/span>,\n    <span class=\"hljs-string\">\"team:devops\"<\/span>,\n    <span class=\"hljs-string\">\"env:training\"<\/span>\n  ],\n  <span class=\"hljs-string\">\"priority\"<\/span>: <span class=\"hljs-number\">3<\/span>,\n  <span class=\"hljs-string\">\"options\"<\/span>: {\n    <span class=\"hljs-string\">\"thresholds\"<\/span>: {\n      <span class=\"hljs-string\">\"critical\"<\/span>: <span class=\"hljs-number\">0.85<\/span>,\n      <span class=\"hljs-string\">\"warning\"<\/span>: <span class=\"hljs-number\">0.75<\/span>\n    },\n    <span class=\"hljs-string\">\"notify_no_data\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"include_tags\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-string\">\"new_group_delay\"<\/span>: <span class=\"hljs-number\">300<\/span>,\n    <span class=\"hljs-string\">\"renotify_interval\"<\/span>: <span class=\"hljs-number\">120<\/span>,\n    <span class=\"hljs-string\">\"require_full_window\"<\/span>: <span class=\"hljs-literal\">false<\/span>\n  }\n}\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate and create:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/validate-monitor.sh monitors\/disk-space-low.json\n.\/create-monitor.sh monitors\/disk-space-low.json\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Example 3: Create Apache 5xx log monitor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This monitor watches Apache logs and alerts if 5xx errors exceed 5 logs in the last 5 minutes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Datadog log monitors evaluate indexed logs only, and log monitor queries use the same search logic as Log Explorer. Datadog also notes that log monitors have a maximum rolling window of two days. (<a href=\"https:\/\/docs.datadoghq.com\/monitors\/types\/log\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; monitors\/apache<span class=\"hljs-number\">-5<\/span>xx-log-monitor.json &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n{\n  <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"&#91;LAB] Apache 5xx Errors High by Host\"<\/span>,\n  <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"log alert\"<\/span>,\n  <span class=\"hljs-string\">\"query\"<\/span>: <span class=\"hljs-string\">\"logs(\\\"source:apache @http.status_code:&#91;500 TO 599]\\\").index(\\\"*\\\").rollup(\\\"count\\\").by(\\\"host\\\").last(\\\"5m\\\") &gt; 5\"<\/span>,\n  <span class=\"hljs-string\">\"message\"<\/span>: <span class=\"hljs-string\">\"Apache 5xx errors are high on host {{host.name}}.\\n\\nCurrent value: {{value}}\\n\\nInvestigation steps:\\n- Open Log Explorer\\n- Search: source:apache @http.status_code:&#91;500 TO 599]\\n- Group by host and URL path\\n- Check Apache error logs\\n- Check backend application health\\n\\nNotify: @slack-devops-alerts\"<\/span>,\n  <span class=\"hljs-string\">\"tags\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"lab:datadog-api\"<\/span>,\n    <span class=\"hljs-string\">\"monitor_type:log\"<\/span>,\n    <span class=\"hljs-string\">\"team:devops\"<\/span>,\n    <span class=\"hljs-string\">\"service:apache\"<\/span>,\n    <span class=\"hljs-string\">\"env:training\"<\/span>\n  ],\n  <span class=\"hljs-string\">\"priority\"<\/span>: <span class=\"hljs-number\">2<\/span>,\n  <span class=\"hljs-string\">\"options\"<\/span>: {\n    <span class=\"hljs-string\">\"thresholds\"<\/span>: {\n      <span class=\"hljs-string\">\"critical\"<\/span>: <span class=\"hljs-number\">5<\/span>,\n      <span class=\"hljs-string\">\"warning\"<\/span>: <span class=\"hljs-number\">2<\/span>\n    },\n    <span class=\"hljs-string\">\"enable_logs_sample\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-string\">\"notify_no_data\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"include_tags\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-string\">\"renotify_interval\"<\/span>: <span class=\"hljs-number\">60<\/span>,\n    <span class=\"hljs-string\">\"require_full_window\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"on_missing_data\"<\/span>: <span class=\"hljs-string\">\"resolve\"<\/span>\n  }\n}\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate and create:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/validate-monitor.sh monitors\/apache-5xx-log-monitor.json\n.\/create-monitor.sh monitors\/apache-5xx-log-monitor.json\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If your Apache logs do not have <code>@http.status_code<\/code>, use a fallback query:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">logs(<span class=\"hljs-string\">\"source:apache 500 OR 502 OR 503 OR 504\"<\/span>).index(<span class=\"hljs-string\">\"*\"<\/span>).rollup(<span class=\"hljs-string\">\"count\"<\/span>).by(<span class=\"hljs-string\">\"host\"<\/span>).last(<span class=\"hljs-string\">\"5m\"<\/span>) &gt; <span class=\"hljs-number\">5<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Example 4: Create Ubuntu failed SSH login log monitor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This alerts when failed SSH attempts exceed 10 in 5 minutes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; monitors\/ubuntu-failed-ssh-log-monitor.json &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n{\n  <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"&#91;LAB] Ubuntu Failed SSH Login Attempts High\"<\/span>,\n  <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"log alert\"<\/span>,\n  <span class=\"hljs-string\">\"query\"<\/span>: <span class=\"hljs-string\">\"logs(\\\"\\\\\\\"Failed password\\\\\\\" OR \\\\\\\"Invalid user\\\\\\\"\\\").index(\\\"*\\\").rollup(\\\"count\\\").by(\\\"host\\\").last(\\\"5m\\\") &gt; 10\"<\/span>,\n  <span class=\"hljs-string\">\"message\"<\/span>: <span class=\"hljs-string\">\"High failed SSH login activity detected on {{host.name}}.\\n\\nCurrent value: {{value}}\\n\\nInvestigation:\\n- Search logs for: \\\"Failed password\\\" OR \\\"Invalid user\\\"\\n- Check source IPs\\n- Check usernames attempted\\n- Consider firewall\/security group review\\n\\nNotify: @slack-security-alerts\"<\/span>,\n  <span class=\"hljs-string\">\"tags\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"lab:datadog-api\"<\/span>,\n    <span class=\"hljs-string\">\"monitor_type:log\"<\/span>,\n    <span class=\"hljs-string\">\"team:security\"<\/span>,\n    <span class=\"hljs-string\">\"source:ubuntu\"<\/span>,\n    <span class=\"hljs-string\">\"env:training\"<\/span>\n  ],\n  <span class=\"hljs-string\">\"priority\"<\/span>: <span class=\"hljs-number\">2<\/span>,\n  <span class=\"hljs-string\">\"options\"<\/span>: {\n    <span class=\"hljs-string\">\"thresholds\"<\/span>: {\n      <span class=\"hljs-string\">\"critical\"<\/span>: <span class=\"hljs-number\">10<\/span>,\n      <span class=\"hljs-string\">\"warning\"<\/span>: <span class=\"hljs-number\">5<\/span>\n    },\n    <span class=\"hljs-string\">\"enable_logs_sample\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-string\">\"notify_no_data\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"include_tags\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-string\">\"renotify_interval\"<\/span>: <span class=\"hljs-number\">60<\/span>,\n    <span class=\"hljs-string\">\"require_full_window\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"on_missing_data\"<\/span>: <span class=\"hljs-string\">\"resolve\"<\/span>\n  }\n}\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate and create:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/validate-monitor.sh monitors\/ubuntu-failed-ssh-log-monitor.json\n.\/create-monitor.sh monitors\/ubuntu-failed-ssh-log-monitor.json\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Example 5: Create APM service error rate monitor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">APM monitors can alert at service level on hits, errors, and latency measures. Datadog states APM metric monitors work like regular metric monitors but are tailored for APM, and Analytics monitors can alert on Indexed Spans. (<a href=\"https:\/\/docs.datadoghq.com\/monitors\/types\/apm\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This example uses Datadog APM trace metrics.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; monitors\/apm-error-rate.json &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n{\n  <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"&#91;LAB] APM Error Rate High - checkout-api\"<\/span>,\n  <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"query alert\"<\/span>,\n  <span class=\"hljs-string\">\"query\"<\/span>: <span class=\"hljs-string\">\"sum(last_5m):sum:trace.web.request.errors{service:checkout-api,env:prod}.as_count() \/ sum:trace.web.request.hits{service:checkout-api,env:prod}.as_count() * 100 &gt; 5\"<\/span>,\n  <span class=\"hljs-string\">\"message\"<\/span>: <span class=\"hljs-string\">\"APM error rate is above 5% for checkout-api in prod.\\n\\nCurrent value: {{value}}%\\n\\nCheck:\\n- APM Service Page\\n- Error traces\\n- Recent deployments\\n- Related logs\\n- Downstream dependency errors\\n\\nNotify: @slack-devops-alerts\"<\/span>,\n  <span class=\"hljs-string\">\"tags\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"lab:datadog-api\"<\/span>,\n    <span class=\"hljs-string\">\"monitor_type:apm\"<\/span>,\n    <span class=\"hljs-string\">\"service:checkout-api\"<\/span>,\n    <span class=\"hljs-string\">\"env:prod\"<\/span>,\n    <span class=\"hljs-string\">\"team:backend\"<\/span>\n  ],\n  <span class=\"hljs-string\">\"priority\"<\/span>: <span class=\"hljs-number\">1<\/span>,\n  <span class=\"hljs-string\">\"options\"<\/span>: {\n    <span class=\"hljs-string\">\"thresholds\"<\/span>: {\n      <span class=\"hljs-string\">\"critical\"<\/span>: <span class=\"hljs-number\">5<\/span>,\n      <span class=\"hljs-string\">\"warning\"<\/span>: <span class=\"hljs-number\">2<\/span>\n    },\n    <span class=\"hljs-string\">\"notify_no_data\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"include_tags\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-string\">\"renotify_interval\"<\/span>: <span class=\"hljs-number\">30<\/span>,\n    <span class=\"hljs-string\">\"require_full_window\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"new_group_delay\"<\/span>: <span class=\"hljs-number\">300<\/span>\n  }\n}\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate and create:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/validate-monitor.sh monitors\/apm-error-rate.json\n.\/create-monitor.sh monitors\/apm-error-rate.json\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Important: Replace <code>trace.web.request.errors<\/code> and <code>trace.web.request.hits<\/code> with the actual operation-specific APM metrics used by your service. Common examples are based on operation names such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.web<\/span><span class=\"hljs-selector-class\">.request<\/span><span class=\"hljs-selector-class\">.hits<\/span>\n<span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.web<\/span><span class=\"hljs-selector-class\">.request<\/span><span class=\"hljs-selector-class\">.errors<\/span>\n<span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.servlet<\/span><span class=\"hljs-selector-class\">.request<\/span><span class=\"hljs-selector-class\">.hits<\/span>\n<span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.servlet<\/span><span class=\"hljs-selector-class\">.request<\/span><span class=\"hljs-selector-class\">.errors<\/span>\n<span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.fastapi<\/span><span class=\"hljs-selector-class\">.request<\/span><span class=\"hljs-selector-class\">.hits<\/span>\n<span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.fastapi<\/span><span class=\"hljs-selector-class\">.request<\/span><span class=\"hljs-selector-class\">.errors<\/span>\n<span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.express<\/span><span class=\"hljs-selector-class\">.request<\/span><span class=\"hljs-selector-class\">.hits<\/span>\n<span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.express<\/span><span class=\"hljs-selector-class\">.request<\/span><span class=\"hljs-selector-class\">.errors<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Datadog Metrics Explorer for your actual trace metric names before finalizing.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Example 6: Create Kubernetes pod restart monitor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This alerts when Kubernetes container restarts increase.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; monitors\/kubernetes-container-restarts.json &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n{\n  <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"&#91;LAB] Kubernetes Container Restarts High\"<\/span>,\n  <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"query alert\"<\/span>,\n  <span class=\"hljs-string\">\"query\"<\/span>: <span class=\"hljs-string\">\"sum(last_10m):sum:kubernetes.containers.restarts{*} by {kube_namespace,kube_deployment} &gt; 3\"<\/span>,\n  <span class=\"hljs-string\">\"message\"<\/span>: <span class=\"hljs-string\">\"Kubernetes container restarts are high.\\n\\nNamespace: {{kube_namespace.name}}\\nDeployment: {{kube_deployment.name}}\\nCurrent value: {{value}}\\n\\nCheck:\\n- kubectl describe pod\\n- CrashLoopBackOff\\n- OOMKilled\\n- Recent deployment\\n- Application logs\\n\\nNotify: @slack-devops-alerts\"<\/span>,\n  <span class=\"hljs-string\">\"tags\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"lab:datadog-api\"<\/span>,\n    <span class=\"hljs-string\">\"monitor_type:kubernetes\"<\/span>,\n    <span class=\"hljs-string\">\"team:devops\"<\/span>,\n    <span class=\"hljs-string\">\"env:training\"<\/span>\n  ],\n  <span class=\"hljs-string\">\"priority\"<\/span>: <span class=\"hljs-number\">2<\/span>,\n  <span class=\"hljs-string\">\"options\"<\/span>: {\n    <span class=\"hljs-string\">\"thresholds\"<\/span>: {\n      <span class=\"hljs-string\">\"critical\"<\/span>: <span class=\"hljs-number\">3<\/span>,\n      <span class=\"hljs-string\">\"warning\"<\/span>: <span class=\"hljs-number\">1<\/span>\n    },\n    <span class=\"hljs-string\">\"notify_no_data\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"include_tags\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-string\">\"renotify_interval\"<\/span>: <span class=\"hljs-number\">60<\/span>,\n    <span class=\"hljs-string\">\"require_full_window\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-string\">\"new_group_delay\"<\/span>: <span class=\"hljs-number\">300<\/span>\n  }\n}\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate and create:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/validate-monitor.sh monitors\/kubernetes-container-restarts.json\n.\/create-monitor.sh monitors\/kubernetes-container-restarts.json\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Get monitor details by ID<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create script:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; get-monitor.sh &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\nset -euo pipefail\n\nMONITOR_ID=<span class=\"hljs-string\">\"${1:?Usage: .\/get-monitor.sh &lt;monitor-id&gt;}\"<\/span>\n\ncurl -sS -X GET <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/monitor\/${MONITOR_ID}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-APPLICATION-KEY: ${DD_APP_KEY}\"<\/span> | jq\nEOF\n\nchmod +x get-monitor.sh\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Usage:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">.\/<span class=\"hljs-keyword\">get<\/span>-monitor.sh 123456789\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog lists <code>GET \/api\/v1\/monitor\/{monitor_id}<\/code> for retrieving a monitor\u2019s details. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/monitors\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Search monitors<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Search monitors by query:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -sS -X GET <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/monitor\/search?query=lab:datadog-api\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-APPLICATION-KEY: ${DD_APP_KEY}\"<\/span> | jq\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog lists <code>GET \/api\/v1\/monitor\/search<\/code> for monitor search. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/monitors\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Search by name:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -sS -X GET <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/monitor\/search?query=%5BLAB%5D\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-APPLICATION-KEY: ${DD_APP_KEY}\"<\/span> | jq\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Get all monitors<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -sS -X GET <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/monitor\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-APPLICATION-KEY: ${DD_APP_KEY}\"<\/span> | jq\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog lists <code>GET \/api\/v1\/monitor<\/code> for getting all monitors. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/monitors\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Update an existing monitor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">To update a monitor, use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">PUT \/api\/v1\/monitor\/{monitor_id}\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog lists <code>PUT \/api\/v1\/monitor\/{monitor_id}<\/code> as the edit monitor endpoint. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/monitors\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create script:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; update-monitor.sh &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\nset -euo pipefail\n\nMONITOR_ID=<span class=\"hljs-string\">\"${1:?Usage: .\/update-monitor.sh &lt;monitor-id&gt; &lt;monitor-json-file&gt;}\"<\/span>\nFILE=<span class=\"hljs-string\">\"${2:?Usage: .\/update-monitor.sh &lt;monitor-id&gt; &lt;monitor-json-file&gt;}\"<\/span>\n\ncurl -sS -X PUT <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/monitor\/${MONITOR_ID}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Content-Type: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-APPLICATION-KEY: ${DD_APP_KEY}\"<\/span> \\\n  -d @<span class=\"hljs-string\">\"${FILE}\"<\/span> | jq\nEOF\n\nchmod +x update-monitor.sh\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example: change CPU critical threshold from <code>10<\/code> to <code>5<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">cp monitors\/cpu-idle-low.json monitors\/cpu-idle-low-updated.json\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Edit:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"critical\"<\/span>: <span class=\"hljs-number\">5<\/span>,\n<span class=\"hljs-string\">\"warning\"<\/span>: <span class=\"hljs-number\">15<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Also update the query:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"query\"<\/span>: <span class=\"hljs-string\">\"avg(last_5m):avg:system.cpu.idle{*} by {host} &lt; 5\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then update:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/update-monitor.sh 123456789 monitors\/cpu-idle-low-updated.json\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Delete a monitor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create script:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; delete-monitor.sh &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\nset -euo pipefail\n\nMONITOR_ID=<span class=\"hljs-string\">\"${1:?Usage: .\/delete-monitor.sh &lt;monitor-id&gt;}\"<\/span>\n\ncurl -sS -X DELETE <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/monitor\/${MONITOR_ID}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-APPLICATION-KEY: ${DD_APP_KEY}\"<\/span> | jq\nEOF\n\nchmod +x delete-monitor.sh\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Usage:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">.\/<span class=\"hljs-keyword\">delete<\/span>-monitor.sh <span class=\"hljs-number\">123456789<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog lists <code>DELETE \/api\/v1\/monitor\/{monitor_id}<\/code> for deleting a monitor. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/monitors\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Python version using current Datadog API client<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Install:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">python3 -m venv .venv\nsource .venv\/bin\/activate\npip install datadog-api-client\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; create_metric_monitor.py &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-keyword\">import<\/span> os\n<span class=\"hljs-keyword\">import<\/span> sys\n<span class=\"hljs-keyword\">from<\/span> datadog_api_client <span class=\"hljs-keyword\">import<\/span> ApiClient, Configuration\n<span class=\"hljs-keyword\">from<\/span> datadog_api_client.v1.api.monitors_api <span class=\"hljs-keyword\">import<\/span> MonitorsApi\n<span class=\"hljs-keyword\">from<\/span> datadog_api_client.v1.model.monitor <span class=\"hljs-keyword\">import<\/span> Monitor\n<span class=\"hljs-keyword\">from<\/span> datadog_api_client.v1.model.monitor_options <span class=\"hljs-keyword\">import<\/span> MonitorOptions\n<span class=\"hljs-keyword\">from<\/span> datadog_api_client.v1.model.monitor_thresholds <span class=\"hljs-keyword\">import<\/span> MonitorThresholds\n<span class=\"hljs-keyword\">from<\/span> datadog_api_client.v1.model.monitor_type <span class=\"hljs-keyword\">import<\/span> MonitorType\n\n\ndef require_env(name: str) -&gt; str:\n    value = os.getenv(name)\n    <span class=\"hljs-keyword\">if<\/span> not value:\n        print(f<span class=\"hljs-string\">\"Missing required environment variable: {name}\"<\/span>, file=sys.stderr)\n        sys.exit(<span class=\"hljs-number\">1<\/span>)\n    <span class=\"hljs-keyword\">return<\/span> value\n\n\ndef main() -&gt; None:\n    require_env(<span class=\"hljs-string\">\"DD_API_KEY\"<\/span>)\n    require_env(<span class=\"hljs-string\">\"DD_APP_KEY\"<\/span>)\n    require_env(<span class=\"hljs-string\">\"DD_SITE\"<\/span>)\n\n    configuration = Configuration()\n\n    body = Monitor(\n        name=<span class=\"hljs-string\">\"&#91;LAB] Python API - CPU idle below 10% by host\"<\/span>,\n        type=MonitorType.QUERY_ALERT,\n        query=<span class=\"hljs-string\">\"avg(last_5m):avg:system.cpu.idle{*} by {host} &lt; 10\"<\/span>,\n        message=(\n            <span class=\"hljs-string\">\"CPU idle is below 10% on {{host.name}}.\\n\\n\"<\/span>\n            <span class=\"hljs-string\">\"Current value: {{value}}\\n\\n\"<\/span>\n            <span class=\"hljs-string\">\"Check top processes and recent deployments.\\n\\n\"<\/span>\n            <span class=\"hljs-string\">\"Notify: @slack-devops-alerts\"<\/span>\n        ),\n        tags=&#91;\n            <span class=\"hljs-string\">\"lab:datadog-api\"<\/span>,\n            <span class=\"hljs-string\">\"created_by:python\"<\/span>,\n            <span class=\"hljs-string\">\"team:devops\"<\/span>,\n            <span class=\"hljs-string\">\"env:training\"<\/span>,\n        ],\n        priority=<span class=\"hljs-number\">3<\/span>,\n        options=MonitorOptions(\n            thresholds=MonitorThresholds(\n                critical=<span class=\"hljs-number\">10<\/span>,\n                warning=<span class=\"hljs-number\">20<\/span>,\n            ),\n            notify_no_data=False,\n            include_tags=True,\n            new_group_delay=<span class=\"hljs-number\">300<\/span>,\n            renotify_interval=<span class=\"hljs-number\">60<\/span>,\n            require_full_window=False,\n        ),\n    )\n\n    <span class=\"hljs-keyword\">with<\/span> ApiClient(configuration) <span class=\"hljs-keyword\">as<\/span> api_client:\n        api = MonitorsApi(api_client)\n\n        print(<span class=\"hljs-string\">\"Validating monitor...\"<\/span>)\n        api.validate_monitor(body=body)\n\n        print(<span class=\"hljs-string\">\"Creating monitor...\"<\/span>)\n        response = api.create_monitor(body=body)\n\n        print(<span class=\"hljs-string\">\"Created monitor:\"<\/span>)\n        print(response)\n\n\n<span class=\"hljs-keyword\">if<\/span> __name__ == <span class=\"hljs-string\">\"__main__\"<\/span>:\n    main()\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">python3<\/span> <span class=\"hljs-selector-tag\">create_metric_monitor<\/span><span class=\"hljs-selector-class\">.py<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog\u2019s current Python examples use <code>datadog_api_client<\/code>, <code>Configuration<\/code>, <code>ApiClient<\/code>, and <code>MonitorsApi<\/code> for monitor operations. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/monitors\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Python script to create monitor from JSON file<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is more reusable for students.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; create_monitor_from_json.py &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\nimport json\nimport os\nimport sys\nimport requests\n\n\ndef require_env(name: str) -&gt; str:\n    value = os.getenv(name)\n    <span class=\"hljs-keyword\">if<\/span> not value:\n        <span class=\"hljs-keyword\">print<\/span>(f<span class=\"hljs-string\">\"Missing required environment variable: {name}\"<\/span>, file=sys.stderr)\n        sys.<span class=\"hljs-keyword\">exit<\/span>(<span class=\"hljs-number\">1<\/span>)\n    <span class=\"hljs-keyword\">return<\/span> value\n\n\ndef main() -&gt; None:\n    <span class=\"hljs-keyword\">if<\/span> len(sys.argv) != <span class=\"hljs-number\">2<\/span>:\n        <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Usage: python3 create_monitor_from_json.py &lt;monitor-json-file&gt;\"<\/span>, file=sys.stderr)\n        sys.<span class=\"hljs-keyword\">exit<\/span>(<span class=\"hljs-number\">1<\/span>)\n\n    file_path = sys.argv&#91;<span class=\"hljs-number\">1<\/span>]\n\n    dd_site = require_env(<span class=\"hljs-string\">\"DD_SITE\"<\/span>)\n    dd_api_key = require_env(<span class=\"hljs-string\">\"DD_API_KEY\"<\/span>)\n    dd_app_key = require_env(<span class=\"hljs-string\">\"DD_APP_KEY\"<\/span>)\n\n    with open(file_path, <span class=\"hljs-string\">\"r\"<\/span>, encoding=<span class=\"hljs-string\">\"utf-8\"<\/span>) <span class=\"hljs-keyword\">as<\/span> f:\n        payload = json.load(f)\n\n    headers = {\n        <span class=\"hljs-string\">\"Accept\"<\/span>: <span class=\"hljs-string\">\"application\/json\"<\/span>,\n        <span class=\"hljs-string\">\"Content-Type\"<\/span>: <span class=\"hljs-string\">\"application\/json\"<\/span>,\n        <span class=\"hljs-string\">\"DD-API-KEY\"<\/span>: dd_api_key,\n        <span class=\"hljs-string\">\"DD-APPLICATION-KEY\"<\/span>: dd_app_key,\n    }\n\n    validate_url = f<span class=\"hljs-string\">\"https:\/\/api.{dd_site}\/api\/v1\/monitor\/validate\"<\/span>\n    create_url = f<span class=\"hljs-string\">\"https:\/\/api.{dd_site}\/api\/v1\/monitor\"<\/span>\n\n    <span class=\"hljs-keyword\">print<\/span>(f<span class=\"hljs-string\">\"Validating {file_path} ...\"<\/span>)\n    validate_response = requests.post(validate_url, headers=headers, json=payload, timeout=<span class=\"hljs-number\">30<\/span>)\n\n    <span class=\"hljs-keyword\">if<\/span> validate_response.status_code &gt;= <span class=\"hljs-number\">400<\/span>:\n        <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Validation failed:\"<\/span>)\n        <span class=\"hljs-keyword\">print<\/span>(validate_response.status_code)\n        <span class=\"hljs-keyword\">print<\/span>(validate_response.text)\n        sys.<span class=\"hljs-keyword\">exit<\/span>(<span class=\"hljs-number\">1<\/span>)\n\n    <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Validation OK. Creating monitor ...\"<\/span>)\n    create_response = requests.post(create_url, headers=headers, json=payload, timeout=<span class=\"hljs-number\">30<\/span>)\n\n    <span class=\"hljs-keyword\">if<\/span> create_response.status_code &gt;= <span class=\"hljs-number\">400<\/span>:\n        <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Create failed:\"<\/span>)\n        <span class=\"hljs-keyword\">print<\/span>(create_response.status_code)\n        <span class=\"hljs-keyword\">print<\/span>(create_response.text)\n        sys.<span class=\"hljs-keyword\">exit<\/span>(<span class=\"hljs-number\">1<\/span>)\n\n    <span class=\"hljs-keyword\">print<\/span>(json.dumps(create_response.json(), indent=<span class=\"hljs-number\">2<\/span>))\n\n\n<span class=\"hljs-keyword\">if<\/span> __name__ == <span class=\"hljs-string\">\"__main__\"<\/span>:\n    main()\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Install dependency:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pip install requests\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">python3 create_monitor_from_json.py monitors\/apache-5xx-log-monitor.json\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Monitor type cheat sheet<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Common monitor API <code>type<\/code> values:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Monitor<\/th><th>API type<\/th><\/tr><\/thead><tbody><tr><td>Metric threshold monitor<\/td><td><code>query alert<\/code><\/td><\/tr><tr><td>Log monitor<\/td><td><code>log alert<\/code><\/td><\/tr><tr><td>Service check monitor<\/td><td><code>service check<\/code><\/td><\/tr><tr><td>Event monitor<\/td><td><code>event alert<\/code><\/td><\/tr><tr><td>Process monitor<\/td><td><code>process alert<\/code><\/td><\/tr><tr><td>Composite monitor<\/td><td><code>composite<\/code><\/td><\/tr><tr><td>Synthetics alert monitor<\/td><td>Usually created automatically from Synthetic tests<\/td><\/tr><tr><td>Cost monitor<\/td><td><code>cost alert<\/code><\/td><\/tr><tr><td>RUM monitor<\/td><td><code>rum alert<\/code><\/td><\/tr><tr><td>CI pipelines monitor<\/td><td><code>ci-pipelines alert<\/code><\/td><\/tr><tr><td>Error Tracking monitor<\/td><td>Depends on Error Tracking monitor type\/query model<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For most infrastructure labs, you will use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">query alert\nlog alert\nservice check\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Query examples for common monitor types<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">CPU high<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">avg(last_5m):avg:system.cpu.idle{*} by {host} &lt; 10\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Memory high<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">avg(last_5m):avg:system.mem.pct_usable{*} by {host} &lt; 0.10\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Disk high<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">avg(last_5m):avg:system.disk.in_use{device:\/} by {host} &gt; 0.85\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Apache 5xx logs<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">logs(<span class=\"hljs-string\">\"source:apache @http.status_code:&#91;500 TO 599]\"<\/span>).index(<span class=\"hljs-string\">\"*\"<\/span>).rollup(<span class=\"hljs-string\">\"count\"<\/span>).by(<span class=\"hljs-string\">\"host\"<\/span>).last(<span class=\"hljs-string\">\"5m\"<\/span>) &gt; <span class=\"hljs-number\">5<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Ubuntu failed SSH<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">logs(<span class=\"hljs-string\">\"\\\"Failed password\\\" OR \\\"Invalid user\\\"\"<\/span>).index(<span class=\"hljs-string\">\"*\"<\/span>).rollup(<span class=\"hljs-string\">\"count\"<\/span>).by(<span class=\"hljs-string\">\"host\"<\/span>).last(<span class=\"hljs-string\">\"5m\"<\/span>) &gt; <span class=\"hljs-number\">10<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Kubernetes restarts<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sum(last_10m):sum:kubernetes.containers.restarts{*} by {kube_namespace,kube_deployment} &gt; 3\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">APM error rate<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sum(last_5m):sum:trace.web.request.errors{service:checkout-api,env:prod}.as_count() \/ sum:trace.web.request.hits{service:checkout-api,env:prod}.as_count() * 100 &gt; 5\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Important monitor options<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Datadog\u2019s monitor API options include useful controls like <code>include_tags<\/code>, <code>new_group_delay<\/code>, <code>no_data_timeframe<\/code>, <code>notify_no_data<\/code>, <code>notify_by<\/code>, and <code>on_missing_data<\/code>. For example, <code>new_group_delay<\/code> skips evaluations for new groups while they initialize, <code>notify_no_data<\/code> controls notifications when data stops reporting, and <code>notify_by<\/code> changes alert granularity for grouped monitors. (<a href=\"https:\/\/docs.datadoghq.com\/api\/latest\/monitors\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common options:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"thresholds\"<\/span>: {\n    <span class=\"hljs-attr\">\"critical\"<\/span>: <span class=\"hljs-number\">80<\/span>,\n    <span class=\"hljs-attr\">\"warning\"<\/span>: <span class=\"hljs-number\">70<\/span>\n  },\n  <span class=\"hljs-attr\">\"notify_no_data\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n  <span class=\"hljs-attr\">\"include_tags\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n  <span class=\"hljs-attr\">\"new_group_delay\"<\/span>: <span class=\"hljs-number\">300<\/span>,\n  <span class=\"hljs-attr\">\"renotify_interval\"<\/span>: <span class=\"hljs-number\">60<\/span>,\n  <span class=\"hljs-attr\">\"require_full_window\"<\/span>: <span class=\"hljs-literal\">false<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">My practical recommendation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For lab and beginner monitors:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"require_full_window\"<\/span>: <span class=\"hljs-literal\">false<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Why? It makes monitors evaluate more quickly and avoids confusion during short lab sessions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For production monitors, tune this based on the metric and business need.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Notification examples<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Datadog notifications are usually written in the <code>message<\/code> field.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Notify<\/span>: <span class=\"hljs-keyword\">@slack-devops-alerts<\/span>\n<span class=\"hljs-attribute\">Notify:<\/span> @pagerduty-platform\n<span class=\"hljs-attribute\">Notify:<\/span> @webhook-my-webhook\n<span class=\"hljs-attribute\">Notify:<\/span> @team-platform\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example message:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"message\"<\/span>: <span class=\"hljs-string\">\"High CPU detected on {{host.name}}.\\n\\nCurrent value: {{value}}\\n\\nNotify: @slack-devops-alerts\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Useful template variables:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">{{value}}\n{{host.name}}\n{{service.name}}\n{{env.name}}\n{{kube_namespace.name}}\n{{kube_deployment.name}}\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The exact variable availability depends on your monitor grouping.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Best practice: naming convention<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use a standard format:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;ENV]<\/span> <span class=\"hljs-selector-attr\">&#91;SERVICE]<\/span> <span class=\"hljs-selector-tag\">Symptom<\/span> <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">Scope<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;PROD]<\/span> <span class=\"hljs-selector-tag\">checkout-api<\/span> <span class=\"hljs-selector-tag\">Error<\/span> <span class=\"hljs-selector-tag\">Rate<\/span> <span class=\"hljs-selector-tag\">High<\/span>\n<span class=\"hljs-selector-attr\">&#91;PROD]<\/span> <span class=\"hljs-selector-tag\">Apache<\/span> 5<span class=\"hljs-selector-tag\">xx<\/span> <span class=\"hljs-selector-tag\">Errors<\/span> <span class=\"hljs-selector-tag\">High<\/span> <span class=\"hljs-selector-tag\">by<\/span> <span class=\"hljs-selector-tag\">Host<\/span>\n<span class=\"hljs-selector-attr\">&#91;STAGE]<\/span> <span class=\"hljs-selector-tag\">Kubernetes<\/span> <span class=\"hljs-selector-tag\">Container<\/span> <span class=\"hljs-selector-tag\">Restarts<\/span> <span class=\"hljs-selector-tag\">High<\/span>\n<span class=\"hljs-selector-attr\">&#91;TRAINING]<\/span> <span class=\"hljs-selector-tag\">Ubuntu<\/span> <span class=\"hljs-selector-tag\">Failed<\/span> <span class=\"hljs-selector-tag\">SSH<\/span> <span class=\"hljs-selector-tag\">Login<\/span> <span class=\"hljs-selector-tag\">Attempts<\/span> <span class=\"hljs-selector-tag\">High<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For labs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;LAB]<\/span> <span class=\"hljs-selector-tag\">Apache<\/span> 5<span class=\"hljs-selector-tag\">xx<\/span> <span class=\"hljs-selector-tag\">Errors<\/span> <span class=\"hljs-selector-tag\">High<\/span> <span class=\"hljs-selector-tag\">by<\/span> <span class=\"hljs-selector-tag\">Host<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Best practice: tagging monitors<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Always tag monitors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended tags:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">env<\/span><span class=\"hljs-selector-pseudo\">:prod<\/span>\n<span class=\"hljs-selector-tag\">team<\/span><span class=\"hljs-selector-pseudo\">:devops<\/span>\n<span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-pseudo\">:apache<\/span>\n<span class=\"hljs-selector-tag\">monitor_type<\/span><span class=\"hljs-selector-pseudo\">:log<\/span>\n<span class=\"hljs-selector-tag\">managed_by<\/span><span class=\"hljs-selector-pseudo\">:api<\/span>\n<span class=\"hljs-selector-tag\">severity<\/span><span class=\"hljs-selector-pseudo\">:p2<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"tags\"<\/span>: &#91;\n  <span class=\"hljs-string\">\"env:prod\"<\/span>,\n  <span class=\"hljs-string\">\"team:devops\"<\/span>,\n  <span class=\"hljs-string\">\"service:apache\"<\/span>,\n  <span class=\"hljs-string\">\"monitor_type:log\"<\/span>,\n  <span class=\"hljs-string\">\"managed_by:api\"<\/span>\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This helps with monitor search, ownership, dashboards, reporting, and cleanup.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Student lab flow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this sequence for students:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span> Export DD_SITE, DD_API_KEY, DD_APP_KEY.\n<span class=\"hljs-number\">2.<\/span> Validate API key.\n<span class=\"hljs-number\">3.<\/span> Create <span class=\"hljs-built_in\">JSON<\/span> monitor definition.\n<span class=\"hljs-number\">4.<\/span> Validate monitor <span class=\"hljs-built_in\">JSON<\/span> using \/api\/v1\/monitor\/validate.\n<span class=\"hljs-number\">5.<\/span> Create monitor using \/api\/v1\/monitor.\n<span class=\"hljs-number\">6.<\/span> Capture monitor ID.\n<span class=\"hljs-number\">7.<\/span> View monitor <span class=\"hljs-keyword\">in<\/span> Datadog UI.\n<span class=\"hljs-number\">8.<\/span> Update monitor threshold.\n<span class=\"hljs-number\">9.<\/span> Search monitor using API.\n<span class=\"hljs-number\">10.<\/span> Delete lab monitor.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Full lab command sequence<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">export DD_SITE=<span class=\"hljs-string\">\"datadoghq.com\"<\/span>\nexport DD_API_KEY=<span class=\"hljs-string\">\"replace_me\"<\/span>\nexport DD_APP_KEY=<span class=\"hljs-string\">\"replace_me\"<\/span>\n\ncurl -sS -X GET <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/validate\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> | jq\n\n.\/validate-monitor.sh monitors\/cpu-idle-low.json\n\n.\/create-monitor.sh monitors\/cpu-idle-low.json\n\nexport MONITOR_ID=<span class=\"hljs-string\">\"replace_with_created_monitor_id\"<\/span>\n\n.\/get-monitor.sh <span class=\"hljs-string\">\"${MONITOR_ID}\"<\/span>\n\ncurl -sS -X GET <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/monitor\/search?query=lab:datadog-api\"<\/span> \\\n  -H <span class=\"hljs-string\">\"Accept: application\/json\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-APPLICATION-KEY: ${DD_APP_KEY}\"<\/span> | jq\n\n.\/delete-monitor.sh <span class=\"hljs-string\">\"${MONITOR_ID}\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. Troubleshooting<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Problem: <code>403 Forbidden<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Possible causes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Wrong API key\nWrong APP key\nWrong DD_SITE\nApplication key does not have permission\nAccount\/org mismatch\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$DD_SITE\"<\/span>\ncurl -sS -X GET <span class=\"hljs-string\">\"https:\/\/api.${DD_SITE}\/api\/v1\/validate\"<\/span> \\\n  -H <span class=\"hljs-string\">\"DD-API-KEY: ${DD_API_KEY}\"<\/span> | jq\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Problem: monitor validation fails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Common causes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Wrong monitor type\nWrong query syntax\nThreshold mismatch\nMetric does not exist\nInvalid log query escaping\nInvalid <span class=\"hljs-built_in\">JSON<\/span>\nUnsupported option <span class=\"hljs-keyword\">for<\/span> that monitor type\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate JSON locally:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">jq . monitors\/apache-5xx-log-monitor.json\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Problem: log monitor returns no data<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Are<\/span> <span class=\"hljs-selector-tag\">logs<\/span> <span class=\"hljs-selector-tag\">indexed<\/span>?\n<span class=\"hljs-selector-tag\">Is<\/span> <span class=\"hljs-selector-tag\">the<\/span> <span class=\"hljs-selector-tag\">source<\/span> <span class=\"hljs-selector-tag\">correct<\/span>?\n<span class=\"hljs-selector-tag\">Is<\/span> <span class=\"hljs-keyword\">@http<\/span>.status_code parsed?\nIs time range correct?\nIs the index correct?\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog log monitors evaluate indexed logs only. (<a href=\"https:\/\/docs.datadoghq.com\/monitors\/types\/log\/\">Datadog Monitoring<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Problem: APM monitor does not work<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check actual metric names in Metrics Explorer. Your application may use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.web<\/span><span class=\"hljs-selector-class\">.request<\/span>.*\n<span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.servlet<\/span><span class=\"hljs-selector-class\">.request<\/span>.*\n<span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.express<\/span><span class=\"hljs-selector-class\">.request<\/span>.*\n<span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.fastapi<\/span><span class=\"hljs-selector-class\">.request<\/span>.*\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The service and env tags must match real APM data.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Final reusable template<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this as a base for any monitor:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"&#91;ENV] Service Symptom - Scope\"<\/span>,\n  <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"query alert\"<\/span>,\n  <span class=\"hljs-attr\">\"query\"<\/span>: <span class=\"hljs-string\">\"avg(last_5m):avg:some.metric{env:prod,service:my-service} by {host} &gt; 80\"<\/span>,\n  <span class=\"hljs-attr\">\"message\"<\/span>: <span class=\"hljs-string\">\"Alert message here.\\n\\nCurrent value: {{value}}\\n\\nNotify: @slack-devops-alerts\"<\/span>,\n  <span class=\"hljs-attr\">\"tags\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"env:prod\"<\/span>,\n    <span class=\"hljs-string\">\"service:my-service\"<\/span>,\n    <span class=\"hljs-string\">\"team:devops\"<\/span>,\n    <span class=\"hljs-string\">\"managed_by:api\"<\/span>\n  ],\n  <span class=\"hljs-attr\">\"priority\"<\/span>: <span class=\"hljs-number\">3<\/span>,\n  <span class=\"hljs-attr\">\"options\"<\/span>: {\n    <span class=\"hljs-attr\">\"thresholds\"<\/span>: {\n      <span class=\"hljs-attr\">\"critical\"<\/span>: <span class=\"hljs-number\">80<\/span>,\n      <span class=\"hljs-attr\">\"warning\"<\/span>: <span class=\"hljs-number\">70<\/span>\n    },\n    <span class=\"hljs-attr\">\"notify_no_data\"<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-attr\">\"include_tags\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-attr\">\"new_group_delay\"<\/span>: <span class=\"hljs-number\">300<\/span>,\n    <span class=\"hljs-attr\">\"renotify_interval\"<\/span>: <span class=\"hljs-number\">60<\/span>,\n    <span class=\"hljs-attr\">\"require_full_window\"<\/span>: <span class=\"hljs-literal\">false<\/span>\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Final recommendation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For production, do not create monitors manually one by one forever. Use the API workflow like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Monitor <span class=\"hljs-built_in\">JSON<\/span> <span class=\"hljs-keyword\">in<\/span> Git\n        \u2193\nPull request review\n        \u2193\nCI validates monitor via \/api\/v1\/monitor\/validate\n        \u2193\nCI creates\/updates monitor through API\n        \u2193\nMonitor tagged <span class=\"hljs-keyword\">with<\/span> managed_by:api\n        \u2193\nDashboard\/SLO\/incident workflow uses same tags\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For students, the best learning sequence is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Create metric monitor\nCreate log monitor\nCreate APM monitor\nValidate <span class=\"hljs-built_in\">JSON<\/span>\nUpdate threshold\nSearch monitor\nDelete monitor\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That gives them the full Datadog alerting lifecycle using the API.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Old Content<\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -X POST -H <span class=\"hljs-string\">\"Content-type: application\/json\"<\/span> -H <span class=\"hljs-string\">\"DD-API-KEY: XXXXXXXXXXXXXXXXX\"<\/span> -H <span class=\"hljs-string\">\"DD-APPLICATION-KEY: ddapp_XXXXXXXXXXX\"<\/span> -d @devops.json <span class=\"hljs-string\">\"https:\/\/api.datadoghq.com\/api\/v1\/monitor\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<script src=\"https:\/\/gist.github.com\/devops-school\/73383497c5081ada3c8d5e0af4ecd12a.js\"><\/script>\n","protected":false},"excerpt":{"rendered":"<p>This guide uses the current Datadog Monitor API v1, which is still the main API for creating metric, log, APM, and many other monitor types. Datadog\u2019s API&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[25768],"tags":[],"class_list":["post-33511","post","type-post","status-publish","format-standard","hentry","category-datadog"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/33511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=33511"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/33511\/revisions"}],"predecessor-version":[{"id":77122,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/33511\/revisions\/77122"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=33511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=33511"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=33511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}