<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: sanjay yadav</title>
    <description>The latest articles on DEV Community by sanjay yadav (@sanjay_yadav_).</description>
    <link>https://dev.to/sanjay_yadav_</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3902053%2Ff2660aca-b937-4ed0-aa7c-c58c559b48b0.jpg</url>
      <title>DEV Community: sanjay yadav</title>
      <link>https://dev.to/sanjay_yadav_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sanjay_yadav_"/>
    <language>en</language>
    <item>
      <title>Your Streamlit App Works. But Where Do the Logs Go When Production Breaks?</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Fri, 25 Sep 2026 03:28:39 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/your-streamlit-app-works-but-where-do-the-logs-go-when-production-breaks-1kgc</link>
      <guid>https://dev.to/sanjay_yadav_/your-streamlit-app-works-but-where-do-the-logs-go-when-production-breaks-1kgc</guid>
      <description>&lt;p&gt;A Streamlit app can be up and running in minutes.&lt;/p&gt;

&lt;p&gt;But when something breaks in production, the first question is usually:&lt;/p&gt;

&lt;p&gt;“Where are the logs?”&lt;/p&gt;

&lt;p&gt;If your Streamlit application is running on EC2 or Kubernetes, relying only on local logs can make debugging harder.&lt;/p&gt;

&lt;p&gt;One practical setup is:&lt;/p&gt;

&lt;p&gt;Streamlit → Python Logging → Watchtower → CloudWatch Logs&lt;/p&gt;

&lt;p&gt;With boto3 and watchtower, application logs can be sent to CloudWatch, giving you one place to search and investigate production issues.&lt;/p&gt;

&lt;p&gt;In this walkthrough, I cover the setup step by step, including log configuration and CloudWatch integration.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.kubeblogs.com/streamlit-cloudwatch-logs/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.ghost.io%2Fc%2F3d%2F8d%2F3d8d3fc6-1cfb-4dae-9d5e-b53f28dc1ebd%2Fcontent%2Fimages%2F2024%2F10%2Fkb-ima--3-.png" height="450" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.kubeblogs.com/streamlit-cloudwatch-logs/" rel="noopener noreferrer" class="c-link"&gt;
            How to Stream Logs to AWS CloudWatch | Streamlit
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            In this blog we give you step-by-step guide on streaming logs to AWS Cloudwatch for your streamlit application. Checkout the full article now!
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
          kubeblogs.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;How do you handle logs for Python applications in production?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>python</category>
      <category>aws</category>
      <category>kafka</category>
    </item>
    <item>
      <title>Why Doesn't EC2 Show Memory Usage in CloudWatch?</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Thu, 24 Sep 2026 05:22:42 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/why-doesnt-ec2-show-memory-usage-in-cloudwatch-5f1k</link>
      <guid>https://dev.to/sanjay_yadav_/why-doesnt-ec2-show-memory-usage-in-cloudwatch-5f1k</guid>
      <description>&lt;p&gt;CPU and network metrics are available by default, but EC2 memory usage requires the CloudWatch Agent.&lt;/p&gt;

&lt;p&gt;A practical setup looks like:&lt;/p&gt;

&lt;p&gt;EC2 → CloudWatch Agent → Memory Metrics → CloudWatch Alarm → Slack&lt;/p&gt;

&lt;p&gt;You can also manage the monitoring and alarms with Terraform instead of configuring everything manually.&lt;/p&gt;

&lt;p&gt;This is useful when you want to catch memory pressure before it becomes an application or instance problem.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.kubeblogs.com/set-up-ec2-memory-monitoring/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.ghost.io%2Fc%2F3d%2F8d%2F3d8d3fc6-1cfb-4dae-9d5e-b53f28dc1ebd%2Fcontent%2Fimages%2F2024%2F11%2Fkb-ima--4-.png" height="450" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.kubeblogs.com/set-up-ec2-memory-monitoring/" rel="noopener noreferrer" class="c-link"&gt;
            EC2 Memory Not Showing? Fix It with CloudWatch Agent
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            If you can’t see EC2 memory usage in CloudWatch, you’re not alone. Here’s how to fix missing RAM metrics and avoid performance issues.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
          kubeblogs.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;How do you monitor EC2 memory in your AWS environments?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>cloudwatch</category>
      <category>terraform</category>
    </item>
    <item>
      <title>How Are You Using Airflow Outside Data Pipelines?</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Wed, 23 Sep 2026 05:12:35 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/how-are-you-using-airflow-outside-data-pipelines-1p1k</link>
      <guid>https://dev.to/sanjay_yadav_/how-are-you-using-airflow-outside-data-pipelines-1p1k</guid>
      <description>&lt;p&gt;We started using Apache Airflow for repetitive DevOps workflows, not just data pipelines.&lt;/p&gt;

&lt;p&gt;Some of the workflows we automated:&lt;/p&gt;

&lt;p&gt;GitHub token validation&lt;br&gt;
Kubernetes kubeconfig checks&lt;br&gt;
GitHub secret updates&lt;br&gt;
AWS cost monitoring&lt;br&gt;
Slack notifications&lt;/p&gt;

&lt;p&gt;The useful part is having scheduling, retries, dependencies, and visibility around these workflows instead of managing everything with separate scripts and cron jobs.&lt;/p&gt;

&lt;p&gt;I wrote about the workflows, implementation, and lessons from using Airflow for these DevOps tasks.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.kubeblogs.com/how-we-use-airflow-to-optimize-our-devops-workflow/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.ghost.io%2Fc%2F3d%2F8d%2F3d8d3fc6-1cfb-4dae-9d5e-b53f28dc1ebd%2Fcontent%2Fimages%2F2024%2F12%2Fkb-ima--7-.png" height="450" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.kubeblogs.com/how-we-use-airflow-to-optimize-our-devops-workflow/" rel="noopener noreferrer" class="c-link"&gt;
            How we use Apache Airflow to optimise our DevOps workflow
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            See how we use Apache Airflow to automate DevOps workflows, manage secrets, and reduce manual tasks with real-world examples.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
          kubeblogs.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Have you used Airflow for DevOps automation? What did you automate first?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>airflow</category>
      <category>automation</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Jenkins or GitHub Actions — What Would You Choose Today?</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Tue, 22 Sep 2026 04:44:00 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/jenkins-or-github-actions-what-would-you-choose-today-97d</link>
      <guid>https://dev.to/sanjay_yadav_/jenkins-or-github-actions-what-would-you-choose-today-97d</guid>
      <description>&lt;p&gt;Both can handle CI/CD, but the operational trade-offs are different.&lt;/p&gt;

&lt;p&gt;Jenkins: more infrastructure control and customization, but you manage the servers, plugins, and maintenance.&lt;/p&gt;

&lt;p&gt;GitHub Actions: simpler setup and tight GitHub integration, with GitHub-hosted or self-hosted runners.&lt;/p&gt;

&lt;p&gt;We compared both and also built a Docker build-and-push pipeline using each tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.kubeblogs.com/jenkins-or-github-actions/" rel="noopener noreferrer"&gt;https://www.kubeblogs.com/jenkins-or-github-actions/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you were starting a new CI/CD pipeline today, what would you choose—and why?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>jenkins</category>
      <category>github</category>
      <category>cicd</category>
    </item>
    <item>
      <title>How Much Do You Trust the Dependencies Your Applications Install?</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Wed, 05 Aug 2026 03:44:20 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/how-much-do-you-trust-the-dependencies-your-applications-install-2ng0</link>
      <guid>https://dev.to/sanjay_yadav_/how-much-do-you-trust-the-dependencies-your-applications-install-2ng0</guid>
      <description>&lt;p&gt;Software supply chain security has become one of the biggest concerns in modern application development.&lt;/p&gt;

&lt;p&gt;Most of us run commands like pip install, npm install, or go get without thinking twice. We trust package registries, open-source maintainers, and our existing workflows because that's how software gets built every day.&lt;/p&gt;

&lt;p&gt;But recent supply chain incidents have shown that a single compromised dependency can become an entry point into CI/CD pipelines, cloud environments, and Kubernetes clusters.&lt;/p&gt;

&lt;p&gt;It made me think about how different teams are approaching dependency security today.&lt;/p&gt;

&lt;p&gt;Do you scan dependencies before they reach production?&lt;br&gt;
Are you generating SBOMs or verifying package integrity as part of your build process?&lt;br&gt;
Has your team changed its software supply chain practices after the recent attacks?&lt;/p&gt;

