<?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: Josman</title>
    <description>The latest articles on DEV Community by Josman (@josmanperez).</description>
    <link>https://dev.to/josmanperez</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2301580%2F57902eec-8140-4b8a-a93b-df2fd96a3956.jpg</url>
      <title>DEV Community: Josman</title>
      <link>https://dev.to/josmanperez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/josmanperez"/>
    <language>en</language>
    <item>
      <title>Automating MongoDB Atlas Trigger Log Downloads Beyond the GUI and CLI Limitations</title>
      <dc:creator>Josman</dc:creator>
      <pubDate>Tue, 29 Oct 2024 16:59:42 +0000</pubDate>
      <link>https://dev.to/josmanperez/automating-mongodb-atlas-trigger-log-downloads-beyond-the-gui-and-cli-limitations-2nel</link>
      <guid>https://dev.to/josmanperez/automating-mongodb-atlas-trigger-log-downloads-beyond-the-gui-and-cli-limitations-2nel</guid>
      <description>&lt;p&gt;I recently encountered a scenario where I needed to download extensive logs from MongoDB Atlas Triggers locally. Currently, there are three ways to download logs from Atlas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.mongodb.com/docs/atlas/atlas-ui/triggers/logs/" rel="noopener noreferrer"&gt;Using the GUI&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.mongodb.com/docs/atlas/app-services/cli/appservices-logs-list/" rel="noopener noreferrer"&gt;Using the CLI&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.mongodb.com/docs/atlas/app-services/admin/api/v3/#tag/logs/Pagination-with-the-Logging-API" rel="noopener noreferrer"&gt;Using the App Services Admin API&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, the GUI and CLI options have limitations regarding the volume of logs that can be downloaded, particularly a cap of 10,000 logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limitations of the GUI and CLI for Log Downloads
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Using the GUI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
With the GUI, users can filter logs by date, type, user ID, or request ID, but the limit is set to 10,000 logs when it comes to downloading. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using the CLI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
With the CLI, we can run a command like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;appservices logs list &lt;span class="nt"&gt;--project&lt;/span&gt; 5e208aa2d5ec1375ecd5&lt;span class="k"&gt;***&lt;/span&gt; &lt;span class="nt"&gt;--app&lt;/span&gt; triggers_realmapp-&lt;span class="k"&gt;****&lt;/span&gt; &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;trigger &lt;span class="nt"&gt;--start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"2024-10-15T00:00:00.000+0000"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; log.logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, this also has the same download limit of 10,000 logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Solution: App Services Admin API with Pagination
&lt;/h3&gt;

&lt;p&gt;To overcome these download limitations, the App Services Admin API provides a way to access logs with pagination. By implementing pagination, users can fetch logs beyond the default 10K limit. &lt;/p&gt;

&lt;p&gt;Detailed instructions on using pagination with the API can be found in MongoDB’s documentation: &lt;a href="https://www.mongodb.com/docs/atlas/app-services/activity/view-logs/#get-paginated-logs" rel="noopener noreferrer"&gt;Get Paginated Logs&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proposed Solution: An Automated Script for Large Log Downloads
&lt;/h3&gt;

