{"id":31255,"date":"2026-06-23T04:17:34","date_gmt":"2026-06-23T04:17:34","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=31255"},"modified":"2026-06-23T04:17:36","modified_gmt":"2026-06-23T04:17:36","slug":"datadog-assignment-project","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/datadog-assignment-project\/","title":{"rendered":"Datadog Assignment &amp; Project Master Plan"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Target Audience<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This lab is suitable for:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DevOps engineers, SREs, cloud engineers, platform engineers, application engineers, monitoring engineers, and students learning Datadog from practical implementation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Final Outcome<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">By the end, students will build this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Ubuntu Linux Server]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Datadog Agent]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Python Flask App]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Application Logs]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;APM Traces]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Custom Metrics]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Browser User]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;RUM Events]<\/span>\n    <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Datadog Synthetics]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span><span class=\"hljs-selector-attr\">&#91;Datadog Platform]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span>\n    <span class=\"hljs-selector-tag\">I<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span>\n    <span class=\"hljs-selector-tag\">J<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">K<\/span><span class=\"hljs-selector-attr\">&#91;Monitors \/ Alerts]<\/span>\n    <span class=\"hljs-selector-tag\">J<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L<\/span><span class=\"hljs-selector-attr\">&#91;Dashboards]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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 Datadog Agent runs on the Ubuntu host and collects infrastructure metrics, logs, traces, and service checks. Datadog documentation confirms the Agent collects host events and metrics and can also collect logs and traces when configured. (<a href=\"https:\/\/docs.datadoghq.com\/getting_started\/agent\/\">Datadog<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Overall Lab Structure<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Assignment<\/th><th>Topic<\/th><th>Main Skill<\/th><\/tr><\/thead><tbody><tr><td>Assignment 1<\/td><td>Infrastructure Monitoring<\/td><td>Install Agent, collect Linux metrics, tags, host health<\/td><\/tr><tr><td>Assignment 2<\/td><td>Log Monitoring<\/td><td>Enable log collection, collect app logs, parse\/filter logs<\/td><\/tr><tr><td>Assignment 3<\/td><td>APM<\/td><td>Instrument Python Flask app with traces<\/td><\/tr><tr><td>Assignment 4<\/td><td>RUM<\/td><td>Add browser monitoring to frontend page<\/td><\/tr><tr><td>Assignment 5<\/td><td>Synthetic Monitoring<\/td><td>Create API and browser tests<\/td><\/tr><tr><td>Assignment 6<\/td><td>Alerts \/ Monitors<\/td><td>Create infrastructure, log, APM, RUM, and synthetic alerts<\/td><\/tr><tr><td>Assignment 7<\/td><td>Dashboard<\/td><td>Build one unified service dashboard<\/td><\/tr><tr><td>Final Project<\/td><td>Complete Observability Project<\/td><td>End-to-end Datadog implementation using Python app<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Lab Environment<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended Environment<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Component<\/th><th>Recommendation<\/th><\/tr><\/thead><tbody><tr><td>OS<\/td><td>Ubuntu 22.04 or 24.04<\/td><\/tr><tr><td>CPU<\/td><td>2 vCPU minimum<\/td><\/tr><tr><td>RAM<\/td><td>2 GB minimum, 4 GB preferred<\/td><\/tr><tr><td>Python<\/td><td>Python 3.10+<\/td><\/tr><tr><td>Web App<\/td><td>Flask<\/td><\/tr><tr><td>App Port<\/td><td>8000<\/td><\/tr><tr><td>Datadog Agent<\/td><td>Agent 7.x<\/td><\/tr><tr><td>Datadog Site<\/td><td>Your Datadog site, for example US1, EU, AP1, AP2<\/td><\/tr><tr><td>GitHub<\/td><td>One student repo per student or team<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Important Datadog Concepts Used in This Lab<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Concept<\/th><th>Why It Matters<\/th><\/tr><\/thead><tbody><tr><td>Agent<\/td><td>Collects infrastructure metrics, logs, traces, and service data<\/td><\/tr><tr><td>Tags<\/td><td>Used for filtering, grouping, dashboards, alerts, and correlation<\/td><\/tr><tr><td><code>env<\/code><\/td><td>Environment tag, for example <code>lab<\/code>, <code>dev<\/code>, <code>prod<\/code><\/td><\/tr><tr><td><code>service<\/code><\/td><td>Application\/service name<\/td><\/tr><tr><td><code>version<\/code><\/td><td>App release version<\/td><\/tr><tr><td>Logs<\/td><td>Application and system events<\/td><\/tr><tr><td>APM<\/td><td>Backend request tracing<\/td><\/tr><tr><td>RUM<\/td><td>Real browser user experience monitoring<\/td><\/tr><tr><td>Synthetics<\/td><td>Proactive uptime and behavior testing<\/td><\/tr><tr><td>Monitors<\/td><td>Alerting rules<\/td><\/tr><tr><td>Dashboards<\/td><td>Visual observability views<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Use the following standard tags throughout the lab:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" 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\">:lab<\/span>\n<span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-pseudo\">:datadog-lab-shop<\/span>\n<span class=\"hljs-selector-tag\">version<\/span><span class=\"hljs-selector-pseudo\">:1.0.0<\/span>\n<span class=\"hljs-selector-tag\">team<\/span><span class=\"hljs-selector-pseudo\">:training<\/span>\n<span class=\"hljs-selector-tag\">owner<\/span><span class=\"hljs-selector-pseudo\">:student<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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 recommends Unified Service Tagging with <code>env<\/code>, <code>service<\/code>, and <code>version<\/code> so telemetry can be correlated across metrics, logs, traces, containers, and services. (<a href=\"https:\/\/docs.datadoghq.com\/getting_started\/agent\/\">Datadog<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 1: Create the Sample Python Project<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Students should create one GitHub repository named:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This repo will contain the Python Flask application used across all assignments.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Project Structure<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">datadog-lab-shop\/\n\u251c\u2500\u2500 app.py\n\u251c\u2500\u2500 requirements.txt\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 templates\/\n\u2502   \u2514\u2500\u2500 index.html\n\u251c\u2500\u2500 systemd\/\n\u2502   \u2514\u2500\u2500 datadog-lab-shop.service\n\u251c\u2500\u2500 datadog\/\n\u2502   \u2514\u2500\u2500 lab-shop-logs.yaml\n\u2514\u2500\u2500 load-test\/\n    \u2514\u2500\u2500 generate-traffic.sh\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><code>requirements.txt<\/code><\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flask==3.0.3\ngunicorn==22.0.0\nddtrace\ndatadog\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog\u2019s Python tracing documentation says Python applications can be instrumented by installing the tracing library and prefixing the application command with <code>ddtrace-run<\/code>. (<a href=\"https:\/\/docs.datadoghq.com\/tracing\/trace_collection\/dd_libraries\/python\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><code>app.py<\/code><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> json\n<span class=\"hljs-keyword\">import<\/span> logging\n<span class=\"hljs-keyword\">import<\/span> os\n<span class=\"hljs-keyword\">import<\/span> random\n<span class=\"hljs-keyword\">import<\/span> time\n<span class=\"hljs-keyword\">from<\/span> datetime <span class=\"hljs-keyword\">import<\/span> datetime, timezone\n\n<span class=\"hljs-keyword\">from<\/span> flask <span class=\"hljs-keyword\">import<\/span> Flask, jsonify, render_template, request\n<span class=\"hljs-keyword\">from<\/span> datadog <span class=\"hljs-keyword\">import<\/span> initialize, statsd\n\n\nAPP_NAME = os.getenv(<span class=\"hljs-string\">\"DD_SERVICE\"<\/span>, <span class=\"hljs-string\">\"datadog-lab-shop\"<\/span>)\nENV = os.getenv(<span class=\"hljs-string\">\"DD_ENV\"<\/span>, <span class=\"hljs-string\">\"lab\"<\/span>)\nVERSION = os.getenv(<span class=\"hljs-string\">\"DD_VERSION\"<\/span>, <span class=\"hljs-string\">\"1.0.0\"<\/span>)\nLOG_FILE = os.getenv(<span class=\"hljs-string\">\"APP_LOG_FILE\"<\/span>, <span class=\"hljs-string\">\"\/var\/log\/datadog-lab-shop\/app.log\"<\/span>)\n\nos.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)\n\napp = Flask(__name__)\n\ninitialize(\n    statsd_host=os.getenv(<span class=\"hljs-string\">\"DD_AGENT_HOST\"<\/span>, <span class=\"hljs-string\">\"127.0.0.1\"<\/span>),\n    statsd_port=int(os.getenv(<span class=\"hljs-string\">\"DD_DOGSTATSD_PORT\"<\/span>, <span class=\"hljs-string\">\"8125\"<\/span>)),\n)\n\nlogger = logging.getLogger(APP_NAME)\nlogger.setLevel(logging.INFO)\n\nfile_handler = logging.FileHandler(LOG_FILE)\nfile_handler.setLevel(logging.INFO)\n\nconsole_handler = logging.StreamHandler()\nconsole_handler.setLevel(logging.INFO)\n\nlogger.addHandler(file_handler)\nlogger.addHandler(console_handler)\n\n\ndef log_event(level, message, **kwargs):\n    event = {\n        <span class=\"hljs-string\">\"timestamp\"<\/span>: datetime.now(timezone.utc).isoformat(),\n        <span class=\"hljs-string\">\"level\"<\/span>: level,\n        <span class=\"hljs-string\">\"service\"<\/span>: APP_NAME,\n        <span class=\"hljs-string\">\"env\"<\/span>: ENV,\n        <span class=\"hljs-string\">\"version\"<\/span>: VERSION,\n        <span class=\"hljs-string\">\"message\"<\/span>: message,\n        **kwargs,\n    }\n    line = json.dumps(event)\n    <span class=\"hljs-keyword\">if<\/span> level == <span class=\"hljs-string\">\"ERROR\"<\/span>:\n        logger.error(line)\n    elif level == <span class=\"hljs-string\">\"WARNING\"<\/span>:\n        logger.warning(line)\n    <span class=\"hljs-attr\">else<\/span>:\n        logger.info(line)\n\n\n@app.route(<span class=\"hljs-string\">\"\/\"<\/span>)\ndef home():\n    statsd.increment(<span class=\"hljs-string\">\"datadog_lab_shop.page.views\"<\/span>, tags=&#91;f<span class=\"hljs-string\">\"env:{ENV}\"<\/span>, f<span class=\"hljs-string\">\"service:{APP_NAME}\"<\/span>])\n    log_event(<span class=\"hljs-string\">\"INFO\"<\/span>, <span class=\"hljs-string\">\"Home page viewed\"<\/span>, path=<span class=\"hljs-string\">\"\/\"<\/span>, client_ip=request.remote_addr)\n    <span class=\"hljs-keyword\">return<\/span> render_template(\n        <span class=\"hljs-string\">\"index.html\"<\/span>,\n        service=APP_NAME,\n        env=ENV,\n        version=VERSION,\n        rum_app_id=os.getenv(<span class=\"hljs-string\">\"DD_RUM_APPLICATION_ID\"<\/span>, <span class=\"hljs-string\">\"\"<\/span>),\n        rum_client_token=os.getenv(<span class=\"hljs-string\">\"DD_RUM_CLIENT_TOKEN\"<\/span>, <span class=\"hljs-string\">\"\"<\/span>),\n        rum_site=os.getenv(<span class=\"hljs-string\">\"DD_SITE\"<\/span>, <span class=\"hljs-string\">\"datadoghq.com\"<\/span>),\n    )\n\n\n@app.route(<span class=\"hljs-string\">\"\/health\"<\/span>)\ndef health():\n    statsd.increment(<span class=\"hljs-string\">\"datadog_lab_shop.health.check\"<\/span>, tags=&#91;f<span class=\"hljs-string\">\"env:{ENV}\"<\/span>, f<span class=\"hljs-string\">\"service:{APP_NAME}\"<\/span>])\n    <span class=\"hljs-keyword\">return<\/span> jsonify({\n        <span class=\"hljs-string\">\"status\"<\/span>: <span class=\"hljs-string\">\"ok\"<\/span>,\n        <span class=\"hljs-string\">\"service\"<\/span>: APP_NAME,\n        <span class=\"hljs-string\">\"env\"<\/span>: ENV,\n        <span class=\"hljs-string\">\"version\"<\/span>: VERSION,\n        <span class=\"hljs-string\">\"timestamp\"<\/span>: datetime.now(timezone.utc).isoformat()\n    })\n\n\n@app.route(<span class=\"hljs-string\">\"\/api\/products\"<\/span>)\ndef products():\n    statsd.increment(<span class=\"hljs-string\">\"datadog_lab_shop.products.requests\"<\/span>, tags=&#91;f<span class=\"hljs-string\">\"env:{ENV}\"<\/span>, f<span class=\"hljs-string\">\"service:{APP_NAME}\"<\/span>])\n    log_event(<span class=\"hljs-string\">\"INFO\"<\/span>, <span class=\"hljs-string\">\"Products API called\"<\/span>, path=<span class=\"hljs-string\">\"\/api\/products\"<\/span>, client_ip=request.remote_addr)\n\n    <span class=\"hljs-keyword\">return<\/span> jsonify({\n        <span class=\"hljs-string\">\"products\"<\/span>: &#91;\n            {<span class=\"hljs-string\">\"id\"<\/span>: <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"Datadog T-Shirt\"<\/span>, <span class=\"hljs-string\">\"price\"<\/span>: <span class=\"hljs-number\">20<\/span>},\n            {<span class=\"hljs-string\">\"id\"<\/span>: <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"Observability Mug\"<\/span>, <span class=\"hljs-string\">\"price\"<\/span>: <span class=\"hljs-number\">12<\/span>},\n            {<span class=\"hljs-string\">\"id\"<\/span>: <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"SRE Sticker Pack\"<\/span>, <span class=\"hljs-string\">\"price\"<\/span>: <span class=\"hljs-number\">5<\/span>}\n        ]\n    })\n\n\n@app.route(<span class=\"hljs-string\">\"\/api\/cart\"<\/span>, methods=&#91;<span class=\"hljs-string\">\"POST\"<\/span>])\ndef cart():\n    statsd.increment(<span class=\"hljs-string\">\"datadog_lab_shop.cart.add\"<\/span>, tags=&#91;f<span class=\"hljs-string\">\"env:{ENV}\"<\/span>, f<span class=\"hljs-string\">\"service:{APP_NAME}\"<\/span>])\n    log_event(<span class=\"hljs-string\">\"INFO\"<\/span>, <span class=\"hljs-string\">\"Item added to cart\"<\/span>, path=<span class=\"hljs-string\">\"\/api\/cart\"<\/span>, client_ip=request.remote_addr)\n    <span class=\"hljs-keyword\">return<\/span> jsonify({<span class=\"hljs-string\">\"message\"<\/span>: <span class=\"hljs-string\">\"Item added to cart\"<\/span>}), <span class=\"hljs-number\">201<\/span>\n\n\n@app.route(<span class=\"hljs-string\">\"\/api\/checkout\"<\/span>, methods=&#91;<span class=\"hljs-string\">\"POST\"<\/span>])\ndef checkout():\n    payment_status = random.choice(&#91;<span class=\"hljs-string\">\"success\"<\/span>, <span class=\"hljs-string\">\"success\"<\/span>, <span class=\"hljs-string\">\"success\"<\/span>, <span class=\"hljs-string\">\"failed\"<\/span>])\n\n    statsd.increment(\n        <span class=\"hljs-string\">\"datadog_lab_shop.checkout.attempt\"<\/span>,\n        tags=&#91;f<span class=\"hljs-string\">\"env:{ENV}\"<\/span>, f<span class=\"hljs-string\">\"service:{APP_NAME}\"<\/span>, f<span class=\"hljs-string\">\"status:{payment_status}\"<\/span>]\n    )\n\n    <span class=\"hljs-keyword\">if<\/span> payment_status == <span class=\"hljs-string\">\"failed\"<\/span>:\n        log_event(\n            <span class=\"hljs-string\">\"ERROR\"<\/span>,\n            <span class=\"hljs-string\">\"Checkout payment failed\"<\/span>,\n            path=<span class=\"hljs-string\">\"\/api\/checkout\"<\/span>,\n            payment_provider=<span class=\"hljs-string\">\"demo-pay\"<\/span>,\n            client_ip=request.remote_addr\n        )\n        <span class=\"hljs-keyword\">return<\/span> jsonify({<span class=\"hljs-string\">\"status\"<\/span>: <span class=\"hljs-string\">\"failed\"<\/span>, <span class=\"hljs-string\">\"reason\"<\/span>: <span class=\"hljs-string\">\"payment declined\"<\/span>}), <span class=\"hljs-number\">500<\/span>\n\n    log_event(<span class=\"hljs-string\">\"INFO\"<\/span>, <span class=\"hljs-string\">\"Checkout successful\"<\/span>, path=<span class=\"hljs-string\">\"\/api\/checkout\"<\/span>, client_ip=request.remote_addr)\n    <span class=\"hljs-keyword\">return<\/span> jsonify({<span class=\"hljs-string\">\"status\"<\/span>: <span class=\"hljs-string\">\"success\"<\/span>, <span class=\"hljs-string\">\"order_id\"<\/span>: random.randint(<span class=\"hljs-number\">1000<\/span>, <span class=\"hljs-number\">9999<\/span>)})\n\n\n@app.route(<span class=\"hljs-string\">\"\/api\/slow\"<\/span>)\ndef slow():\n    delay = random.uniform(<span class=\"hljs-number\">1.5<\/span>, <span class=\"hljs-number\">4.0<\/span>)\n    time.sleep(delay)\n\n    statsd.histogram(\n        <span class=\"hljs-string\">\"datadog_lab_shop.slow.request.duration\"<\/span>,\n        delay,\n        tags=&#91;f<span class=\"hljs-string\">\"env:{ENV}\"<\/span>, f<span class=\"hljs-string\">\"service:{APP_NAME}\"<\/span>]\n    )\n\n    log_event(<span class=\"hljs-string\">\"WARNING\"<\/span>, <span class=\"hljs-string\">\"Slow endpoint called\"<\/span>, path=<span class=\"hljs-string\">\"\/api\/slow\"<\/span>, delay_seconds=delay)\n    <span class=\"hljs-keyword\">return<\/span> jsonify({<span class=\"hljs-string\">\"message\"<\/span>: <span class=\"hljs-string\">\"slow response\"<\/span>, <span class=\"hljs-string\">\"delay_seconds\"<\/span>: delay})\n\n\n@app.route(<span class=\"hljs-string\">\"\/api\/error\"<\/span>)\ndef error():\n    statsd.increment(<span class=\"hljs-string\">\"datadog_lab_shop.error.generated\"<\/span>, tags=&#91;f<span class=\"hljs-string\">\"env:{ENV}\"<\/span>, f<span class=\"hljs-string\">\"service:{APP_NAME}\"<\/span>])\n    log_event(<span class=\"hljs-string\">\"ERROR\"<\/span>, <span class=\"hljs-string\">\"Manual test error generated\"<\/span>, path=<span class=\"hljs-string\">\"\/api\/error\"<\/span>, client_ip=request.remote_addr)\n    <span class=\"hljs-keyword\">return<\/span> jsonify({<span class=\"hljs-string\">\"error\"<\/span>: <span class=\"hljs-string\">\"manual test error\"<\/span>}), <span class=\"hljs-number\">500<\/span>\n\n\n@app.route(<span class=\"hljs-string\">\"\/api\/random\"<\/span>)\ndef random_behavior():\n    choice = random.choice(&#91;<span class=\"hljs-string\">\"ok\"<\/span>, <span class=\"hljs-string\">\"slow\"<\/span>, <span class=\"hljs-string\">\"error\"<\/span>])\n\n    <span class=\"hljs-keyword\">if<\/span> choice == <span class=\"hljs-string\">\"slow\"<\/span>:\n        time.sleep(<span class=\"hljs-number\">2<\/span>)\n        log_event(<span class=\"hljs-string\">\"WARNING\"<\/span>, <span class=\"hljs-string\">\"Random slow behavior\"<\/span>, path=<span class=\"hljs-string\">\"\/api\/random\"<\/span>)\n        <span class=\"hljs-keyword\">return<\/span> jsonify({<span class=\"hljs-string\">\"status\"<\/span>: <span class=\"hljs-string\">\"slow\"<\/span>})\n\n    <span class=\"hljs-keyword\">if<\/span> choice == <span class=\"hljs-string\">\"error\"<\/span>:\n        log_event(<span class=\"hljs-string\">\"ERROR\"<\/span>, <span class=\"hljs-string\">\"Random error behavior\"<\/span>, path=<span class=\"hljs-string\">\"\/api\/random\"<\/span>)\n        <span class=\"hljs-keyword\">return<\/span> jsonify({<span class=\"hljs-string\">\"status\"<\/span>: <span class=\"hljs-string\">\"error\"<\/span>}), <span class=\"hljs-number\">500<\/span>\n\n    log_event(<span class=\"hljs-string\">\"INFO\"<\/span>, <span class=\"hljs-string\">\"Random normal behavior\"<\/span>, path=<span class=\"hljs-string\">\"\/api\/random\"<\/span>)\n    <span class=\"hljs-keyword\">return<\/span> jsonify({<span class=\"hljs-string\">\"status\"<\/span>: <span class=\"hljs-string\">\"ok\"<\/span>})\n\n\n<span class=\"hljs-keyword\">if<\/span> __name__ == <span class=\"hljs-string\">\"__main__\"<\/span>:\n    app.run(host=<span class=\"hljs-string\">\"0.0.0.0\"<\/span>, port=<span class=\"hljs-number\">8000<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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<h2 class=\"wp-block-heading\"><code>templates\/index.html<\/code><\/h2>\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\"><span class=\"hljs-meta\">&lt;!DOCTYPE <span class=\"hljs-meta-keyword\">html<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Datadog Lab Shop<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n\n    {% if rum_app_id and rum_client_token %}\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>\n      <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"https:\/\/www.datadoghq-browser-agent.com\/us1\/v6\/datadog-rum.js\"<\/span>\n      <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\/javascript\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n      <span class=\"hljs-built_in\">window<\/span>.DD_RUM &amp;&amp; <span class=\"hljs-built_in\">window<\/span>.DD_RUM.init({\n        <span class=\"hljs-attr\">applicationId<\/span>: <span class=\"hljs-string\">\"{{ rum_app_id }}\"<\/span>,\n        <span class=\"hljs-attr\">clientToken<\/span>: <span class=\"hljs-string\">\"{{ rum_client_token }}\"<\/span>,\n        <span class=\"hljs-attr\">site<\/span>: <span class=\"hljs-string\">\"{{ rum_site }}\"<\/span>,\n        <span class=\"hljs-attr\">service<\/span>: <span class=\"hljs-string\">\"{{ service }}\"<\/span>,\n        <span class=\"hljs-attr\">env<\/span>: <span class=\"hljs-string\">\"{{ env }}\"<\/span>,\n        <span class=\"hljs-attr\">version<\/span>: <span class=\"hljs-string\">\"{{ version }}\"<\/span>,\n        <span class=\"hljs-attr\">sessionSampleRate<\/span>: <span class=\"hljs-number\">100<\/span>,\n        <span class=\"hljs-attr\">sessionReplaySampleRate<\/span>: <span class=\"hljs-number\">20<\/span>,\n        <span class=\"hljs-attr\">trackUserInteractions<\/span>: <span class=\"hljs-literal\">true<\/span>,\n        <span class=\"hljs-attr\">trackResources<\/span>: <span class=\"hljs-literal\">true<\/span>,\n        <span class=\"hljs-attr\">trackLongTasks<\/span>: <span class=\"hljs-literal\">true<\/span>,\n        <span class=\"hljs-attr\">defaultPrivacyLevel<\/span>: <span class=\"hljs-string\">\"mask-user-input\"<\/span>\n      });\n\n      <span class=\"hljs-built_in\">window<\/span>.DD_RUM &amp;&amp; <span class=\"hljs-built_in\">window<\/span>.DD_RUM.setUser({\n        <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-string\">\"student-user-001\"<\/span>,\n        <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">\"Datadog Student\"<\/span>,\n        <span class=\"hljs-attr\">email<\/span>: <span class=\"hljs-string\">\"student@example.com\"<\/span>\n      });\n    <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n    {% endif %}\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">style<\/span>&gt;<\/span><span class=\"css\">\n        <span class=\"hljs-selector-tag\">body<\/span> {\n            <span class=\"hljs-attribute\">font-family<\/span>: Arial, sans-serif;\n            <span class=\"hljs-attribute\">margin<\/span>: <span class=\"hljs-number\">40px<\/span>;\n        }\n        <span class=\"hljs-selector-tag\">button<\/span> {\n            <span class=\"hljs-attribute\">padding<\/span>: <span class=\"hljs-number\">10px<\/span>;\n            <span class=\"hljs-attribute\">margin<\/span>: <span class=\"hljs-number\">5px<\/span>;\n        }\n        <span class=\"hljs-selector-tag\">pre<\/span> {\n            <span class=\"hljs-attribute\">background<\/span>: <span class=\"hljs-number\">#f3f3f3<\/span>;\n            <span class=\"hljs-attribute\">padding<\/span>: <span class=\"hljs-number\">15px<\/span>;\n        }\n    <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">style<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>Datadog Lab Shop<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Service: {{ service }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Environment: {{ env }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Version: {{ version }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">onclick<\/span>=<span class=\"hljs-string\">\"callApi('\/api\/products')\"<\/span>&gt;<\/span>Products<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">onclick<\/span>=<span class=\"hljs-string\">\"postApi('\/api\/cart')\"<\/span>&gt;<\/span>Add to Cart<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">onclick<\/span>=<span class=\"hljs-string\">\"postApi('\/api\/checkout')\"<\/span>&gt;<\/span>Checkout<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">onclick<\/span>=<span class=\"hljs-string\">\"callApi('\/api\/slow')\"<\/span>&gt;<\/span>Slow API<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">onclick<\/span>=<span class=\"hljs-string\">\"callApi('\/api\/error')\"<\/span>&gt;<\/span>Error API<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">onclick<\/span>=<span class=\"hljs-string\">\"callApi('\/api\/random')\"<\/span>&gt;<\/span>Random API<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2<\/span>&gt;<\/span>Response<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h2<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pre<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"output\"<\/span>&gt;<\/span>Click a button...<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">pre<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n        <span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">callApi<\/span>(<span class=\"hljs-params\">path<\/span>) <\/span>{\n            <span class=\"hljs-keyword\">try<\/span> {\n                <span class=\"hljs-keyword\">const<\/span> response = <span class=\"hljs-keyword\">await<\/span> fetch(path);\n                <span class=\"hljs-keyword\">const<\/span> data = <span class=\"hljs-keyword\">await<\/span> response.json();\n                <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">\"output\"<\/span>).innerText =\n                    <span class=\"hljs-built_in\">JSON<\/span>.stringify(data, <span class=\"hljs-literal\">null<\/span>, <span class=\"hljs-number\">2<\/span>);\n            } <span class=\"hljs-keyword\">catch<\/span> (error) {\n                <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">\"output\"<\/span>).innerText = error;\n            }\n        }\n\n        <span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">postApi<\/span>(<span class=\"hljs-params\">path<\/span>) <\/span>{\n            <span class=\"hljs-keyword\">try<\/span> {\n                <span class=\"hljs-keyword\">const<\/span> response = <span class=\"hljs-keyword\">await<\/span> fetch(path, { <span class=\"hljs-attr\">method<\/span>: <span class=\"hljs-string\">\"POST\"<\/span> });\n                <span class=\"hljs-keyword\">const<\/span> data = <span class=\"hljs-keyword\">await<\/span> response.json();\n                <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">\"output\"<\/span>).innerText =\n                    <span class=\"hljs-built_in\">JSON<\/span>.stringify(data, <span class=\"hljs-literal\">null<\/span>, <span class=\"hljs-number\">2<\/span>);\n            } <span class=\"hljs-keyword\">catch<\/span> (error) {\n                <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">\"output\"<\/span>).innerText = error;\n            }\n        }\n    <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span>\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\">Datadog\u2019s RUM Browser SDK is used to monitor real user page performance, interactions, resources, and frontend errors. (<a href=\"https:\/\/docs.datadoghq.com\/real_user_monitoring\/application_monitoring\/browser\/setup\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><code>systemd\/datadog-lab-shop.service<\/code><\/h2>\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\">&#91;Unit]\nDescription=Datadog Lab Shop Python Flask Application\nAfter=network.target datadog-agent.service\n\n&#91;Service]\nUser=ubuntu\nGroup=ubuntu\nWorkingDirectory=<span class=\"hljs-regexp\">\/opt\/<\/span>datadog-lab-shop\nEnvironment=DD_ENV=lab\nEnvironment=DD_SERVICE=datadog-lab-shop\nEnvironment=DD_VERSION=<span class=\"hljs-number\">1.0<\/span><span class=\"hljs-number\">.0<\/span>\nEnvironment=DD_AGENT_HOST=<span class=\"hljs-number\">127.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.1<\/span>\nEnvironment=DD_LOGS_INJECTION=<span class=\"hljs-literal\">true<\/span>\nEnvironment=APP_LOG_FILE=<span class=\"hljs-regexp\">\/var\/<\/span>log\/datadog-lab-shop\/app.log\nExecStart=<span class=\"hljs-regexp\">\/opt\/<\/span>datadog-lab-shop\/venv\/bin\/ddtrace-run \/opt\/datadog-lab-shop\/venv\/bin\/gunicorn -b <span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>:<span class=\"hljs-number\">8000<\/span> app:app\nRestart=always\nRestartSec=<span class=\"hljs-number\">5<\/span>\n\n&#91;Install]\nWantedBy=multi-user.target\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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><code>datadog\/lab-shop-logs.yaml<\/code><\/h2>\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\">logs:\n  - type: file\n    <span class=\"hljs-attr\">path<\/span>: <span class=\"hljs-regexp\">\/var\/<\/span>log\/datadog-lab-shop\/app.log\n    <span class=\"hljs-attr\">service<\/span>: datadog-lab-shop\n    <span class=\"hljs-attr\">source<\/span>: python\n    <span class=\"hljs-attr\">tags<\/span>:\n      - env:lab\n      - team:training\n      - project:datadog-assignment\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\">Datadog log collection on hosts requires enabling log collection in the Agent and defining a log configuration under <code>conf.d<\/code>. (<a href=\"https:\/\/docs.datadoghq.com\/agent\/logs\/?tab=tailfiles&amp;utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><code>load-test\/generate-traffic.sh<\/code><\/h2>\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-meta\">#!\/usr\/bin\/env bash<\/span>\n\nAPP_URL=<span class=\"hljs-string\">\"${APP_URL:-http:\/\/localhost:8000}\"<\/span>\n\n<span class=\"hljs-keyword\">for<\/span> i <span class=\"hljs-keyword\">in<\/span> {<span class=\"hljs-number\">1.<\/span><span class=\"hljs-number\">.100<\/span>}; <span class=\"hljs-keyword\">do<\/span>\n  curl -s <span class=\"hljs-string\">\"${APP_URL}\/health\"<\/span> &gt;<span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>\n  curl -s <span class=\"hljs-string\">\"${APP_URL}\/api\/products\"<\/span> &gt;<span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>\n  curl -s -X POST <span class=\"hljs-string\">\"${APP_URL}\/api\/cart\"<\/span> &gt;<span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>\n  curl -s -X POST <span class=\"hljs-string\">\"${APP_URL}\/api\/checkout\"<\/span> &gt;<span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>\n  curl -s <span class=\"hljs-string\">\"${APP_URL}\/api\/random\"<\/span> &gt;<span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>\n\n  <span class=\"hljs-keyword\">if<\/span> (( i % <span class=\"hljs-number\">10<\/span> == <span class=\"hljs-number\">0<\/span> )); then\n    curl -s <span class=\"hljs-string\">\"${APP_URL}\/api\/error\"<\/span> &gt;<span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>\n  fi\n\n  <span class=\"hljs-keyword\">if<\/span> (( i % <span class=\"hljs-number\">15<\/span> == <span class=\"hljs-number\">0<\/span> )); then\n    curl -s <span class=\"hljs-string\">\"${APP_URL}\/api\/slow\"<\/span> &gt;<span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>\n  fi\n\n  sleep <span class=\"hljs-number\">1<\/span>\ndone\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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 2: Base Server Setup<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Prepare Ubuntu<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo apt update\nsudo apt install -y python3 python3-venv python3-pip git curl jq\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 2: Clone the Student Project<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">sudo mkdir -p \/opt\/datadog-lab-shop\nsudo chown ubuntu:ubuntu \/opt\/datadog-lab-shop\n\ncd \/opt\/datadog-lab-shop\ngit clone <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">your-github-repo-url<\/span>&gt;<\/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\">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<h2 class=\"wp-block-heading\">Step 3: Create Python Virtual Environment<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">cd \/opt\/datadog-lab-shop\n\npython3 -m venv venv\nsource venv\/bin\/activate\n\npip install --upgrade pip\npip install -r requirements.txt\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 4: Create Log Directory<\/h2>\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\">sudo mkdir -p \/<span class=\"hljs-keyword\">var<\/span>\/log\/datadog-lab-shop\nsudo chown ubuntu:ubuntu \/<span class=\"hljs-keyword\">var<\/span>\/log\/datadog-lab-shop\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<h2 class=\"wp-block-heading\">Step 5: Run App Manually First<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cd \/opt\/datadog-lab-shop\nsource venv\/bin\/activate\n\nDD_ENV=lab \\\nDD_SERVICE=datadog-lab-shop \\\nDD_VERSION=<span class=\"hljs-number\">1.0<\/span><span class=\"hljs-number\">.0<\/span> \\\nDD_AGENT_HOST=<span class=\"hljs-number\">127.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.1<\/span> \\\nDD_LOGS_INJECTION=<span class=\"hljs-literal\">true<\/span> \\\nAPP_LOG_FILE=<span class=\"hljs-regexp\">\/var\/<\/span>log\/datadog-lab-shop\/app.log \\\nddtrace-run gunicorn -b <span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>:<span class=\"hljs-number\">8000<\/span> app:app\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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\">Test:<\/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\">curl http:<span class=\"hljs-comment\">\/\/localhost:8000\/health<\/span>\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/products<\/span>\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/error<\/span>\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\">Part 3: Assignment 1 \u2014 Infrastructure Monitoring<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Objective<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Install the Datadog Agent on Ubuntu and collect host-level metrics.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Datadog Agent collects system-level checks such as CPU, disk, IO, memory, network, NTP, uptime, file handles, and load, depending on the platform. (<a href=\"https:\/\/docs.datadoghq.com\/getting_started\/agent\/\">Datadog<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Student Tasks<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Task 1: Install Datadog Agent<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Set these variables first:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> DD_API_KEY=<span class=\"hljs-string\">\"&lt;your_datadog_api_key&gt;\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> DD_SITE=<span class=\"hljs-string\">\"&lt;your_datadog_site&gt;\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><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\">Install the Agent using the Datadog UI-generated command or the official Agent installation method from Datadog.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After installation:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl status datadog-agent\nsudo datadog-agent status\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 2: Add Host Tags<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo vi \/etc\/datadog-agent\/datadog.yaml\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">tags<\/span>:\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">env<\/span><span class=\"hljs-selector-pseudo\">:lab<\/span>\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">team<\/span><span class=\"hljs-selector-pseudo\">:training<\/span>\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">project<\/span><span class=\"hljs-selector-pseudo\">:datadog-assignment<\/span>\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-pseudo\">:datadog-lab-shop<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><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\">Restart:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl restart datadog-agent\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo datadog-agent status\nsudo datadog-agent health\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 3: Generate CPU and Memory Activity<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Install stress tool:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo apt install -y stress\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Generate CPU load:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">stress --cpu 2 --timeout 120\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Generate memory load:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">stress --vm 1 --vm-bytes 512M --timeout 120\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 4: Validate in Datadog<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Search these metrics:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">system<\/span><span class=\"hljs-selector-class\">.cpu<\/span><span class=\"hljs-selector-class\">.user<\/span>\n<span class=\"hljs-selector-tag\">system<\/span><span class=\"hljs-selector-class\">.cpu<\/span><span class=\"hljs-selector-class\">.idle<\/span>\n<span class=\"hljs-selector-tag\">system<\/span><span class=\"hljs-selector-class\">.mem<\/span><span class=\"hljs-selector-class\">.used<\/span>\n<span class=\"hljs-selector-tag\">system<\/span><span class=\"hljs-selector-class\">.disk<\/span><span class=\"hljs-selector-class\">.used<\/span>\n<span class=\"hljs-selector-tag\">system<\/span><span class=\"hljs-selector-class\">.net<\/span><span class=\"hljs-selector-class\">.bytes_sent<\/span>\n<span class=\"hljs-selector-tag\">datadog<\/span><span class=\"hljs-selector-class\">.agent<\/span><span class=\"hljs-selector-class\">.running<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><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<h2 class=\"wp-block-heading\">Deliverables<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Deliverable<\/th><th>Required Evidence<\/th><\/tr><\/thead><tbody><tr><td>Agent installed<\/td><td>Screenshot of host in Infrastructure List<\/td><\/tr><tr><td>Tags applied<\/td><td>Screenshot showing <code>env:lab<\/code> and <code>service:datadog-lab-shop<\/code><\/td><\/tr><tr><td>CPU test<\/td><td>Screenshot of CPU spike<\/td><\/tr><tr><td>Memory test<\/td><td>Screenshot of memory usage<\/td><\/tr><tr><td>Agent status<\/td><td>Paste output of <code>sudo datadog-agent status<\/code> summary<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Grading Rubric<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Criteria<\/th><th>Marks<\/th><\/tr><\/thead><tbody><tr><td>Agent installed correctly<\/td><td>20<\/td><\/tr><tr><td>Host tags added correctly<\/td><td>20<\/td><\/tr><tr><td>CPU\/memory metrics visible<\/td><td>25<\/td><\/tr><tr><td>Student explains top 5 Linux metrics<\/td><td>20<\/td><\/tr><tr><td>Screenshots and command evidence<\/td><td>15<\/td><\/tr><tr><td>Total<\/td><td>100<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 4: Assignment 2 \u2014 Log Monitoring<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Objective<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enable Datadog log collection and collect Python application logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Datadog logs can be collected through the Agent from files, TCP\/UDP, journald, and Windows channels. For custom log files, a config is placed under the Agent <code>conf.d<\/code> directory. (<a href=\"https:\/\/docs.datadoghq.com\/agent\/logs\/?tab=tailfiles&amp;utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Student Tasks<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Task 1: Enable Logs in Agent<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo vi \/etc\/datadog-agent\/datadog.yaml\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Set:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">logs_enabled: <span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><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\">Restart:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl restart datadog-agent\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 2: Add App Log Collection<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create config directory:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo mkdir -p \/etc\/datadog-agent\/conf.d\/datadog-lab-shop.d\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Copy config:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo cp \/opt\/datadog-lab-shop\/datadog\/lab-shop-logs.yaml \\\n  \/etc\/datadog-agent\/conf.d\/datadog-lab-shop.d\/conf.yaml\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Restart:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl restart datadog-agent\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo datadog-agent status\nsudo datadog-agent configcheck\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 3: Generate App Logs<\/h3>\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\">curl http:<span class=\"hljs-comment\">\/\/localhost:8000\/<\/span>\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/products<\/span>\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/slow<\/span>\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/error<\/span>\ncurl -X POST http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/checkout<\/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<p class=\"wp-block-paragraph\">Check local logs:<\/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\">tail -f \/<span class=\"hljs-keyword\">var<\/span>\/log\/datadog-lab-shop\/app.log\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\">Check what Agent is reading:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo datadog-agent stream-logs\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 4: Query Logs in Datadog<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use Log Explorer queries:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-pseudo\">:datadog-lab-shop<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><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<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-pseudo\">:datadog-lab-shop<\/span> <span class=\"hljs-selector-tag\">status<\/span><span class=\"hljs-selector-pseudo\">:error<\/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\">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<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\">service:datadog-lab-shop @path:<span class=\"hljs-regexp\">\/api\/<\/span>error\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<pre class=\"wp-block-code\"><span><code class=\"hljs\">service:datadog-lab-shop @level:ERROR\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 5: Create Log Facets<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create facets for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">level\npath\nenv\nversion\npayment_provider\ndelay_seconds\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Deliverables<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Deliverable<\/th><th>Required Evidence<\/th><\/tr><\/thead><tbody><tr><td>Log collection enabled<\/td><td>Screenshot of Logs Agent in <code>datadog-agent status<\/code><\/td><\/tr><tr><td>App logs visible<\/td><td>Screenshot from Log Explorer<\/td><\/tr><tr><td>Error logs visible<\/td><td>Query screenshot for <code>@level:ERROR<\/code><\/td><\/tr><tr><td>Facets created<\/td><td>Screenshot of facets<\/td><\/tr><tr><td>Explanation<\/td><td>Explain difference between ingested and indexed logs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Grading Rubric<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Criteria<\/th><th>Marks<\/th><\/tr><\/thead><tbody><tr><td>Log collection enabled<\/td><td>20<\/td><\/tr><tr><td>App log file collected<\/td><td>25<\/td><\/tr><tr><td>Log queries demonstrated<\/td><td>20<\/td><\/tr><tr><td>Facets created correctly<\/td><td>20<\/td><\/tr><tr><td>Troubleshooting explanation<\/td><td>15<\/td><\/tr><tr><td>Total<\/td><td>100<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 5: Assignment 3 \u2014 APM<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Objective<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Instrument the Python Flask application with Datadog APM and generate traces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Datadog APM provides visibility into application performance, request traces, errors, latency, services, and dependencies. (<a href=\"https:\/\/docs.datadoghq.com\/getting_started\/tracing\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Student Tasks<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Task 1: Enable APM in Agent<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo vi \/etc\/datadog-agent\/datadog.yaml\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Ensure:<\/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\">apm_config:\n  enabled: <span class=\"hljs-literal\">true<\/span>\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\">Restart:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl restart datadog-agent\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo datadog-agent status\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Look for APM \/ Trace Agent section.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Task 2: Run App with <code>ddtrace-run<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Manual run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cd \/opt\/datadog-lab-shop\nsource venv\/bin\/activate\n\nDD_ENV=lab \\\nDD_SERVICE=datadog-lab-shop \\\nDD_VERSION=<span class=\"hljs-number\">1.0<\/span><span class=\"hljs-number\">.0<\/span> \\\nDD_AGENT_HOST=<span class=\"hljs-number\">127.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.1<\/span> \\\nDD_LOGS_INJECTION=<span class=\"hljs-literal\">true<\/span> \\\nddtrace-run gunicorn -b <span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>:<span class=\"hljs-number\">8000<\/span> app:app\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><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 documents <code>ddtrace-run<\/code> as the standard command prefix for Python automatic instrumentation. (<a href=\"https:\/\/docs.datadoghq.com\/tracing\/trace_collection\/dd_libraries\/python.md?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Task 3: Check Python Tracer Config<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">source \/opt\/datadog-lab-shop\/venv\/bin\/activate\nddtrace-run --info\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 4: Generate Traces<\/h3>\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\"><span class=\"hljs-keyword\">for<\/span> i <span class=\"hljs-keyword\">in<\/span> {<span class=\"hljs-number\">1.<\/span><span class=\"hljs-number\">.50<\/span>}; <span class=\"hljs-keyword\">do<\/span>\n  curl -s http:<span class=\"hljs-comment\">\/\/localhost:8000\/health &gt;\/dev\/null<\/span>\n  curl -s http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/products &gt;\/dev\/null<\/span>\n  curl -s http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/slow &gt;\/dev\/null<\/span>\n  curl -s http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/error &gt;\/dev\/null<\/span>\ndone\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<h3 class=\"wp-block-heading\">Task 5: Validate in Datadog<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Go to:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">APM \u2192 Services \u2192 datadog-lab-shop\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-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Requests\nErrors\nLatency\np95 latency\nResources\nTraces\nService <span class=\"hljs-built_in\">Map<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><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\">APM trace metrics commonly include hits, errors, latency, and Apdex. (<a href=\"https:\/\/docs.datadoghq.com\/tracing\/metrics\/metrics_namespace\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deliverables<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Deliverable<\/th><th>Required Evidence<\/th><\/tr><\/thead><tbody><tr><td>APM enabled<\/td><td>Screenshot of APM Agent status<\/td><\/tr><tr><td>Service visible<\/td><td>Screenshot of APM service page<\/td><\/tr><tr><td>Traces visible<\/td><td>Screenshot of a trace<\/td><\/tr><tr><td>Error trace visible<\/td><td>Screenshot of <code>\/api\/error<\/code> trace<\/td><\/tr><tr><td>Slow trace visible<\/td><td>Screenshot of <code>\/api\/slow<\/code> trace<\/td><\/tr><tr><td>Explanation<\/td><td>Explain trace, span, service, resource<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Grading Rubric<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Criteria<\/th><th>Marks<\/th><\/tr><\/thead><tbody><tr><td>APM Agent enabled<\/td><td>20<\/td><\/tr><tr><td>Python app instrumented<\/td><td>25<\/td><\/tr><tr><td>Traces visible<\/td><td>25<\/td><\/tr><tr><td>Errors and latency demonstrated<\/td><td>20<\/td><\/tr><tr><td>Concept explanation<\/td><td>10<\/td><\/tr><tr><td>Total<\/td><td>100<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 6: Assignment 4 \u2014 RUM<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Objective<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enable Real User Monitoring for the frontend page of the Flask app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RUM monitors real user activity and experience in web and mobile applications, including performance, frontend errors, user actions, network requests, and resources. (<a href=\"https:\/\/docs.datadoghq.com\/real_user_monitoring\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Important Note<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">RUM is not installed on the Linux server like the Agent. RUM is added to the <strong>browser frontend<\/strong> using the Datadog Browser SDK.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Student Tasks<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Task 1: Create RUM Application<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In Datadog:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Digital Experience \u2192 RUM Applications \u2192 <span class=\"hljs-keyword\">New<\/span> Application\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><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\">Choose:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application type: Browser\nName: datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Copy:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application ID\nClient Token\nDatadog Site\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 2: Add RUM Values to systemd Service<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo vi \/etc\/systemd\/system\/datadog-lab-shop.service\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">Environment=DD_RUM_APPLICATION_ID=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">your_rum_application_id<\/span>&gt;<\/span>\nEnvironment=DD_RUM_CLIENT_TOKEN=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">your_rum_client_token<\/span>&gt;<\/span>\nEnvironment=DD_SITE=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">your_datadog_site<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><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\">Reload and restart:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl daemon-reload\nsudo systemctl restart datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 3: Open Browser and Generate RUM Events<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Open:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">http:\/\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server-public-ip<\/span>&gt;<\/span>:8000\/\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><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\">Click all buttons:<\/p>\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\">Products\nAdd to Cart\nCheckout\nSlow API\n<span class=\"hljs-built_in\">Error<\/span> API\nRandom API\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<h3 class=\"wp-block-heading\">Task 4: Validate in Datadog<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Go to:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Digital Experience \u2192 RUM Explorer\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Views\nActions\nResources\nErrors\nSessions\nUser Journey\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Deliverables<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Deliverable<\/th><th>Required Evidence<\/th><\/tr><\/thead><tbody><tr><td>RUM app created<\/td><td>Screenshot of RUM application<\/td><\/tr><tr><td>Browser page monitored<\/td><td>Screenshot of RUM session<\/td><\/tr><tr><td>User actions visible<\/td><td>Screenshot showing button clicks<\/td><\/tr><tr><td>Resource timing visible<\/td><td>Screenshot of API resource calls<\/td><\/tr><tr><td>Explanation<\/td><td>Difference between RUM and APM<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Grading Rubric<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Criteria<\/th><th>Marks<\/th><\/tr><\/thead><tbody><tr><td>RUM application created<\/td><td>20<\/td><\/tr><tr><td>Browser SDK configured<\/td><td>25<\/td><\/tr><tr><td>Sessions\/actions\/resources visible<\/td><td>30<\/td><\/tr><tr><td>RUM\/APM difference explained<\/td><td>15<\/td><\/tr><tr><td>Screenshot quality<\/td><td>10<\/td><\/tr><tr><td>Total<\/td><td>100<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 7: Assignment 5 \u2014 Synthetic Monitoring<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Objective<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create synthetic tests to monitor application uptime and user behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Datadog Synthetic Monitoring can create API, browser, mobile, and network tests to simulate user flows and check application availability and performance. (<a href=\"https:\/\/docs.datadoghq.com\/synthetics\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Student Tasks<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Task 1: Create API Test for Health Endpoint<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Go to:<\/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\">Digital Experience \u2192 Tests \u2192 <span class=\"hljs-keyword\">New<\/span> Test \u2192 API Test\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\">Configure:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Value<\/th><\/tr><\/thead><tbody><tr><td>Name<\/td><td>LAB &#8211; Health API Test<\/td><\/tr><tr><td>URL<\/td><td><code>http:\/\/&lt;server-public-ip&gt;:8000\/health<\/code><\/td><\/tr><tr><td>Method<\/td><td>GET<\/td><\/tr><tr><td>Locations<\/td><td>Choose 1 or 2 public locations<\/td><\/tr><tr><td>Frequency<\/td><td>Every 5 or 10 minutes for lab<\/td><\/tr><tr><td>Assertion 1<\/td><td>Status code is 200<\/td><\/tr><tr><td>Assertion 2<\/td><td>Response body contains <code>ok<\/code><\/td><\/tr><tr><td>Assertion 3<\/td><td>Response time less than 1000 ms<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Datadog API tests monitor endpoints and can alert on latency, status code, headers, body content, and other conditions. (<a href=\"https:\/\/docs.datadoghq.com\/getting_started\/synthetics\/api_test\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Task 2: Create API Test for Error Endpoint<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create another API test:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">http:\/\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server-public-ip<\/span>&gt;<\/span>:8000\/api\/error\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><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\">Expected assertion:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Status code is 500\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Purpose: teach expected failure vs unexpected failure.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Task 3: Create Browser Test<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Go to:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Digital Experience \u2192 Tests \u2192 <span class=\"hljs-keyword\">New<\/span> Test \u2192 Browser Test\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><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\">Flow:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Open homepage\nClick Products\nValidate response contains Datadog T-Shirt\nClick Add to Cart\nValidate response contains Item added\nClick Checkout\nValidate response changes\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Task 4: Trigger Failure<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Stop the app:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl stop datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wait for synthetic test failure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Restart:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl start datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Deliverables<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Deliverable<\/th><th>Required Evidence<\/th><\/tr><\/thead><tbody><tr><td>API test created<\/td><td>Screenshot of test config<\/td><\/tr><tr><td>Browser test created<\/td><td>Screenshot of browser steps<\/td><\/tr><tr><td>Failure captured<\/td><td>Screenshot of failed synthetic result<\/td><\/tr><tr><td>Recovery captured<\/td><td>Screenshot of recovered result<\/td><\/tr><tr><td>Explanation<\/td><td>API test vs browser test<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Grading Rubric<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Criteria<\/th><th>Marks<\/th><\/tr><\/thead><tbody><tr><td>API test configured correctly<\/td><td>25<\/td><\/tr><tr><td>Browser test configured correctly<\/td><td>30<\/td><\/tr><tr><td>Failure\/recovery demonstrated<\/td><td>25<\/td><\/tr><tr><td>Explanation of use cases<\/td><td>10<\/td><\/tr><tr><td>Clean test naming\/tags<\/td><td>10<\/td><\/tr><tr><td>Total<\/td><td>100<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 8: Assignment 6 \u2014 Alerts \/ Monitors<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Objective<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create meaningful Datadog monitors across infrastructure, logs, APM, RUM, and Synthetics.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Datadog supports many monitor types, including metric, host, log, APM, RUM, synthetic, anomaly, forecast, outlier, composite, SLO, and more. (<a href=\"https:\/\/docs.datadoghq.com\/monitors\/types.md?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Student Tasks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create at least six monitors.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Monitor 1: Host CPU Monitor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Type:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Metric Monitor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Query concept:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">avg:system.cpu.user{env:lab,service:datadog-lab-shop} by {host}\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Alert condition:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Above 80 for 5 minutes\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Message:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">High CPU detected on {{host.name}} for datadog-lab-shop lab.\nCheck running processes and recent load test.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Monitor 2: Host No Data Monitor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Type:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Host Monitor or Metric Monitor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Purpose:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Alert if Agent stops reporting.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use metric:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">datadog<\/span><span class=\"hljs-selector-class\">.agent<\/span><span class=\"hljs-selector-class\">.running<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><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\">No-data alerts are useful when data is expected continuously, such as Agent host metrics. Datadog monitor configuration supports missing-data behavior such as No Data, evaluate as zero, or last known status depending on monitor type. (<a href=\"https:\/\/docs.datadoghq.com\/monitors\/configuration\/?tab=evaluateddata&amp;utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Monitor 3: Log Error Monitor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Type:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Log Monitor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Query:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service:datadog-lab-shop @level:ERROR\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Condition:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">More than 5 errors in 5 minutes\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Message:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application error spike detected for datadog-lab-shop.\nCheck Log Explorer and APM traces for \/api\/error or checkout failures.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Monitor 4: APM Error Rate Monitor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Type:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">APM Monitor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Target:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-pseudo\">:datadog-lab-shop<\/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\">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\">Condition:<\/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\"><span class=\"hljs-built_in\">Error<\/span> rate above <span class=\"hljs-number\">5<\/span>% <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-number\">5<\/span> minutes\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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Monitor 5: APM Latency Monitor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Type:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">APM Monitor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Condition:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">p95 latency above 1 second for 5 minutes\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use <code>\/api\/slow<\/code> to trigger.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Monitor 6: Synthetic Test Monitor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Type:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Synthetic Monitor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Target:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">LAB - Health API Test\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Condition:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Alert when test fails <span class=\"hljs-keyword\">from<\/span> selected locations\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><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<h2 class=\"wp-block-heading\">Monitor 7: RUM Error Monitor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Type:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">RUM Monitor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Condition:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Frontend error count &gt; 0 or resource error rate above threshold\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Datadog has a dedicated RUM monitor type for monitoring real user performance and errors. (<a href=\"https:\/\/docs.datadoghq.com\/monitors\/types\/real_user_monitoring\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Deliverables<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Deliverable<\/th><th>Required Evidence<\/th><\/tr><\/thead><tbody><tr><td>CPU monitor<\/td><td>Screenshot<\/td><\/tr><tr><td>No-data monitor<\/td><td>Screenshot<\/td><\/tr><tr><td>Log error monitor<\/td><td>Screenshot<\/td><\/tr><tr><td>APM error monitor<\/td><td>Screenshot<\/td><\/tr><tr><td>APM latency monitor<\/td><td>Screenshot<\/td><\/tr><tr><td>Synthetic monitor<\/td><td>Screenshot<\/td><\/tr><tr><td>RUM monitor<\/td><td>Screenshot<\/td><\/tr><tr><td>Alert test<\/td><td>Screenshot of at least one triggered alert<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Grading Rubric<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Criteria<\/th><th>Marks<\/th><\/tr><\/thead><tbody><tr><td>Correct monitor types<\/td><td>25<\/td><\/tr><tr><td>Query correctness<\/td><td>25<\/td><\/tr><tr><td>Alert thresholds reasonable<\/td><td>15<\/td><\/tr><tr><td>Notification messages useful<\/td><td>15<\/td><\/tr><tr><td>Trigger\/recovery demonstrated<\/td><td>20<\/td><\/tr><tr><td>Total<\/td><td>100<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 9: Assignment 7 \u2014 Dashboard<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Objective<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create one unified Datadog dashboard for the Python application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Datadog dashboards provide visibility across products and can include widgets, template variables, permissions, and troubleshooting context. (<a href=\"https:\/\/docs.datadoghq.com\/dashboards\/configure.md?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dashboard Name<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Datadog Lab Shop - Full Stack Observability Dashboard\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Required Template Variables<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create dashboard template variables:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Variable<\/th><th>Source<\/th><\/tr><\/thead><tbody><tr><td><code>env<\/code><\/td><td><code>env<\/code> tag<\/td><\/tr><tr><td><code>service<\/code><\/td><td><code>service<\/code> tag<\/td><\/tr><tr><td><code>host<\/code><\/td><td><code>host<\/code> tag<\/td><\/tr><tr><td><code>version<\/code><\/td><td><code>version<\/code> tag<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Template variables dynamically filter widgets by tags, attributes, and facets. (<a href=\"https:\/\/docs.datadoghq.com\/dashboards\/template_variables\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Required Dashboard Widgets<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Section<\/th><th>Widget<\/th><th>Query \/ Source<\/th><\/tr><\/thead><tbody><tr><td>Infrastructure<\/td><td>CPU Usage<\/td><td><code>system.cpu.user{env:$env}<\/code><\/td><\/tr><tr><td>Infrastructure<\/td><td>Memory Used<\/td><td><code>system.mem.used{env:$env}<\/code><\/td><\/tr><tr><td>Infrastructure<\/td><td>Disk Used<\/td><td><code>system.disk.used{env:$env}<\/code><\/td><\/tr><tr><td>Infrastructure<\/td><td>Network Traffic<\/td><td><code>system.net.bytes_sent<\/code>, <code>system.net.bytes_rcvd<\/code><\/td><\/tr><tr><td>Agent<\/td><td>Agent Running<\/td><td><code>datadog.agent.running{env:$env}<\/code><\/td><\/tr><tr><td>Logs<\/td><td>Error Logs Count<\/td><td><code>service:$service @level:ERROR<\/code><\/td><\/tr><tr><td>Logs<\/td><td>Recent Error Logs<\/td><td>Log stream widget<\/td><\/tr><tr><td>APM<\/td><td>Request Rate<\/td><td>APM service metrics<\/td><\/tr><tr><td>APM<\/td><td>Error Rate<\/td><td>APM service metrics<\/td><\/tr><tr><td>APM<\/td><td>p95 Latency<\/td><td>APM service metrics<\/td><\/tr><tr><td>APM<\/td><td>Top Resources<\/td><td><code>\/health<\/code>, <code>\/api\/products<\/code>, <code>\/api\/slow<\/code>, <code>\/api\/error<\/code><\/td><\/tr><tr><td>RUM<\/td><td>Sessions<\/td><td>RUM data<\/td><\/tr><tr><td>RUM<\/td><td>User Actions<\/td><td>Button clicks<\/td><\/tr><tr><td>RUM<\/td><td>Resource Timing<\/td><td>API resource calls<\/td><\/tr><tr><td>Synthetics<\/td><td>Health Test Status<\/td><td>Synthetic test widget<\/td><\/tr><tr><td>Alerts<\/td><td>Active Monitors<\/td><td>Monitor summary<\/td><\/tr><tr><td>Business<\/td><td>Checkout Attempts<\/td><td><code>datadog_lab_shop.checkout.attempt<\/code><\/td><\/tr><tr><td>Business<\/td><td>Checkout Failures<\/td><td><code>datadog_lab_shop.checkout.attempt{status:failed}<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Datadog supports custom widgets and cloning out-of-the-box dashboards as a starting point. (<a href=\"https:\/\/docs.datadoghq.com\/dashboards\/widgets\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Deliverables<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Deliverable<\/th><th>Required Evidence<\/th><\/tr><\/thead><tbody><tr><td>Dashboard created<\/td><td>Screenshot<\/td><\/tr><tr><td>Template variables<\/td><td>Screenshot<\/td><\/tr><tr><td>Infra widgets<\/td><td>Screenshot<\/td><\/tr><tr><td>Log widgets<\/td><td>Screenshot<\/td><\/tr><tr><td>APM widgets<\/td><td>Screenshot<\/td><\/tr><tr><td>RUM widgets<\/td><td>Screenshot<\/td><\/tr><tr><td>Synthetic widgets<\/td><td>Screenshot<\/td><\/tr><tr><td>Alert widgets<\/td><td>Screenshot<\/td><\/tr><tr><td>Explanation<\/td><td>5-minute dashboard walkthrough<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Grading Rubric<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Criteria<\/th><th>Marks<\/th><\/tr><\/thead><tbody><tr><td>Dashboard structure<\/td><td>20<\/td><\/tr><tr><td>Template variables<\/td><td>15<\/td><\/tr><tr><td>Infra\/log\/APM\/RUM\/synthetic coverage<\/td><td>35<\/td><\/tr><tr><td>Useful visual design<\/td><td>15<\/td><\/tr><tr><td>Explanation and troubleshooting flow<\/td><td>15<\/td><\/tr><tr><td>Total<\/td><td>100<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 10: Final Project \u2014 Complete Datadog Observability Implementation<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Project Title<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">End-to-End Datadog Observability for Python Flask Application on Ubuntu\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Final Project Scenario<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You are hired as a DevOps\/SRE engineer. Your company has a Python Flask application running on Ubuntu. The engineering team wants complete observability using Datadog.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You must implement:<\/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\">Infrastructure monitoring\nLog monitoring\nAPM tracing\nRUM browser monitoring\nSynthetic monitoring\nAlerting\nDashboarding\nTroubleshooting documentation\nGitHub repository\n<span class=\"hljs-keyword\">Final<\/span> report\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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Final Project Step-by-Step<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Prepare GitHub Repository<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Repo name:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Required branches:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/datadog-observability\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Required folders:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">app\ndatadog\nsystemd\nload-test\nscreenshots\ndocs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Deploy App on Ubuntu<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">sudo mkdir -p \/opt\/datadog-lab-shop\nsudo chown ubuntu:ubuntu \/opt\/datadog-lab-shop\n\ncd \/opt\/datadog-lab-shop\ngit clone <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">your-github-repo-url<\/span>&gt;<\/span> .\n\npython3 -m venv venv\nsource venv\/bin\/activate\npip install -r requirements.txt\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><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\">Install systemd service:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo cp systemd\/datadog-lab-shop.service \/etc\/systemd\/system\/datadog-lab-shop.service\nsudo systemctl daemon-reload\nsudo systemctl enable datadog-lab-shop\nsudo systemctl start datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate:<\/p>\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\">sudo systemctl status datadog-lab-shop\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/health<\/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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Install and Configure Datadog Agent<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo datadog-agent status\nsudo datadog-agent health\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Configure tags:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">tags<\/span>:\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">env<\/span><span class=\"hljs-selector-pseudo\">:lab<\/span>\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-pseudo\">:datadog-lab-shop<\/span>\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">version<\/span><span class=\"hljs-selector-pseudo\">:1.0.0<\/span>\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">team<\/span><span class=\"hljs-selector-pseudo\">:training<\/span>\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">project<\/span><span class=\"hljs-selector-pseudo\">:datadog-final-project<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><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\">Restart:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl restart datadog-agent\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Enable Logs<\/h2>\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\">logs_enabled: <span class=\"hljs-literal\">true<\/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\">Copy log config:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo mkdir -p \/etc\/datadog-agent\/conf.d\/datadog-lab-shop.d\n\nsudo cp \/opt\/datadog-lab-shop\/datadog\/lab-shop-logs.yaml \\\n  \/etc\/datadog-agent\/conf.d\/datadog-lab-shop.d\/conf.yaml\n\nsudo systemctl restart datadog-agent\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo datadog-agent status\nsudo datadog-agent stream-logs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Enable APM<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm in <code>datadog.yaml<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apm_config:\n  enabled: <span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><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\">Restart:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl restart datadog-agent\nsudo systemctl restart datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate:<\/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\">curl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/products<\/span>\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/slow<\/span>\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/error<\/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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Enable RUM<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create RUM app in Datadog and add environment variables to the systemd service:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">Environment=DD_RUM_APPLICATION_ID=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">rum_application_id<\/span>&gt;<\/span>\nEnvironment=DD_RUM_CLIENT_TOKEN=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">rum_client_token<\/span>&gt;<\/span>\nEnvironment=DD_SITE=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">datadog_site<\/span>&gt;<\/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\">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\">Restart:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl daemon-reload\nsudo systemctl restart datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Open in browser:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">http:\/\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server-public-ip<\/span>&gt;<\/span>:8000\/\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7: Create Synthetic Tests<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Test<\/th><th>Type<\/th><th>Endpoint<\/th><\/tr><\/thead><tbody><tr><td>Health API Test<\/td><td>API<\/td><td><code>\/health<\/code><\/td><\/tr><tr><td>Products API Test<\/td><td>API<\/td><td><code>\/api\/products<\/code><\/td><\/tr><tr><td>Homepage Browser Test<\/td><td>Browser<\/td><td><code>\/<\/code><\/td><\/tr><tr><td>Checkout Journey Test<\/td><td>Browser<\/td><td><code>\/ \u2192 cart \u2192 checkout<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Synthetic tests can run manually, on schedule, or from CI\/CD pipelines, and can use public or private locations. (<a href=\"https:\/\/docs.datadoghq.com\/getting_started\/synthetics\/?utm_source=chatgpt.com\">Datadog<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 8: Create Monitors<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Required final project monitors:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Monitor<\/th><th>Type<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Host CPU High<\/td><td>Metric<\/td><td>Infra health<\/td><\/tr><tr><td>Host Memory High<\/td><td>Metric<\/td><td>Infra health<\/td><\/tr><tr><td>Agent No Data<\/td><td>Metric\/Host<\/td><td>Agent failure<\/td><\/tr><tr><td>Application Error Logs<\/td><td>Log<\/td><td>App error spike<\/td><\/tr><tr><td>APM Error Rate<\/td><td>APM<\/td><td>Backend error rate<\/td><\/tr><tr><td>APM p95 Latency<\/td><td>APM<\/td><td>Slow API detection<\/td><\/tr><tr><td>Synthetic Health Failure<\/td><td>Synthetic<\/td><td>Uptime failure<\/td><\/tr><tr><td>RUM Error<\/td><td>RUM<\/td><td>Frontend error detection<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 9: Create Final Dashboard<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dashboard must include:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Host health\nAgent health\nApplication logs\n<span class=\"hljs-built_in\">Error<\/span> logs\nAPM latency\nAPM error rate\nAPM request rate\nRUM sessions\nRUM actions\nSynthetic uptime\nMonitor status\nCustom business metrics\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><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<h2 class=\"wp-block-heading\">Step 10: Create Final Report<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Students must submit a report with this structure:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">1. Project Overview\n2. Architecture Diagram\n3. Ubuntu Server Setup\n4. Datadog Agent Setup\n5. Infrastructure Monitoring\n6. Log Monitoring\n7. APM Setup\n8. RUM Setup\n9. Synthetic Monitoring\n10. Alerts \/ Monitors\n11. Dashboard\n12. Test Scenarios\n13. Troubleshooting\n14. Screenshots\n15. Lessons Learned\n16. GitHub Repository\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\">Final Project Test Scenarios<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Students must demonstrate these scenarios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Scenario 1: CPU Spike<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">stress --cpu 2 --timeout 120\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CPU metric increases\nCPU monitor may trigger\nDashboard reflects spike\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Scenario 2: Application Error<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/error<\/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\">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 result:<\/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-built_in\">Error<\/span> log appears\nAPM error trace appears\nLog\/APM monitor may trigger\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<h2 class=\"wp-block-heading\">Scenario 3: Slow API<\/h2>\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\">curl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/slow<\/span>\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<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">APM latency increases\nSlow trace visible\nLatency monitor may trigger\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Scenario 4: Checkout Failure<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">for<\/span> i <span class=\"hljs-keyword\">in<\/span> {<span class=\"hljs-number\">1.<\/span><span class=\"hljs-number\">.20<\/span>}; <span class=\"hljs-keyword\">do<\/span>\n  curl -s -X POST http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/checkout<\/span>\ndone\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><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 result:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Some checkout failures generated\nCustom metric appears\n<span class=\"hljs-built_in\">Error<\/span> logs created\nAPM error traces created\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><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\">Scenario 5: Synthetic Failure<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl stop datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Synthetic API test fails\nSynthetic monitor alerts\nDashboard shows test failure\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Recover:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl start datadog-lab-shop\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Scenario 6: RUM User Journey<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open browser and click:<\/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\">Products\nAdd to Cart\nCheckout\nSlow API\n<span class=\"hljs-built_in\">Error<\/span> API\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\">Expected result:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">RUM session visible\nActions visible\nResource requests visible\nFrontend\/backend relationship visible\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\">Final Project Deliverables<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Deliverable<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>GitHub repository<\/td><td>Full source code and configs<\/td><\/tr><tr><td>README<\/td><td>Setup instructions<\/td><\/tr><tr><td>Screenshots<\/td><td>Infra, logs, APM, RUM, synthetics, monitors, dashboard<\/td><\/tr><tr><td>Final report<\/td><td>Complete project explanation<\/td><\/tr><tr><td>Architecture diagram<\/td><td>Mermaid or image<\/td><\/tr><tr><td>Troubleshooting guide<\/td><td>Common issues and fixes<\/td><\/tr><tr><td>Demo video optional<\/td><td>5\u201310 minute walkthrough<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Final Project Grading Rubric<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Category<\/th><th>Marks<\/th><\/tr><\/thead><tbody><tr><td>GitHub project quality<\/td><td>10<\/td><\/tr><tr><td>Ubuntu app deployment<\/td><td>10<\/td><\/tr><tr><td>Datadog Agent and infra monitoring<\/td><td>10<\/td><\/tr><tr><td>Log collection and queries<\/td><td>10<\/td><\/tr><tr><td>APM traces and service visibility<\/td><td>15<\/td><\/tr><tr><td>RUM implementation<\/td><td>10<\/td><\/tr><tr><td>Synthetic tests<\/td><td>10<\/td><\/tr><tr><td>Monitors and alert quality<\/td><td>10<\/td><\/tr><tr><td>Dashboard quality<\/td><td>10<\/td><\/tr><tr><td>Final report and explanation<\/td><td>5<\/td><\/tr><tr><td>Total<\/td><td>100<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Student README Template<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Students should include this in their GitHub repo.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Datadog Lab Shop<\/span>\n\n<span class=\"hljs-comment\">## Project Overview<\/span>\n\nThis project demonstrates end-to-end Datadog observability <span class=\"hljs-keyword\">for<\/span> a Python Flask application running on Ubuntu Linux.\n\n<span class=\"hljs-comment\">## Features Implemented<\/span>\n\n- Infrastructure Monitoring\n- Log Monitoring\n- APM Tracing\n- Real User Monitoring\n- Synthetic Monitoring\n- Alerts \/ Monitors\n- Dashboard\n- Custom Metrics\n\n<span class=\"hljs-comment\">## Application Endpoints<\/span>\n\n| Endpoint | Purpose |\n|---|---|\n| `\/` | Frontend page |\n| `\/health` | Health check |\n| `\/api\/products` | Product API |\n| `\/api\/cart` | Cart API |\n| `\/api\/checkout` | Checkout API |\n| `\/api\/slow` | Slow endpoint |\n| `\/api\/error` | Error endpoint |\n| `\/api\/random` | Random behavior endpoint |\n\n<span class=\"hljs-comment\">## Setup Steps<\/span>\n\n<span class=\"hljs-number\">1.<\/span> Install Python dependencies.\n<span class=\"hljs-number\">2.<\/span> Install Datadog Agent.\n<span class=\"hljs-number\">3.<\/span> Enable logs.\n<span class=\"hljs-number\">4.<\/span> Enable APM.\n<span class=\"hljs-number\">5.<\/span> Configure RUM.\n<span class=\"hljs-number\">6.<\/span> Create Synthetic tests.\n<span class=\"hljs-number\">7.<\/span> Create monitors.\n<span class=\"hljs-number\">8.<\/span> Create dashboard.\n\n<span class=\"hljs-comment\">## Validation<\/span>\n\nRun:\n\n```bash\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/health<\/span>\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/products<\/span>\ncurl http:<span class=\"hljs-comment\">\/\/localhost:8000\/api\/error<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><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\">Screenshots<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Add screenshots under the <code>screenshots\/<\/code> folder.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lessons Learned<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Write what you learned about Datadog infrastructure monitoring, logs, APM, RUM, synthetics, alerts, and dashboards.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">\n---\n\n<span class=\"hljs-comment\"># Common Troubleshooting Section for Students<\/span>\n\n| Problem | Likely Cause | Fix |\n|---|---|---|\n| Host not visible | Agent not running, wrong API key, wrong site | `sudo datadog-agent status` |\n| Logs not visible | `logs_enabled` <span class=\"hljs-keyword\">false<\/span> <span class=\"hljs-keyword\">or<\/span> log config wrong | Check `datadog.yaml` <span class=\"hljs-keyword\">and<\/span> `conf.d` |\n| APM not visible | App not started with `ddtrace-run` | Restart app with `ddtrace-run` |\n| RUM not visible | Wrong RUM app ID\/client token\/site | Check browser console <span class=\"hljs-keyword\">and<\/span> env vars |\n| Synthetic test fails | App port blocked <span class=\"hljs-keyword\">or<\/span> server <span class=\"hljs-keyword\">private<\/span> | Open firewall <span class=\"hljs-keyword\">or<\/span> <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">private<\/span> <span class=\"hljs-title\">location<\/span> |\n| <span class=\"hljs-title\">Monitor<\/span> <span class=\"hljs-title\">not<\/span> <span class=\"hljs-title\">triggering<\/span> | <span class=\"hljs-title\">Wrong<\/span> <span class=\"hljs-title\">query<\/span> <span class=\"hljs-title\">or<\/span> <span class=\"hljs-title\">threshold<\/span> | <span class=\"hljs-title\">Test<\/span> <span class=\"hljs-title\">query<\/span> <span class=\"hljs-title\">in<\/span> <span class=\"hljs-title\">Metrics<\/span>\/<span class=\"hljs-title\">Logs<\/span>\/<span class=\"hljs-title\">APM<\/span> <span class=\"hljs-title\">explorer<\/span> |\n| <span class=\"hljs-title\">Dashboard<\/span> <span class=\"hljs-title\">empty<\/span> | <span class=\"hljs-title\">Wrong<\/span> <span class=\"hljs-title\">template<\/span> <span class=\"hljs-title\">variable<\/span> | <span class=\"hljs-title\">Clear<\/span> <span class=\"hljs-title\">variables<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">check<\/span> <span class=\"hljs-title\">tags<\/span> |\n| <span class=\"hljs-title\">No<\/span> <span class=\"hljs-title\">custom<\/span> <span class=\"hljs-title\">metrics<\/span> | <span class=\"hljs-title\">DogStatsD<\/span> <span class=\"hljs-title\">not<\/span> <span class=\"hljs-title\">reachable<\/span> | <span class=\"hljs-title\">Check<\/span> <span class=\"hljs-title\">UDP<\/span> 8125 <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">Agent<\/span> <span class=\"hljs-title\">status<\/span> |\n\n---\n\n# <span class=\"hljs-title\">Instructor<\/span> <span class=\"hljs-title\">Notes<\/span>\n\n## <span class=\"hljs-title\">Recommended<\/span> <span class=\"hljs-title\">Lab<\/span> <span class=\"hljs-title\">Duration<\/span>\n\n| <span class=\"hljs-title\">Module<\/span> | <span class=\"hljs-title\">Duration<\/span> |\n|---|---:|\n| <span class=\"hljs-title\">Intro<\/span> + <span class=\"hljs-title\">project<\/span> <span class=\"hljs-title\">setup<\/span> | 1 <span class=\"hljs-title\">hour<\/span> |\n| <span class=\"hljs-title\">Infra<\/span> <span class=\"hljs-title\">monitoring<\/span> | 1 <span class=\"hljs-title\">hour<\/span> |\n| <span class=\"hljs-title\">Logs<\/span> | 1.5 <span class=\"hljs-title\">hours<\/span> |\n| <span class=\"hljs-title\">APM<\/span> | 1.5 <span class=\"hljs-title\">hours<\/span> |\n| <span class=\"hljs-title\">RUM<\/span> | 1 <span class=\"hljs-title\">hour<\/span> |\n| <span class=\"hljs-title\">Synthetics<\/span> | 1 <span class=\"hljs-title\">hour<\/span> |\n| <span class=\"hljs-title\">Alerts<\/span> | 1.5 <span class=\"hljs-title\">hours<\/span> |\n| <span class=\"hljs-title\">Dashboard<\/span> | 1 <span class=\"hljs-title\">hour<\/span> |\n| <span class=\"hljs-title\">Final<\/span> <span class=\"hljs-title\">project<\/span> | 3\u20135 <span class=\"hljs-title\">hours<\/span> |\n\n<span class=\"hljs-title\">Total<\/span> <span class=\"hljs-title\">recommended<\/span> <span class=\"hljs-title\">duration<\/span>:\n\n```<span class=\"hljs-title\">text<\/span>\n12 <span class=\"hljs-title\">to<\/span> 15 <span class=\"hljs-title\">hours<\/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\">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\">Recommended Team Size<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">1 to 3 students per team\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Recommended Final Demo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each student\/team should present:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">1. Application running\n2. Datadog host view\n3. Logs Explorer\n4. APM service page\n5. RUM session\n6. Synthetic test\n7. Alert trigger\n8. Dashboard\n9. Lessons learned\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\">Final Assignment Summary<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Assignment<\/th><th>Final Skill<\/th><\/tr><\/thead><tbody><tr><td>Infra<\/td><td>Student can install Agent and monitor Linux<\/td><\/tr><tr><td>Logs<\/td><td>Student can collect and query app logs<\/td><\/tr><tr><td>APM<\/td><td>Student can trace Python app requests<\/td><\/tr><tr><td>RUM<\/td><td>Student can monitor browser user experience<\/td><\/tr><tr><td>Synthetics<\/td><td>Student can test uptime and user journeys<\/td><\/tr><tr><td>Alerts<\/td><td>Student can create actionable monitors<\/td><\/tr><tr><td>Dashboard<\/td><td>Student can build a full observability view<\/td><\/tr><tr><td>Final Project<\/td><td>Student can implement real Datadog observability end to end<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This version turns the old \u201cDatadog assignment\u201d into a real, production-style, hands-on project. It gives students a working Python app, real failure scenarios, actual Datadog telemetry, screenshots to submit, and a final project they can show in interviews or internal assessments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Target Audience This lab is suitable for: DevOps engineers, SREs, cloud engineers, platform engineers, application engineers, monitoring engineers, and students learning Datadog from practical implementation. Final Outcome&#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-31255","post","type-post","status-publish","format-standard","hentry","category-datadog"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/31255","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=31255"}],"version-history":[{"count":7,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/31255\/revisions"}],"predecessor-version":[{"id":77132,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/31255\/revisions\/77132"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=31255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=31255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=31255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}