&lt;p&gt;I came across a technical breakdown of the recent LiteLLM supply chain incident. It explains how the compromise happened, how it could affect containerized and Kubernetes-based environments, and the practical steps teams can take to reduce similar risks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.kubeblogs.com/your-pip-install-backdoored-kubernetes-cluster/" rel="noopener noreferrer"&gt;https://www.kubeblogs.com/your-pip-install-backdoored-kubernetes-cluster/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd be interested to hear how your team approaches dependency management and software supply chain security. Have recent incidents changed the way you build, scan, or deploy applications?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>security</category>
      <category>python</category>
    </item>
    <item>
      <title>Is the Cheapest Cloud Instance Really the Cheapest?</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Tue, 04 Aug 2026 01:18:20 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/is-the-cheapest-cloud-instance-really-the-cheapest-7im</link>
      <guid>https://dev.to/sanjay_yadav_/is-the-cheapest-cloud-instance-really-the-cheapest-7im</guid>
      <description>&lt;p&gt;When comparing cloud providers, it's easy to focus on the monthly cost of an instance.&lt;/p&gt;

&lt;p&gt;But that's rarely the full picture.&lt;/p&gt;

&lt;p&gt;Storage performance, IOPS, throughput, and the overall infrastructure design can have just as much impact on performance and long-term costs as the instance itself.&lt;/p&gt;

&lt;p&gt;I'm curious how other teams approach this.&lt;/p&gt;

&lt;p&gt;Do you benchmark infrastructure before choosing a cloud provider?&lt;br&gt;
Has a benchmark ever changed your decision?&lt;br&gt;
How much weight do you give to storage performance compared to instance pricing?&lt;/p&gt;

&lt;p&gt;While looking into this topic, I found a benchmark comparing AWS and Civo using the same workload. It looks at CPU performance, storage performance, and overall cost instead of relying on feature comparisons.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.kubeblogs.com/aws-charges-extra-for-storage-performance-that-civo-ships-by-default/" rel="noopener noreferrer"&gt;https://www.kubeblogs.com/aws-charges-extra-for-storage-performance-that-civo-ships-by-default/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd be interested to hear how your team evaluates cloud infrastructure before committing to a platform.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cloud</category>
      <category>performance</category>
    </item>
    <item>
      <title>Race Conditions Don't Show Up Until Your App Has Real Users</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Thu, 09 Jul 2026 04:13:08 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/race-conditions-dont-show-up-until-your-app-has-real-users-37do</link>
      <guid>https://dev.to/sanjay_yadav_/race-conditions-dont-show-up-until-your-app-has-real-users-37do</guid>
      <description>&lt;p&gt;Race conditions are one of those bugs that can make you question everything.&lt;/p&gt;

&lt;p&gt;The application works during development. Testing passes. Even staging looks fine.&lt;/p&gt;

&lt;p&gt;Then production traffic arrives.&lt;/p&gt;

&lt;p&gt;Two requests update the same record at almost the same time.&lt;/p&gt;

&lt;p&gt;One change silently overwrites another.&lt;/p&gt;

&lt;p&gt;A transaction gets stuck waiting on a lock.&lt;/p&gt;

&lt;p&gt;Now you're chasing a bug that only appears under very specific conditions.&lt;/p&gt;

&lt;p&gt;The frustrating part is that these issues aren't easy to reproduce. They only show up when multiple requests interact with the same data at just the wrong moment.&lt;/p&gt;

&lt;p&gt;My first instinct is usually to look for a bug in the application code. More often than not, the real problem is how concurrent requests interact with the database.&lt;/p&gt;

&lt;p&gt;Understanding transactions, row-level locking, and when to use tools like transaction.atomic() or select_for_update() can make a huge difference once your application starts handling real traffic.&lt;/p&gt;

&lt;p&gt;I came across this article while reading about concurrency issues in Django. It explains race conditions and deadlocks with practical examples and walks through a few approaches to avoid them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.kubeblogs.com/avoid-race-conditions-and-deadlocks-in-django-step-by-step-guide/" rel="noopener noreferrer"&gt;https://www.kubeblogs.com/avoid-race-conditions-and-deadlocks-in-django-step-by-step-guide/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>database</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Used to Think Database Search Was Good Enough Until Our Project Started Growing</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Mon, 06 Jul 2026 05:25:15 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/i-used-to-think-database-search-was-good-enough-until-our-project-started-growing-3p86</link>
      <guid>https://dev.to/sanjay_yadav_/i-used-to-think-database-search-was-good-enough-until-our-project-started-growing-3p86</guid>
      <description>&lt;p&gt;I don't think many developers spend much time thinking about search when a project is new. I know I didn't.&lt;/p&gt;

&lt;p&gt;At the beginning, a simple database query usually does the job. There isn't much content, searches are fast, and nobody complains.&lt;/p&gt;

&lt;p&gt;That changes over time.&lt;/p&gt;

&lt;p&gt;As more pages, blog posts, or products get added, people expect search to be fast, forgiving, and accurate. They don't care how it's implemented—they just expect to find what they're looking for in a few seconds.&lt;/p&gt;

&lt;p&gt;That's when I realized that adding a search box isn't the same as building a good search experience.&lt;/p&gt;

&lt;p&gt;Features like typo tolerance, relevance ranking, autocomplete, and fast indexing suddenly become much more important than they seemed on day one.&lt;/p&gt;

&lt;p&gt;I came across this article while looking into better search options for Django projects. It walks through integrating Algolia with Django and explains why dedicated search starts making sense once your application outgrows basic database queries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.kubeblogs.com/add-blazing-fast-search-algolia/" rel="noopener noreferrer"&gt;https://www.kubeblogs.com/add-blazing-fast-search-algolia/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>webdev</category>
      <category>elasticsearch</category>
    </item>
    <item>
      <title>Container Debugging Gets Much Harder Once SSH Stops Being an Option</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Mon, 08 Jun 2026 04:55:46 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/container-debugging-gets-much-harder-once-ssh-stops-being-an-option-120e</link>
      <guid>https://dev.to/sanjay_yadav_/container-debugging-gets-much-harder-once-ssh-stops-being-an-option-120e</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Is it even possible to exec into a running container in ECS? It definitely is - but it’s not straightforward to setup.&lt;/p&gt;

&lt;p&gt;ECS Exec lets you connect to your containers on demand using the AWS CLI, giving you a way to inspect, debug, and fix issues inside your running services—without exposing them to external access.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll walk through setting up ECS Exec, checking configurations, handling common issues, and automating the whole process using Terraform. Whether you're troubleshooting a failed task or looking to simplify access for future deployments, this will help you get there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install Required Tools
&lt;/h3&gt;

&lt;h4&gt;
  
  
  AWS CLI
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;aws --version&lt;/code&gt;&lt;br&gt;
The AWS CLI version should be 2.1.33 or later.&lt;/p&gt;
&lt;h4&gt;
  
  
  Session Manager Plugin
&lt;/h4&gt;

&lt;p&gt;(Required for ECS Exec)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;session-manager-plugin --version&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
If it is not installed, download it from AWS Documentation.&lt;/p&gt;
&lt;h3&gt;
  
  
  IAM Permissions
&lt;/h3&gt;

&lt;p&gt;The ECS Task Execution Role must have these permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession",
                "ssm:DescribeSessions",
                "ssm:TerminateSession",
                "ecs:ExecuteCommand",
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Checking if ECS Exec is Enabled for a Service
&lt;/h3&gt;

&lt;p&gt;Run the following command to check if ECS Exec is enabled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs describe-services \
  --cluster &amp;lt;your-cluster&amp;gt; \
  --services &amp;lt;your-service&amp;gt; \
  --query 'services[*].enableExecuteCommand' \
  --region &amp;lt;your-region&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the output is true, ECS Exec is enabled. If false, it must be enabled as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Felutdyam7lqm0zmyuohx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Felutdyam7lqm0zmyuohx.png" alt=" " width="800" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Checking ECS Exec via AWS Console
&lt;/h3&gt;

&lt;p&gt;You can also check this in the AWS Console:&lt;/p&gt;

&lt;p&gt;Open the Amazon ECS Console.&lt;br&gt;
Navigate to Clusters and select your cluster.&lt;br&gt;
Click on the Services tab and select your service.&lt;br&gt;
Under the Networking section, look for the ECS Exec status.&lt;br&gt;
If ECS Exec is not enabled, follow the next steps to enable it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vsk2wyde5mdwvljc87q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vsk2wyde5mdwvljc87q.png" alt=" " width="799" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If ECS Exec is not enabled, follow the next steps to enable it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step-by-Step: Enabling and Using ECS Exec in AWS Fargate
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Step 1: Enable ECS Exec for the Service
&lt;/h4&gt;