&lt;p&gt;To streamline this, I developed a script that automatically fetches logs using pagination. This script is available in a public repository here: &lt;a href="https://github.com/josmanperez/atlas-app-logs-aggregator" rel="noopener noreferrer"&gt;Atlas App Logs Aggregator&lt;/a&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  Key Features of the Script
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automated Log Fetching&lt;/strong&gt;: Fetches logs from MongoDB Atlas App Services with support for large log sets through pagination.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Date Range Filtering&lt;/strong&gt;: Allows optional date filtering using &lt;code&gt;start_date&lt;/code&gt; and &lt;code&gt;end_date&lt;/code&gt; parameters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ISO 8601 Validation&lt;/strong&gt;: Validate dates to ensure they follow the ISO 8601 format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Authentication&lt;/strong&gt;: Supports authentication using MongoDB Atlas public and private API keys.&lt;/li&gt;
&lt;li&gt;Optional &lt;code&gt;user_id&lt;/code&gt; for user ID filtering logs.&lt;/li&gt;
&lt;li&gt;Optional &lt;code&gt;co_id&lt;/code&gt; for correlation ID filtering logs.&lt;/li&gt;
&lt;li&gt;Fetch only error logs using the &lt;code&gt;errors_only&lt;/code&gt; option.&lt;/li&gt;
&lt;li&gt;Filter logs by key-value pairs using the &lt;code&gt;--filter&lt;/code&gt; option.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The script only uses the GET endpoint and aggregates logs into a file without modifying any data.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to use it
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Requirements
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.6 or higher.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requirements.txt&lt;/code&gt; library dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Create a virtual environment
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate  &lt;span class="c"&gt;# On Windows use `venv\Scripts\activate`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Command-Line Arguments
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;project_id&lt;/code&gt; (&lt;strong&gt;required&lt;/strong&gt;): The Atlas Project ID (hexadecimal string).
app_id (&lt;strong&gt;required&lt;/strong&gt;): The App ID (string).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;public_api_key&lt;/code&gt; (&lt;strong&gt;required&lt;/strong&gt;): The Atlas Public API Key (string).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;private_api_key&lt;/code&gt; (&lt;strong&gt;required&lt;/strong&gt;): The Atlas Private API Key (string with hyphens).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--start_date&lt;/code&gt; (optional): Start Date in ISO 8601 format (YYYY-MM-DDTHH:MM:SS.MMMZ).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--end_date&lt;/code&gt; (optional): End Date in ISO 8601 format (YYYY-MM-DDTHH:MM:SS.MMMZ).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--type&lt;/code&gt; (optional): Comma-separated list of supported log types. Currently, the types available are: &lt;code&gt;TRIGGER_FAILURE, TRIGGER_ERROR_HANDLER, DB_TRIGGER, AUTH_TRIGGER, SCHEDULED_TRIGGER, FUNCTION, SERVICE_FUNCTION, STREAM_FUNCTION, SERVICE_STREAM_FUNCTION, AUTH, WEBHOOK, ENDPOINT, PUSH, API, API_KEY, GRAPHQL, SYNC_CONNECTION_START, SYNC_CONNECTION_END, SYNC_SESSION_START, SYNC_SESSION_END, SYNC_CLIENT_WRITE, SYNC_ERROR, SYNC_OTHER, SCHEMA_ADDITIVE_CHANGE, SCHEMA_GENERATION, SCHEMA_VALIDATION, LOG_FORWARDER&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--user_id&lt;/code&gt; (optional): Return only log messages associated with the given user_id.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--co_id&lt;/code&gt; (optional): Return only log messages associated with the given request Correlation ID.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--filter&lt;/code&gt; (optional): Filter logs by key-value pairs (e.g., &lt;code&gt;--filter event_subscription_name=&amp;lt;trigger_name&amp;gt;,function_name=&amp;lt;function_name&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--errors_only&lt;/code&gt; (optional): Return only error log messages.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--verbose&lt;/code&gt; (optional): Enable verbose logging information.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python main.py &amp;lt;project_id&amp;gt; &amp;lt;app_id&amp;gt; &amp;lt;public_api_key&amp;gt; &amp;lt;private_api_key&amp;gt; &lt;span class="nt"&gt;--start_date&lt;/span&gt; 2024-10-05T14:30:00.000Z &lt;span class="nt"&gt;--end_date&lt;/span&gt; 2024-10-06T14:30:00.000Z &lt;span class="nt"&gt;--type&lt;/span&gt; TRIGGER_FAILURE,SCHEMA_GENERATION
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With optional parameters&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python main.py &amp;lt;project_id&amp;gt; &amp;lt;app_id&amp;gt; &amp;lt;public_api_key&amp;gt; &amp;lt;private_api_key&amp;gt; &lt;span class="nt"&gt;--start_date&lt;/span&gt; 2024-10-05T14:30:00.000Z &lt;span class="nt"&gt;--type&lt;/span&gt; TRIGGER_FAILURE,SCHEMA_GENERATION &lt;span class="nt"&gt;--user_id&lt;/span&gt; 671d2e2010733ecbaa2bab8f &lt;span class="nt"&gt;--filter&lt;/span&gt; &lt;span class="nv"&gt;event_subscription_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;getUnpausedClustersMetrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;start_date&lt;/code&gt; and &lt;code&gt;end_date&lt;/code&gt; are not provided, the script will default &lt;code&gt;start_date&lt;/code&gt; to the last 24 hours from the current time.&lt;/p&gt;

&lt;h3&gt;
  
  
   Filtering Logs
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;--filter&lt;/code&gt; option allows you to filter logs by key-value pairs. This option accepts multiple key-value pairs separated by spaces. Each key-value pair should be in the format key=value.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;key-value&lt;/code&gt; pair must be the values returned by the endpoint. This way it will use them to filter and only keep those that match. For example, for a &lt;code&gt;"type": "SCHEDULED_TRIGGER"&lt;/code&gt;, the response key-values will be similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"671d2e2010733ecbaa2bab8f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"co_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"671d2e2010733ecbaa2bab8d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SCHEDULED_TRIGGER"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"domain_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"65b0fc719629ac8e4d8e8774"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"app_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"65b0fc719629ac8e4d8e8773"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"group_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"658d46ca7605526eb45222a4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"started"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-10-26T18:00:00.041Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-10-26T18:00:04.124Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"function_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"65f31f9f3bfc77348cb1e2e7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"function_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getOrgClustersProjects"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FunctionError: Cannot access member 'db' of undefined"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"event_subscription_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"65f335c53d26a2b1ba5d7ba2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"event_subscription_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getUnpausedClustersMetrics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"reading projects for page: 1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"hay m&lt;/span&gt;&lt;span class="se"&gt;\u&lt;/span&gt;&lt;span class="s2"&gt;00e1s p&lt;/span&gt;&lt;span class="se"&gt;\u&lt;/span&gt;&lt;span class="s2"&gt;00e1ginas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"reading projects for page: 2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"fin"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mem_time_usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4081000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use any of this in the &lt;code&gt;--filter&lt;/code&gt; option (e.g., &lt;code&gt;--filter event_subscription_name=getUnpausedClustersMetrics&lt;/code&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Logging
&lt;/h3&gt;

&lt;p&gt;The script supports logging to both the console and a log file. By default, log files are stored in the logs folder. The log file name includes a timestamp to ensure uniqueness for each run.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--verbose&lt;/code&gt;: When this flag is used, the log level is set to &lt;code&gt;DEBUG&lt;/code&gt;, providing detailed logging information. Without this flag, the log level is set to &lt;code&gt;INFO&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Log File Location
&lt;/h4&gt;

&lt;p&gt;Log files are stored in the logs folder. Each log file is named with a timestamp to ensure that logs from different runs do not overwrite each other.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example Log File Name
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;logs/app_20241005_143000.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automated Log Retrieval&lt;/strong&gt;: Easily fetch logs from MongoDB Atlas App Services without manual intervention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Date Range Filtering&lt;/strong&gt;: Filter logs by date range to focus on specific periods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pagination Support&lt;/strong&gt;: Handle large sets of logs efficiently using pagination.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation&lt;/strong&gt;: Ensure date inputs are in the correct format to avoid errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DISCLAIMER
&lt;/h3&gt;

&lt;p&gt;Please note: This repo is released for use "AS IS" without any warranties of any kind, including, but not limited to their installation, use, or performance. We disclaim any and all warranties, either express or implied, including but not limited to any warranty of noninfringement, merchantability, and/ or fitness for a particular purpose. We do not warrant that the technology will meet your requirements, that the operation thereof will be uninterrupted or error-free, or that any errors will be corrected.&lt;/p&gt;

&lt;p&gt;Any use of these scripts and tools is at your own risk. There is no guarantee that they have been through thorough testing in a comparable environment and we are not responsible for any damage or data loss incurred with their use.&lt;/p&gt;

&lt;p&gt;You are responsible for reviewing and testing any scripts you run thoroughly before use in any non-testing environment.&lt;/p&gt;

</description>
      <category>python</category>
      <category>mongodbatlas</category>
    </item>
  </channel>
</rss>