&lt;p&gt;Run the following command to enable ECS Exec on your ECS service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs update-service \
  --cluster &amp;lt;your-cluster&amp;gt; \
  --service &amp;lt;your-service&amp;gt; \
  --enable-execute-command \
  --region &amp;lt;your-region&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Verify ECS Exec is Enabled at the Service Level
&lt;/h4&gt;

&lt;p&gt;After running the command, check if ECS Exec is enabled by running:&lt;br&gt;
Go to your service check networking you can see ecs exec service level as well&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs describe-services \
  --cluster &amp;lt;your-cluster&amp;gt; \
  --services &amp;lt;your-service&amp;gt; \
  --query 'services[*].enableExecuteCommand' \
  --region &amp;lt;your-region&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the output is true, ECS Exec is enabled at the service level.&lt;/p&gt;

&lt;h4&gt;
  
  
  Alternative: Check in the AWS Console (UI)
&lt;/h4&gt;

&lt;p&gt;Open the Amazon ECS Console.&lt;br&gt;
Go to Clusters and select your cluster.&lt;br&gt;
Click on the Services tab and select your service.&lt;br&gt;
Under Networking, look for the ECS Exec status.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3suotg943pbuufo0gvvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3suotg943pbuufo0gvvl.png" alt=" " width="799" height="249"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Step 3: Verify ECS Exec at the Task Level
&lt;/h4&gt;

&lt;p&gt;Now, check if ECS Exec is enabled at the task level:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Amazon ECS Console.&lt;/li&gt;
&lt;li&gt;Go to Clusters and select your cluster.&lt;/li&gt;
&lt;li&gt;Click on the Tasks tab and choose a running task.&lt;/li&gt;
&lt;li&gt;Look for the Execute Command option to confirm ECS Exec is enabled.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprztbfanq987man66wix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprztbfanq987man66wix.png" alt=" " width="800" height="356"&gt;&lt;/a&gt;&lt;br&gt;
Alternatively, use the AWS CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs describe-tasks \
  --cluster &amp;lt;your-cluster&amp;gt; \
  --tasks &amp;lt;your-task-id&amp;gt; \
  --query 'tasks[].enableExecuteCommand' \
  --region &amp;lt;your-region&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 4: Verify if the ECS Exec Agent is Running
&lt;/h4&gt;

&lt;p&gt;To confirm that the ECS Exec agent is running inside the task, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs describe-tasks \
  --cluster &amp;lt;your-cluster&amp;gt; \
  --tasks &amp;lt;your-task-id&amp;gt; \
  --query 'tasks[].containers[].managedAgents'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the agent is running, you will see an output like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
    {
        "name": "ExecuteCommandAgent",
        "status": "RUNNING"
    }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it is not running, restart the ECS task to apply changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
aws ecs update-service \
  --cluster &amp;lt;your-cluster&amp;gt; \
  --service &amp;lt;your-service&amp;gt; \
  --desired-count 1 \
  --region &amp;lt;your-region&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 5: Access the Container Using ECS Exec
&lt;/h4&gt;

&lt;p&gt;Once ECS Exec is enabled and the agent is running, you can connect to the container using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs execute-command \
  --cluster &amp;lt;your-cluster&amp;gt; \
  --task &amp;lt;your-task-id&amp;gt; \
  --container &amp;lt;your-container-name&amp;gt; \
  --command "/bin/sh" \
  --interactive \
  --region &amp;lt;your-region&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything is set up correctly, you should now have access to the container.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxg7f5x0ss1lp1gyyl497.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxg7f5x0ss1lp1gyyl497.png" alt=" " width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  If ECS Exec is still not working, use the Amazon ECS Exec Checker tool to diagnose the issue.
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 6: Troubleshooting ECS Exec Issues
&lt;/h4&gt;

&lt;p&gt;Clone the ECS Exec Checker Repository&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/aws-containers/amazon-ecs-exec-checker.git
cd amazon-ecs-exec-checker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the ECS Exec Checker Script&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod +x check-ecs-exec.sh
./check-ecs-exec.sh &amp;lt;your-cluster&amp;gt; &amp;lt;your-task-arn&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./check-ecs-exec.sh architect-ecs-qa arn:aws:ecs:us-east-1:98700009786565:task/architect-ecs-qa/9f309986767jhhjghcgcjgjhb424ae
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script checks IAM permissions, ECS service configurations, and required dependencies. If any issue is found, the output will indicate what needs to be fixed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94jnpgfrfkc4kprzklrz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94jnpgfrfkc4kprzklrz.png" alt=" " width="800" height="484"&gt;&lt;/a&gt;&lt;br&gt;
From the screenshot, we can clearly see that the missing permissions are causing the issue.&lt;/p&gt;

&lt;p&gt;The ECS task role (architect-miniapps-ecs-qa) does not have the required permissions for ssmmessages, specifically:&lt;/p&gt;

&lt;p&gt;ssmmessages:CreateControlChannel&lt;br&gt;
ssmmessages:CreateDataChannel&lt;br&gt;
ssmmessages:OpenControlChannel&lt;br&gt;
ssmmessages:OpenDataChannel&lt;/p&gt;

&lt;p&gt;These permissions are currently implicitly denied, which means the ECS task is unable to establish a session using AWS Systems Manager (SSM).&lt;/p&gt;

&lt;p&gt;Additionally, since this task is running in a private subnet, it requires a VPC endpoint for SSM Messages (ssmmessages) to communicate with AWS services. However, as seen in the output, the required com.amazonaws.us-east-1.ssmmessages VPC endpoint is missing.&lt;/p&gt;

&lt;p&gt;To fix this:&lt;/p&gt;
&lt;h4&gt;
  
  
  Attach the necessary permissions to the ECS task role.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl7rzvjj4oyr3wspkv8ku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl7rzvjj4oyr3wspkv8ku.png" alt=" " width="800" height="273"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Add the missing VPC endpoint (com.amazonaws.us-east-1.ssmmessages) in the AWS VPC settings.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foutrbqs4nn0si3efbjnu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foutrbqs4nn0si3efbjnu.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Update Security Group Rules for VPC Endpoints
&lt;/h4&gt;

&lt;p&gt;The security group attached to the VPC endpoints must allow HTTPS (port 443) inbound from the ECS tasks' security group and all outbound traffic to the ECS tasks' security group.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50v4ah258t9zmzca5rjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50v4ah258t9zmzca5rjl.png" alt=" " width="799" height="208"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Step 8: Automate Everything with Terraform
&lt;/h4&gt;

&lt;p&gt;If you want to skip all the manual steps and set everything up in one go, you can use our Terraform configuration. It includes all the necessary IAM permissions, VPC endpoints, and ECS Exec-enabled services.&lt;/p&gt;

&lt;p&gt;Here’s a demo terraform code that runs a service in a private subnet, and the required endpoints are added automatically. With this Terraform setup, you can apply the same configuration for all your future services without repeating these steps. If you already have a VPC in place you can easily understand what changes you might have to make in your own infra manually.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;provider "aws" {
  region = "us-east-1"
}

terraform {
  required_version = "~&amp;gt; 1.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~&amp;gt; 5.0"
    }
  }
}

data "aws_availability_zones" "available" {}

locals {
  region = "us-east-1"
  name   = "kubenine-${basename(path.cwd)}"

  vpc_cidr = "10.0.0.0/16"
  azs      = slice(data.aws_availability_zones.available.names, 0, 3)

  container_name = "kubenine-container"
  container_port = 80

  vpc_cidr_block = var.vpc_id != "" ? data.aws_vpc.vpc.cidr_block : module.vpc[0].vpc_cidr_block
  tags = {
    Repository = "https://github.com/terraform-aws-modules/terraform-aws-ecs"
  }
}

# Create a VPC with public and private subnets 
# Private subnets do not have any internet access since NAT gateway is disabled
module "vpc" {
  count   = var.vpc_id == "" ? 1 : 0
  source  = "terraform-aws-modules/vpc/aws"
  version = "~&amp;gt; 5.0"

  name = local.name
  cidr = local.vpc_cidr

  azs             = local.azs
  private_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 4, k)]
  public_subnets  = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 48)]

  public_subnet_tags = { "Tier" = "Public" }
  private_subnet_tags = { "Tier" = "Private" }
  private_route_table_tags = { "Tier" = "Private-route" }
  public_route_table_tags = { "Tier" = "Public-route" }

  enable_nat_gateway = false
  single_nat_gateway = false
  enable_dns_hostnames = true
  tags = local.tags

}


data "aws_vpc" "vpc" {
  # If the VPC ID is not provided, a new VPC will be created
  id = var.vpc_id != "" ? var.vpc_id : module.vpc[0].vpc_id
}

# Get private subnets in the vpc 
data "aws_subnets" "private" {
  # Add a filter to get only private subnets
  filter {
    name   = "tag:Tier"
    values = ["Private"]
  }

  # Add a filter to get only subnets in the VPC
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.vpc.id]
  }

  depends_on = [ module.vpc ]
}

data "aws_subnets" "public" {

  filter {
    name   = "tag:Tier"
    values = ["Public"]
  }

  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.vpc.id]
  }
}


data "aws_route_tables" "private" {
  vpc_id = data.aws_vpc.vpc.id

  filter {
    name   = "tag:Tier"
    values = ["Private-route"]
  }

  depends_on = [ module.vpc ]

}

output "private_route_tables" {
  value = data.aws_route_tables.private
}



module "ecs" {
  source       = "terraform-aws-modules/ecs/aws"
  cluster_name = "kubeops-ecs"
  cluster_configuration = {
    execute_command_configuration = {
      logging = "OVERRIDE"
      log_configuration = {
        cloud_watch_log_group_name = "/aws/ecs/aws-ec2"
      }
    }
  }

  fargate_capacity_providers = {
    FARGATE = {
      # The default_capacity_provider_strategy is used to determine how tasks are placed
      default_capacity_provider_strategy = {
        weight = 50
      }
    }

    # spot capacity provider is used to run tasks on Spot Instances
    FARGATE_SPOT = {
      default_capacity_provider_strategy = {
        weight = 50
      }
    }
  }
}


module "ecs_service" {
  source                 = "terraform-aws-modules/ecs/aws//modules/service"
  name                   = local.name
  cluster_arn            = module.ecs.cluster_arn
  cpu                    = 512
  memory                 = 1024
  enable_execute_command = true
  desired_count          = 1

  container_definitions = {
    (local.container_name) = {
      cpu       = 512
      memory    = 1024
      essential = true
      readonly_root_filesystem = false
      image     = "905418054480.dkr.ecr.us-east-1.amazonaws.com/dummy-log-generator"
      port_mappings = [
        {
          name          = local.container_name
          containerPort = local.container_port
          hostPort      = local.container_port
          protocol      = "tcp"
        }
      ]
    }
  }

  task_exec_iam_statements= [
        {
          actions   = [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel",
                "ecs:ExecuteCommand",
                "ssm:StartSession",
                "ssm:GetConnectionStatus",
                "ssm:DescribeSessions",
                "logs:DescribeLogGroups",
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"

          ]
          resources = ["*"]
        }
      ]

  tasks_iam_role_statements = [
        {
          actions   = [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel",
                "ecs:ExecuteCommand",
                "ssm:StartSession",
                "ssm:GetConnectionStatus",
                "ssm:DescribeSessions",
                "logs:DescribeLogGroups",
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"

          ]
          resources = ["*"]
        }
      ]

  subnet_ids = data.aws_subnets.private.ids


  service_tags = {
    "ServiceTag" = "Tag on service level"

  }

  tags = local.tags

}

# VPC Endpoints are needed because the the private subnet doesn't have internet connectivity
module "vpc_endpoints" {
  source = "terraform-aws-modules/vpc/aws//modules/vpc-endpoints"

  vpc_id = data.aws_vpc.vpc.id

  create_security_group      = true
  security_group_name_prefix = "${local.name}-vpc-endpoints-"
  security_group_description = "VPC endpoint security group"
  security_group_rules = {
    ingress_https = {
      description = "HTTPS from VPC"
      cidr_blocks = [data.aws_vpc.vpc.cidr_block]
    }
    egress_all ={
      description = "all traffic"
      cidr_blocks = [data.aws_vpc.vpc.cidr_block]
    }

  }

  endpoints = {
    s3 = {
      service             = "s3"
      service_type        = "Gateway"
      route_table_ids     = data.aws_route_tables.private.ids
      policy              = data.aws_iam_policy_document.generic_endpoint_policy.json
       tags = { Name = "s3-api-vpc-endpoint" }
    },
    ecs_telemetry = {
      service             = "ecs-telemetry"
      private_dns_enabled = true
      subnet_ids          = data.aws_subnets.private.ids
      policy              = data.aws_iam_policy_document.generic_endpoint_policy.json
      tags = { Name = "ecs-telemetry-vpc-endpoint" }
    },
    ecr_api = {
      service             = "ecr.api"
      private_dns_enabled = true
      subnet_ids          = data.aws_subnets.private.ids
      policy              = data.aws_iam_policy_document.generic_endpoint_policy.json
      tags = { Name = "ecr-api-vpc-endpoint" }
    },
    ecr_dkr = {
      service             = "ecr.dkr"
      private_dns_enabled = true
      subnet_ids          = data.aws_subnets.private.ids
      policy              = data.aws_iam_policy_document.generic_endpoint_policy.json
      tags = { Name = "ecr-dkr-vpc-endpoint" }
    },
    logs = {
      service             = "logs"
      private_dns_enabled = true
      subnet_ids          = data.aws_subnets.private.ids
      policy              = data.aws_iam_policy_document.generic_endpoint_policy.json
      tags = { Name = "logs-vpc-endpoint" }
    },
    ssmmessages={
      service             = "ssmmessages"
      private_dns_enabled = true
      subnet_ids          = data.aws_subnets.private.ids
      policy              = data.aws_iam_policy_document.generic_endpoint_policy.json
      tags = { Name = "ssmmessages-vpc-endpoint" }
    }

  }

  tags = merge(local.tags, {
    Project  = "Secret"
    Endpoint = "true"
  })
}

data "aws_iam_policy_document" "generic_endpoint_policy" {
  statement {
    effect    = "Allow"
    actions   = ["*"]
    resources = ["*"]

    principals {
      type        = "*"
      identifiers = ["*"]
    }

  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add to the "Common Issues and Fixes" Table
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fum0lfi85exd0uvbrxhul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fum0lfi85exd0uvbrxhul.png" alt=" " width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the end of the troubleshooting steps, add a small reminder:&lt;/p&gt;

&lt;p&gt;If ECS Exec is still not working,&lt;br&gt;
&lt;code&gt;An error occurred (InvalidParameterException) when calling the ExecuteCommand operation: The execute command failed because execute command was not enabled when the task was run or the execute command agent isn’t running.&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
check your ECS task definition. By default, readonlyRootFilesystem is set to true, which prevents write operations inside the container.&lt;br&gt;
To fix this, update your task definition and change:&lt;br&gt;
&lt;code&gt;"readonlyRootFilesystem": true&lt;/code&gt;&lt;br&gt;
to:&lt;/p&gt;

&lt;p&gt;"readonlyRootFilesystem": false &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18mxfaomx6beewa27shw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18mxfaomx6beewa27shw.png" alt=" " width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then redeploy the task and retry ECS Exec.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
By setting up the necessary IAM permissions, VPC endpoints, and security group rules, ECS Exec can work without issues.&lt;/p&gt;

&lt;p&gt;If you run into any errors, check the Common Issues and Fixes section for quick solutions. With this setup, you can easily access and debug your ECS containers!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>terraform</category>
      <category>containers</category>
    </item>
    <item>
      <title>Time Zones Usually Don't Become a Problem Until Your Application Goes Global</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Wed, 03 Jun 2026 05:09:21 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/time-zones-usually-dont-become-a-problem-until-your-application-goes-global-437e</link>
      <guid>https://dev.to/sanjay_yadav_/time-zones-usually-dont-become-a-problem-until-your-application-goes-global-437e</guid>
      <description>&lt;p&gt;Managing user time zones is a critical challenge in modern web applications and Django development. When your Django application serves users across different time zones globally, displaying dates and times in their local time zone becomes essential for optimal user experience and application usability. This comprehensive guide shows you practical methods to detect, handle, and implement client timezone management in Django applications, covering timezone detection, conversion, and best practices for international web development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Time Zone Detection Matters
&lt;/h2&gt;

&lt;p&gt;Users expect to see dates and times in their local timezone. Without proper time zone handling, a user in Tokyo might see meeting times in UTC, causing confusion and missed appointments. Django provides robust timezone support, but detecting the client's timezone requires combining frontend detection with backend implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Time Zone Challenges
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Data Inconsistency:&lt;/strong&gt; Storing timestamps without timezone information leads to ambiguous data. A timestamp of "2024-01-15 14:30:00" could be interpreted differently depending on the user's location.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User Experience Issues:&lt;/strong&gt; Displaying times in UTC or server timezone creates friction. Users must mentally convert times, leading to missed deadlines and poor user experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business Logic Errors:&lt;/strong&gt; Scheduling applications, booking systems, and time-sensitive operations fail when timezone handling is incorrect. A meeting scheduled for 2 PM EST might appear as 7 PM UTC to a European user.&lt;br&gt;
**&lt;br&gt;
Compliance Requirements: **Many industries require accurate time zone handling for audit trails, financial transactions, and regulatory compliance.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step-by-Step Implementation
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Method 1: JavaScript Detection with Session Storage
&lt;/h2&gt;

&lt;p&gt;The most reliable approach combines JavaScript's built-in timezone detection with Django's session framework. This method works across all browsers and doesn't require external services.&lt;/p&gt;
&lt;h4&gt;
  
  
  Frontend Implementation
&lt;/h4&gt;

&lt;p&gt;Add this JavaScript to your base template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateTimeFormat&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;resolvedOptions&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;timeZone&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/set-timezone/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-CSRFToken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[name=csrfmiddlewaretoken]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;timezone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Backend View Implementation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytz&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.http&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;JsonResponse&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;user_timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timezone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pytz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_timezone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Validate
&lt;/span&gt;        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timezone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_timezone&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;JsonResponse&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;JsonResponse&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;**Key Benefits: **This method provides 99% accuracy since it uses the browser's native timezone detection. The Intl API is supported in all modern browsers and returns the exact timezone configured on the user's system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 2: Timezone Middleware
&lt;/h2&gt;

&lt;p&gt;Middleware automatically activates the user's timezone for every request, eliminating the need to manually handle timezone activation in each view.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# middleware.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytz&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TimezoneMiddleware&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get_response&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_response&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;user_timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timezone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user_timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;activate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pytz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_timezone&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;pytz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnknownTimeZoneError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deactivate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deactivate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deactivate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Performance Impact:&lt;/strong&gt; Middleware adds minimal overhead (~1-2 ms per request). For high-traffic applications, consider caching timezone objects or using a more efficient timezone library like zoneinfo (Python 3.9+).&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 3: User Profile Integration
&lt;/h2&gt;

&lt;p&gt;For authenticated users, store timezone preferences in their profile for persistence across sessions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# models.py
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OneToOneField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on_delete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;UTC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__str__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Database Considerations:&lt;/strong&gt;Store timezone as a string rather than a foreign key. This approach is more flexible and doesn't require maintaining a separate timezone table. The pytz.common_timezones list contains 435 time zones, which is manageable for validation.&lt;/p&gt;

&lt;p&gt;**Migration Strategy: **For existing applications, create a data migration to populate timezone fields based on user location or default to UTC.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 4: Template Context Processor
&lt;/h2&gt;

&lt;p&gt;Make timezone information available in all templates without passing it explicitly from views.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# context_processors.py
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timezone_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user_timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;UTC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_authenticated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;user_timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userprofile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;user_timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timezone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;UTC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_timezone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_timezone&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Template Usage:&lt;/strong&gt; Access timezone information in any template using {{ user_timezone }}. This eliminates the need to pass timezone data from every view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caching Strategy:&lt;/strong&gt; Consider caching timezone objects in Redis or Memcached for high-traffic applications to reduce database queries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation Flow
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbxb3cj4pnkbslt20bdyy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbxb3cj4pnkbslt20bdyy.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Implementation Strategies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Database Storage Best Practices
&lt;/h3&gt;

&lt;p&gt;**&lt;br&gt;
Always Store in UTC:** Store all timestamps in UTC in your database. Convert to user timezone only for display purposes. This prevents data corruption and makes your application timezone-agnostic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Good: Store in UTC
&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Always UTC
&lt;/span&gt;
&lt;span class="c1"&gt;# Bad: Store in local timezone
&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Ambiguous timezone
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Timezone-Aware Models:&lt;/strong&gt;Use Django's timezone-aware datetime fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateTimeField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Timezone-aware
&lt;/span&gt;    &lt;span class="n"&gt;end_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateTimeField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    &lt;span class="c1"&gt;# Timezone-aware
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Performance Optimization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Timezone Object Caching:&lt;/strong&gt; Cache timezone objects to avoid repeated&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pytz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.core.cache&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_timezone_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tz_string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cache_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timezone_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tz_string&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;tz_obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;tz_obj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;tz_obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pytz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tz_string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tz_obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Cache for 1 hour
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tz_obj&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;**Database Query Optimization: **Use select_related() when fetching user profiles with timezone information:&lt;br&gt;
&lt;code&gt;users = User.objects.select_related('userprofile').filter(is_active=True)&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Input Validation:&lt;/strong&gt; Always validate timezone strings to prevent injection attacks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ALLOWED_TIMEZONES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pytz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_timezones&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tz_string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tz_string&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ALLOWED_TIMEZONES&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Privacy Compliance:&lt;/strong&gt; Time Timezone detection reveals approximate user location. Implement proper consent mechanisms and consider GDPR/privacy implications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Strategies
&lt;/h2&gt;

&lt;p&gt;**Timezone Testing: **Test your application across different timezones.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.test&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TestCase&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytz&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TimezoneTestCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_timezone_conversion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Test with different timezones
&lt;/span&gt;        &lt;span class="n"&gt;test_timezones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;UTC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;America/New_York&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Asia/Tokyo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Europe/London&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tz&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;test_timezones&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;override&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pytz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tz&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
                &lt;span class="c1"&gt;# Your timezone-dependent tests here
&lt;/span&gt;                &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mock Timezone Detection:&lt;/strong&gt; Mock JavaScript timezone detection in tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mock_timezone_detection&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;America/New_York&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Alternative: GeoIP Detection
&lt;/h2&gt;

&lt;p&gt;For applications where JavaScript isn't available, you can use GeoIP detection, though it's less accurate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_timezone_from_ip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GeoIP2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;META&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;REMOTE_ADDR&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;country&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;timezone_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;America/New_York&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GB&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Europe/London&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Asia/Kolkata&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;AU&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Australia/Sydney&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;JP&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Asia/Tokyo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;timezone_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;country_code&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;UTC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;UTC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Accuracy Limitations: GeoIP detection is only 60-70% accurate for timezone detection. Countries like the US and Russia span multiple time zones, making this method unreliable for precise time zone detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Pitfalls and Solutions
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Pitfall 1: Daylight Saving Time Issues
&lt;/h4&gt;

&lt;p&gt;Problem: DST transitions can cause timezone conversion errors.&lt;/p&gt;

&lt;p&gt;**Solution: **Always use timezone-aware datetime objects and let Django handle DST automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Good: Django handles DST automatically
&lt;/span&gt;&lt;span class="n"&gt;user_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;astimezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_timezone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Bad: Manual DST handling (error-prone)
&lt;/span&gt;&lt;span class="n"&gt;user_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;naive_datetime&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Pitfall 2: Session Timeout Issues
&lt;/h4&gt;

&lt;p&gt;Problem: Time Timezone information is lost when sessions expire.&lt;/p&gt;

&lt;p&gt;**Solution: **Implement a fallback mechanism that re-detects timezone on session loss:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_user_timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Try session first
&lt;/span&gt;    &lt;span class="n"&gt;tz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timezone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;tz&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Fallback to GeoIP or default
&lt;/span&gt;        &lt;span class="n"&gt;tz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_timezone_from_ip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;UTC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timezone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tz&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tz&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Pitfall 3: Mobile App Considerations
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Mobile apps may not have access to browser timezone detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Use device-specific timezone detection APIs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;For&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="nx"&gt;Native&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NativeModules&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;NativeModules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RNDeviceInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTimezone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;For&lt;/span&gt; &lt;span class="nx"&gt;Flutter&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;package:timezone/timezone.dart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;tz&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;final&lt;/span&gt; &lt;span class="nx"&gt;timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conclusion&lt;br&gt;
The JavaScript detection method combined with Django middleware provides the most reliable timezone handling. It directly queries the user's system timezone and integrates seamlessly with Django's timezone framework.&lt;/p&gt;

&lt;p&gt;Start with the JavaScript + session approach for immediate results. Add user profile storage for authenticated users, and implement middleware for automatic timezone activation across your application.&lt;/p&gt;

&lt;p&gt;This approach ensures your users see dates and times in their local time zone while maintaining clean, maintainable code that follows Django best practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read More
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.kubeblogs.com/how-to-create-a-custom-healthy-backend-count-metric-in-gcp-fixing-the-aws-healthyhostcount-gap/" rel="noopener noreferrer"&gt;How to Create a Custom Healthy Backend Count Metric in GCP&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.kubeblogs.com/gcp-permissions-and-scopes-for-compute-engine-vms/" rel="noopener noreferrer"&gt;GCP Permissions and Scopes for Compute Engine VMs Explained&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.kubeblogs.com/how-to-securely-expose-your-applications-using-cloudflare-tunnel-step-by-step-guide/" rel="noopener noreferrer"&gt;How to Securely Expose Your Applications Using Cloudflare Tunnel&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>backend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Most Prometheus Problems Start Long Before Dashboards Break</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Tue, 02 Jun 2026 04:51:20 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/most-prometheus-problems-start-long-before-dashboards-break-5chd</link>
      <guid>https://dev.to/sanjay_yadav_/most-prometheus-problems-start-long-before-dashboards-break-5chd</guid>
      <description>&lt;p&gt;Prometheus is an incredibly powerful tool for monitoring your systems. Its flexible data model and expressive query language, PromQL, make it one of the most popular choices in the observability world.&lt;/p&gt;

&lt;p&gt;But — that flexibility comes at a cost.&lt;/p&gt;

&lt;p&gt;When you're just starting out with Prometheus, it's easy to fall into certain traps that can cause performance issues, data overload, or alerts that don’t do what you expect. These issues can be subtle, and they often don't show up until you're deep into building your dashboards or alert rules.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through six of the most common mistakes developers make with Prometheus, explain why they’re problematic, and show you exactly how to avoid them.&lt;/p&gt;

&lt;p&gt;Let’s start with a classic one&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 1: Cardinality Bombs
&lt;/h2&gt;

&lt;p&gt;One of the most common and painful mistakes people make when starting out with Prometheus is accidentally creating what's known as a cardinality bomb. This happens when a metric is broken down by too many unique label values, which causes an explosion in the number of time series Prometheus needs to track.&lt;/p&gt;

&lt;p&gt;In Prometheus, a time series is defined by the combination of a metric name and its label values. Each unique combination creates a new time series, which Prometheus has to store, index, and process. This is normally a great feature—it lets you filter and aggregate your metrics in powerful ways. But it becomes a problem when you start using labels that take on a large or even unbounded set of values.&lt;/p&gt;

&lt;p&gt;Let’s look at an example. Say you're counting HTTP requests in your service using this metric:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http_requests_total&lt;/code&gt;&lt;br&gt;
This gives you a single time series. Now you decide to split this metric by the HTTP method, like GET or POST:&lt;br&gt;
&lt;code&gt;http_requests_total{method="GET"} http_requests_total{method="POST"} &lt;br&gt;
&lt;/code&gt;&lt;br&gt;
This creates two time series, one for each method. Still totally manageable.&lt;/p&gt;

&lt;p&gt;Then you decide to also track which user sent each request. You add the user_id label:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http_requests_total{method="GET", user_id="123456"}&lt;/code&gt;&lt;br&gt;
This is where the problem starts. Now, every single unique user_id value creates a separate time series. If you have 1,000 users, that's 1,000 new time series. If you have a million users, Prometheus now needs to store and track a million individual time series for just this one metric.&lt;/p&gt;

&lt;p&gt;And remember: this doesn’t scale linearly. Each additional label multiplies the number of possible combinations, and suddenly you’re hitting Prometheus' limits or exhausting your server’s memory.&lt;/p&gt;

&lt;p&gt;This kind of explosion in time series count is one of the most common reasons Prometheus servers become unstable, slow, or completely unresponsive. It leads to high memory usage, long query times, and brittle alerting.&lt;/p&gt;

&lt;p&gt;The key to avoiding this issue is to be intentional about which labels you use. Avoid labels with high cardinality—meaning labels that can have a large number of unique values. These often include things like user_id, email, UUID, full_url, or anything dynamic or user-generated.&lt;/p&gt;

&lt;p&gt;Instead, use labels with a small, well-defined set of values. Good examples are method, status_code, region, or job. These labels typically don’t grow unbounded over time and are much safer to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here’s a quick comparison:
&lt;/h2&gt;

&lt;p&gt;Bad (high-cardinality):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sum(rate(http_requests_total[1m])) by (user_id)&lt;/code&gt;&lt;br&gt;
Good (low-cardinality):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sum(rate(http_requests_total[1m])) by (method, status)&lt;/code&gt;&lt;br&gt;
By avoiding high-cardinality labels and being mindful of how many unique combinations you're generating, you can prevent runaway time series growth and keep your Prometheus setup healthy and fast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cwlwlhcji5k310w9m2u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cwlwlhcji5k310w9m2u.png" alt=" " width="528" height="793"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 2: Aggregating Away Too Many Labels
&lt;/h2&gt;

&lt;p&gt;In Prometheus, aggregating metrics is a common and powerful technique — especially when writing alerts or building dashboards. But it’s easy to accidentally drop important labels during aggregation, and that can make your alerts harder to manage and understand.&lt;/p&gt;

&lt;p&gt;Let’s say you’re tracking error rates across multiple services using this metric:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http_requests_total{status="500"}&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
To create an overall error rate, you might write something like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sum(rate(http_requests_total{status="500"}[5m]))&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
This works — it gives you the total error rate. But there’s a catch: when you use plain sum(), you lose all the labels from the underlying time series. That includes labels like job, service, or instance — things that can help you trace the source of the problem.&lt;/p&gt;

&lt;p&gt;Now imagine that alert fires. Without preserved labels, you won't know where the errors are coming from. You’ll see a number, but no context.&lt;/p&gt;

&lt;p&gt;That’s why it's important to use the by() modifier with your aggregations — to keep specific labels you want to preserve. For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sum by(job)(rate(http_requests_total{status="500"}[5m]))&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Now your result still gives you error rates, but broken down by job. You get both the number and the context — making your alerts actionable.&lt;/p&gt;

&lt;p&gt;If you want to drop all labels except specific ones, you can also use without(), but the idea is the same: don’t accidentally throw away useful information when you aggregate.&lt;/p&gt;

&lt;p&gt;Label preservation becomes even more critical in alerts, because tools like Alertmanager rely on labels for routing, grouping, silencing, and notifications. Losing them early in the pipeline means less flexibility and control later on.&lt;/p&gt;

&lt;p&gt;In short: sum() without by() can silently remove valuable signal from your data. Always be intentional about what you keep — and what you drop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fah0nef63wtu9mslx74i9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fah0nef63wtu9mslx74i9.png" alt=" " width="528" height="797"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 3: Unscoped Metric Selectors
&lt;/h2&gt;

&lt;p&gt;One of the lesser-known but sneaky issues in Prometheus is using unscoped metric selectors. When you're writing a PromQL query, it's tempting to just write something like:&lt;/p&gt;

&lt;p&gt;http_requests_total&lt;/p&gt;

&lt;p&gt;This seems fine at first — you're pulling all data for that metric. But here's the problem: in larger environments, multiple services might expose the same metric name. And they might not even mean the same thing.&lt;/p&gt;

&lt;p&gt;You could be unintentionally selecting data from several completely unrelated jobs or services — even ones you didn’t intend to include. Worse, a new service might start exposing a conflicting metric in the future, and your alerting rules or dashboards will suddenly break or behave strangely.&lt;/p&gt;

&lt;p&gt;Let’s say you’re building a dashboard for your frontend service, and you’re calculating the error rate like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rate(http_requests_total{status=~"5.."}[5m])&lt;br&gt;
&lt;/code&gt;If you didn’t filter this by job or service name, you might be seeing error rates from backend, frontend, auth, or anything else using the same metric — even if they’re unrelated.&lt;/p&gt;

&lt;p&gt;To prevent this, always scope your queries to the specific job or service you care about. Like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rate(http_requests_total{job="frontend", status=~"5.."}[5m])&lt;br&gt;
&lt;/code&gt;Now you're only selecting metrics coming from your frontend job, and you’re protected from conflicts in the future.&lt;/p&gt;

&lt;p&gt;It’s a small habit that makes your queries and alerts more reliable and easier to understand — especially as your Prometheus setup grows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsqtiv7muvl95rntzjbu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsqtiv7muvl95rntzjbu.png" alt=" " width="526" height="799"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 4: Missing "for" Durations in Alerting Rules
&lt;/h2&gt;

&lt;p&gt;When writing alerting rules in Prometheus, it’s common to forget or skip the for duration — the field that defines how long a condition must be true before an alert actually fires. But this small detail plays a big role in the reliability of your alerts.&lt;/p&gt;

&lt;p&gt;Let’s take a simple example:&lt;/p&gt;

&lt;p&gt;You want to alert when a target goes down, so you write:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;alert: InstanceDown&lt;br&gt;
expr: up == 0&lt;/code&gt;&lt;br&gt;
At first, this seems fine. But without a for: duration, the alert will fire immediately — even if the failure was just a temporary blip. A single scrape failure or a momentary network issue could trigger alerts that aren’t actionable.&lt;/p&gt;

&lt;p&gt;That’s where the for: field comes in. It adds tolerance for short-lived issues.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;alert: InstanceDown&lt;br&gt;
expr: up == 0&lt;br&gt;
for: 2m&lt;/code&gt;&lt;br&gt;
Now Prometheus will only fire the alert if the instance has been down for two full minutes. This makes alerts more meaningful and reduces noise.&lt;/p&gt;

&lt;p&gt;Even if your query already includes a time-averaged function like rate() or avg_over_time(), it’s still important to include a for: duration. Why? Because when the Prometheus server starts up or loses data, there may not be enough data points to truly represent that time window — and you might still get false positives.&lt;/p&gt;

&lt;p&gt;Adding a for: value makes your alerting system more robust, but you should still find a balance. Too short, and you get noise. Too long, and you might miss important signals.&lt;/p&gt;

&lt;p&gt;In general, use a for duration of at least 1–5 minutes for most alerting conditions, unless there's a strong reason to alert immediately.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxrejsdorrw6ejra6xgro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxrejsdorrw6ejra6xgro.png" alt=" " width="527" height="802"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 5: Using Too Short Rate Windows
&lt;/h2&gt;

&lt;p&gt;In Prometheus, functions like rate(), irate(), and increase() are commonly used to calculate how fast counters are increasing. But they all require a window of data — and if that window is too small, you can run into problems.&lt;/p&gt;

&lt;p&gt;Let’s say your Prometheus server scrapes metrics every 15 seconds. Now imagine writing a query like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rate(http_requests_total[20s])&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
That seems fine on the surface — you're asking for a rate over the past 20 seconds. But because your scrape interval is 15 seconds, there might only be one data point in that 20-second window. And rate() needs at least two points to work. If there aren't two, the function returns nothing at all.&lt;/p&gt;

&lt;p&gt;The result? Gaps in your graphs. Inconsistent alert behavior. Empty dashboards.&lt;/p&gt;

&lt;p&gt;This gets even worse if a scrape fails or arrives late. Now your 20-second window might contain zero points, and rate() just disappears entirely from the output.&lt;/p&gt;

&lt;p&gt;The fix is simple: choose a window that's wide enough to reliably include at least two data points — even with occasional failures.&lt;/p&gt;

&lt;p&gt;A good rule of thumb: set your rate window to at least 4–5x your scrape interval.&lt;/p&gt;

&lt;p&gt;If you scrape every 15 seconds, use a window of at least 1 minute:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rate(http_requests_total[1m])&lt;br&gt;
&lt;/code&gt;This adds consistent output and makes your graphs and alerts more reliable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwvb0zlr5dg38hc6xv0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwvb0zlr5dg38hc6xv0u.png" alt=" " width="539" height="807"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 6: Using Functions With Incorrect Metric Types
&lt;/h2&gt;

&lt;p&gt;PromQL has a variety of functions — like rate(), irate(), increase(), deriv(), and predict_linear() — each designed for specific kinds of metrics. The issue comes when you apply one of these functions to the wrong type of metric.&lt;/p&gt;

&lt;p&gt;For example, rate() is built for counters — metrics that only increase over time (like total requests). It assumes any drop in value is a counter reset, and it compensates for that. So if you use rate() on a gauge (which can go up and down naturally), it will misinterpret a normal decrease as a reset, and the result will be wrong.&lt;/p&gt;

&lt;p&gt;Let’s say you apply rate() to memory usage:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rate(memory_usage_bytes[5m])&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
If memory usage drops — which is totally normal — rate() will treat that drop as a reset and return an inflated or inaccurate result.&lt;/p&gt;

&lt;p&gt;Similarly, deriv() and predict_linear() are meant for gauges. If you apply those to counters, they won't know how to handle resets and will return nonsense or misleading output.&lt;/p&gt;

&lt;p&gt;Prometheus won’t stop you from doing this — it doesn’t know the intent of your metric. So you need to be careful and understand what kind of data you're working with.&lt;/p&gt;

&lt;p&gt;Quick guideline:&lt;/p&gt;

&lt;p&gt;Use rate(), irate(), and increase() with counters&lt;br&gt;
Use deriv(), delta(), and predict_linear() with gauges&lt;br&gt;
Always make sure you understand the metric you're querying — whether it’s a counter or a gauge — before choosing a function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fov7o4lr7kc8jepoy0966.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fov7o4lr7kc8jepoy0966.png" alt=" " width="531" height="782"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Prometheus is a powerful tool — but only if you use it wisely. The mistakes covered here are incredibly common, even among experienced teams. By avoiding them, you can build more reliable monitoring systems, write more meaningful alerts, and scale Prometheus confidently.&lt;/p&gt;

&lt;p&gt;Let’s recap:&lt;/p&gt;

&lt;p&gt;Avoid high-cardinality labels like user_id&lt;br&gt;
Preserve important labels during aggregations&lt;br&gt;
Scope your queries to the right jobs or services&lt;br&gt;
Always use for durations to reduce alert noise&lt;br&gt;
Choose appropriate rate windows based on your scrape interval&lt;br&gt;
Use PromQL functions that match your metric type&lt;br&gt;
Getting these fundamentals right helps your monitoring stay efficient, accurate, and maintainable — especially at scale.&lt;/p&gt;

&lt;p&gt;At Kubenine, we help teams set up infrastructure, cloud environments, and production-grade monitoring so that you can focus on building your product — not managing systems and alerts.&lt;/p&gt;

&lt;p&gt;Read More&lt;br&gt;
&lt;a href="https://www.kubeblogs.com/how-to-create-an-internal-load-balancer-in-civo-kubernetes-step-by-step-guide/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;How to Create an Internal Load Balancer in Civo Kubernetes.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.kubeblogs.com/how-to-best-rightsize-your-cloud-resources/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;How to Best Rightsize Your Cloud Resources&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.kubeblogs.com/how-to-host-a-static-website-using-amazon-s3/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;How to Host a Static Website Using Amazon S3&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.kubeblogs.com/private-kubernetes-api-cloudflare-zero-trust-warp/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Your Kubernetes API Is Public — Here’s How to Make It Private&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.kubeblogs.com/k3s-vs-kubernetes-k8s-performance-architecture-use-cases-and-when-to-choose-each/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;K3s vs Kubernetes (K8s): Performance, Architecture &amp;amp; Use Cases&lt;/a&gt;&lt;/p&gt;

</description>
      <category>prometheus</category>
      <category>devops</category>
      <category>kubernetes</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Most Teams Don't Move to Amazon RDS for Performance</title>
      <dc:creator>sanjay yadav</dc:creator>
      <pubDate>Fri, 29 May 2026 05:19:50 +0000</pubDate>
      <link>https://dev.to/sanjay_yadav_/most-teams-dont-move-to-amazon-rds-for-performance-41l8</link>
      <guid>https://dev.to/sanjay_yadav_/most-teams-dont-move-to-amazon-rds-for-performance-41l8</guid>
      <description>&lt;p&gt;You’ve decided to move your applications from on-premises to AWS and are looking at the cloud services that best meet your needs. When moving an application with a relational database like Oracle, MySQL, or SQL Server to the cloud, you'll face the choice between Amazon RDS and AWS EC2.&lt;/p&gt;

&lt;p&gt;You need to decide whether to:&lt;/p&gt;

&lt;p&gt;Use AWS’s Relational Database Service (RDS)&lt;br&gt;
Host a database server on an AWS EC2 (Elastic Compute) instance&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AWS RDS?
&lt;/h2&gt;

&lt;p&gt;Amazon Relational Database Service (Amazon RDS) is a managed Database-as-a-Service (DBaaS) that helps IT administrators easily set up, run, and scale relational databases in the cloud. RDS supports popular database engines like MySQL, MariaDB, PostgreSQL, Oracle, and Microsoft SQL Server.&lt;/p&gt;

&lt;p&gt;When moving to the cloud, most applications using these databases can switch to Amazon RDS without much hassle. You can choose different database instance types based on your needs for CPU, memory, storage, and networking. With Amazon RDS, Amazon takes care of tasks like provisioning, setup, patching, backup, recovery, and failure repair, saving your team from these time-consuming tasks.&lt;/p&gt;

&lt;p&gt;Amazon RDS automatically backs up your databases every 24 hours, ensuring that in the worst case, you can recover data for up to 24 hours. With a multi-region active-active strategy, you can achieve near-zero data loss and minimal recovery time. Routine patching is also automated with set maintenance windows for security. On top of this it also supports PITR recovery so you can get back your database to any particular timestamp in last 7 days. &lt;/p&gt;

&lt;p&gt;RDS allows you to have read replicas in zones closer to your users, which increases read capacity and reduces the load on production servers by routing read queries to the replicas. You can also send heavy queries to read replicas to lessen the burden on your main servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Amazon EC2?
&lt;/h2&gt;

&lt;p&gt;Amazon Elastic Compute Cloud (EC2) is a web service that gives you secure access to server instances when you need them. It's easy to get and set up capacity – just use the Amazon EC2 web service interface to add capacity as needed.&lt;/p&gt;

&lt;p&gt;You have full control over your computing resources and can scale up or down based on your needs. To provide database services for your application, you can set up EC2 instances and install the necessary database engines yourself.&lt;/p&gt;

&lt;p&gt;Next, let’s look at the pros and cons of choosing between Amazon RDS and EC2 for your database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Administration
&lt;/h2&gt;

&lt;p&gt;When it comes to administration, Amazon RDS is easy to set up because AWS automates the entire process of management, maintenance, and security, allowing you to focus on essential tasks instead of routine maintenance. You can access its capabilities through the AWS Management Console, AWS RDS command-line interface, or simple REST API calls. &lt;/p&gt;

&lt;p&gt;AWS EC2 gives you full control over the OS, database version, configuration, and other software components, but you are responsible for all routine maintenance activities, including patches, upgrades, backups, replication, and clustering.&lt;/p&gt;

&lt;h2&gt;
  
  
  High Availability
&lt;/h2&gt;

&lt;p&gt;Amazon RDS has built-in high availability. It automatically creates a primary database instance and replicates the data to a standby instance in a different Amazon Availability Zone. This ensures that if there is an outage in one zone, you can recover your database from the other zone.&lt;/p&gt;

&lt;p&gt;On the other hand, with AWS EC2, you are responsible for configuring the database server in a highly available cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backups
&lt;/h2&gt;

&lt;p&gt;With Amazon RDS, you can set up automated backups. AWS CloudWatch can notify you about backup failures, completions, and more. You can also get database snapshots on-demand and keep them as long as you need. &lt;/p&gt;

&lt;p&gt;With AWS EC2, you have to enable backups yourself and set up separate monitoring to ensure regular backups. You cannot use AWS CloudWatch for this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scalability
&lt;/h2&gt;

&lt;p&gt;Amazon RDS easily integrates with Amazon’s scaling tools for both vertical and horizontal scaling. You can scale up to a larger instance in a few clicks, and you can automate the creation of additional read replicas to handle increased read-only workloads. &lt;/p&gt;

&lt;p&gt;With AWS EC2, you have to set up a scalable architecture manually, which includes setting up multiple EC2 instances, load balancing, configuring Availability Groups, and Sharding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;With Amazon RDS, you can configure your instance with a specific number of provisioned IOPS for fast and consistent performance, though it can be expensive. RDS integrates with Amazon CloudWatch for monitoring database performance. &lt;/p&gt;

&lt;p&gt;With AWS EC2, you need to choose the right storage volume for the IOPS and latency you need. Since the database server is not AWS-managed, you cannot use AWS CloudWatch for performance monitoring and need to use third-party tools instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage
&lt;/h2&gt;

&lt;p&gt;With Amazon RDS, you have three storage options:&lt;/p&gt;

&lt;p&gt;General-purpose SSD: Cost-effective, delivers single-digit millisecond latencies, and handles up to 3,000 IOPS.&lt;br&gt;
Provisioned IOPS: Ideal for database-intensive workloads needing low latency and very high IOPS throughput.&lt;br&gt;
Magnetic: Supports magnetic storage for backward compatibility.&lt;br&gt;
With AWS EC2, the IOPS and latency depend on the instance type. You can get up to 16,000 IOPS and 2,000 Mbps with the right EBS-optimized instance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support and Control
&lt;/h2&gt;

&lt;p&gt;With Amazon RDS, you are limited to the database engines and versions supported by Amazon. Amazon manages upgrades and patches, so you don't handle the database server directly. You have access to database administration tools for necessary tasks.&lt;/p&gt;

&lt;p&gt;With AWS EC2, you can install any database engine and version you want, without being limited by AWS's RDS support. You have full control over the operating system and the database server. You can apply updates and patches, set maintenance windows, run multiple instances on the same EC2 instance, and control the ports used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;Amazon RDS offers encryption both at rest and in transit. This means the storage for database instances, read replicas, automated backups, and snapshots are all encrypted while stored. &lt;/p&gt;

&lt;p&gt;In AWS EC2, encryption is handled at the EBS volume level, and you can also configure encryption at the database level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licensing
&lt;/h2&gt;

&lt;p&gt;Amazon RDS offers both “License Included” and “Bring-Your-Own-License (BYOL)” models, depending on the database engine. &lt;/p&gt;

&lt;p&gt;For example, Oracle RDS allows you to bring your license, but Amazon RDS for SQL Server only supports the “License Included” model. You cannot bring your SQL licenses to RDS, as SQL Server is licensed through AWS.&lt;/p&gt;

&lt;p&gt;With AWS EC2, you can bring your database licenses regardless of the database engine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost
&lt;/h3&gt;

&lt;p&gt;Spending depends on the instance type, and you can use the AWS Cost Calculator to get detailed costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Amazon RDS:
&lt;/h3&gt;

&lt;p&gt;Usually more expensive because Amazon handles routine management tasks for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS EC2:
&lt;/h3&gt;

&lt;p&gt;Generally cheaper since you manage the database server yourself.&lt;br&gt;
You are responsible for tasks like backup, recovery, patching, and load management.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Choose Between AWS RDS and Amazon EC2
&lt;/h2&gt;

&lt;p&gt;Choosing between a database on an EC2 instance and RDS means deciding between managing everything yourself and using a managed service where AWS handles routine tasks. With RDS, a simple API call gives you control over deployment, backups, snapshots, restores, sizing, high availability, and replicas.&lt;/p&gt;

&lt;p&gt;In contrast, using EC2 means you need to manually set up, configure, manage, and tune components like EC2 instances, storage, scalability, networking, and security.&lt;/p&gt;

&lt;p&gt;Using RDS reduces management overhead and increases flexibility and automation. You can use automated CI/CD systems with AWS CLI, CDK, and CloudFormation to deploy the database with minimal manual work. Managed services let you control the infrastructure and design services that are easy to deploy, replicate, and have auto-healing features.&lt;/p&gt;

&lt;p&gt;However, cost is a key factor. Amazon RDS can be slightly more expensive than EC2 for the same configuration. If you have a tight budget or need a database engine or version not supported by RDS, you might have to use an EC2-hosted database.&lt;/p&gt;

&lt;p&gt;At KuebOps Consulting, we highly recommend using RDS instances over EC2 for database to our clients. The additional cost that you pay almost always saves a lot more money than what you would spend on managing and scaling the database yourself on an EC2 instance. &lt;/p&gt;

&lt;h2&gt;
  
  
  Read More
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.kubeblogs.com/route-53-dns-firewall-aws-egress-security/" rel="noopener noreferrer"&gt;Route 53 DNS Firewall: Block Malware Across Your VPC&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.kubeblogs.com/fixing-504-errors-in-gke-load-balancer-how-backendconfig-solved-our-30-second-timeout-problem/" rel="noopener noreferrer"&gt;Fix 504 Errors in GKE Load Balancer (BackendConfig Guide)&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.kubeblogs.com/how-we-use-airflow-to-optimize-our-devops-workflow/" rel="noopener noreferrer"&gt;How We Use Airflow to Optimize Our DevOps Workflow&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>database</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
