datadog
pythonobservabilitydatadogcoding-standardsperformance-optimization
Description
This rule outlines best practices for coding standards, observability, and effective use of the Datadog library in Python projects. It covers coding style, metric/tag naming, dashboard design, security, and performance optimization.
Globs
**/*.py
---
description: This rule outlines best practices for coding standards, observability, and effective use of the Datadog library in Python projects. It covers coding style, metric/tag naming, dashboard design, security, and performance optimization.
globs: **/*.py
---
- **Coding Standards**
- Use `black` for code formatting to ensure consistent style.
- Use `isort` to sort imports lexicographically.
- Employ `flake8` for style checks and to maintain code quality.
- Utilize `bugbear` plugin for `flake8` to identify potential bugs and design issues. Enable the following checks:
- `B001`: Avoid bare `except:` clauses; prefer `except Exception:`. Catches unexpected events.
- `B003`: Avoid direct assignment to `os.environ`. Use `os.environ.clear()` or `env=` argument to `Popen`.
- `B006`: Do not use mutable data structures for argument defaults.
- `B007`: Loop control variable should be used within the loop body.
- `B301`: Use Python 3 `.iter*` methods on dictionaries.
- `B305`: Use `next()` builtin instead of `.next()`.
- `B306`: Use `str(e)` or `e.args` to access exception messages.
- `B902`: Use `self` for instance methods, and `cls` for class methods.
- Enforce consistent logging format with `logging-format` `flake8` plugin. Enable the following checks:
- `G001`: Logging statements should not use `string.format()`.
- `G002`: Logging statements should not use `%` formatting.
- `G003`: Logging statements should not use `+` concatenation.
- `G004`: Logging statements should not use f-strings (Python 3.6+).
- `G010`: Logging statements should not use `warn`; use `warning` instead.
- `G100`: Logging statements should not use extra arguments unless whitelisted.
- `G201`: Logging statements should not use `error(..., exc_info=True)`; use `exception(...)` instead.
- `G202`: Logging statements should not use redundant `exc_info=True` in `exception`.
- Use type checking with `mypy` for improved code quality. Configure `mypy` in `hatch.toml`:
toml
[env.collectors.datadog-checks]
check-types: true
mypy-args = [
"--py2",
"--install-types",
"--non-interactive",
"datadog_checks/",
"tests/",
]
mypy-deps = [
"types-mock==0.1.5",
]
- Consider using flags like `--check-untyped-defs` and `--disallow-untyped-defs` for stricter type checking. Configure the files to be checked with mypy.ini file.
- **Metric and Tag Naming Conventions**
- Use descriptive and meaningful names for metrics and tags.
- Avoid abbreviations that might have multiple meanings.
- Maintain consistency in naming across all teams, apps, and services.
- Avoid reserved keywords.
- Prefix metrics with a namespace depicting the application or service generating the data (e.g., `http.nginx.response_time`).
- Metric names must start with a letter.
- Metric names can only contain ASCII alphanumerics, underscores, and periods. Other characters are converted to underscores.
- Metric names should not exceed 200 characters (preferably less than 100).
- Tag names must start with a letter.
- Tag names may contain alphanumerics, underscores, minuses, colons, periods, and slashes. Other characters are converted to underscores.
- Tags can be up to 200 characters long (including both key and value) and support Unicode, but are converted to lowercase.
- Use the `key:value` syntax for tags for optimal functionality. Commonly used metric tag keys are `instance`, `name`, and `role`.
- Implement unified service tagging using `env`, `service`, and `version` tags.
- **Effective Dashboard Design**
- Design dashboards carefully for effective visualization and correlation.
- Utilize out-of-the-box dashboards provided by Datadog.
- Contribute to community-curated dashboards to enhance visibility and correlation of observability data.
- Follow integration dashboard best practices when contributing.
- Consult the "Effective Dashboards" repository for dashboard design guidelines.
- **Code Organization and Structure**
- **Directory Structure:**
- Organize code into modules based on functionality (e.g., `metrics`, `logs`, `tracing`).
- Use a `common` directory for shared utilities and helper functions.
- **File Naming Conventions:**
- Use descriptive file names that reflect the module's purpose (e.g., `metrics_collector.py`, `log_processor.py`).
- **Module Organization:**
- Keep modules small and focused on a single responsibility.
- Use `__init__.py` files to define package structure and expose necessary functionality.
- **Component Architecture:**
- Design components with clear interfaces and separation of concerns.
- Use dependency injection to manage dependencies between components.
- **Code Splitting:**
- Consider splitting large modules into smaller files to improve maintainability.
- Use lazy loading for infrequently used modules.
- **Common Patterns and Anti-patterns**
- **Design Patterns:**
- Use the Observer pattern for subscribing to Datadog events.
- Implement the Decorator pattern for adding custom functionality to Datadog integrations.
- **Recommended Approaches:**
- Use Datadog's API client libraries for interacting with the Datadog API.
- Implement custom checks using Datadog's check framework.
- **Anti-patterns:**
- Avoid hardcoding API keys or other sensitive information in the code.
- Avoid excessive logging, which can impact performance.
- **State Management:**
- Use appropriate data structures for storing state (e.g., dictionaries, lists).
- Consider using a dedicated state management library for complex state management needs.
- **Error Handling:**
- Implement robust error handling to prevent application crashes.
- Use try-except blocks to catch and handle exceptions.
- Log errors to Datadog for monitoring and analysis.
- **Performance Considerations**
- **Optimization Techniques:**
- Use efficient data structures and algorithms.
- Minimize network requests to the Datadog API.
- Use caching to reduce database load.
- **Memory Management:**
- Avoid memory leaks by properly releasing resources.
- Use garbage collection to clean up unused objects.
- **Bundle Size Optimization:**
- Remove unused dependencies from the project.
- Use code minification to reduce bundle size.
- **Lazy Loading:**
- Load infrequently used modules or components on demand.
- **Security Best Practices**
- **Vulnerabilities:**
- Prevent injection attacks by validating user inputs.
- Protect against cross-site scripting (XSS) attacks by encoding outputs.
- **Input Validation:**
- Validate all user inputs to prevent malicious data from entering the system.
- Use regular expressions or other validation techniques to enforce input constraints.
- **Authentication and Authorization:**
- Use strong authentication mechanisms to verify user identities.
- Implement authorization policies to control access to resources.
- **Data Protection:**
- Encrypt sensitive data at rest and in transit.
- Use secure communication protocols (e.g., HTTPS) for API communication.
- **Secure API Communication:**
- Use TLS/SSL for secure communication with the Datadog API.
- Store API keys securely and do not expose them in the code.
- **Testing Approaches**
- **Unit Testing:**
- Write unit tests for individual components to verify their functionality.
- Use mocking to isolate components from external dependencies.
- **Integration Testing:**
- Write integration tests to verify interactions between components.
- Use a testing framework like pytest for writing and running tests.
- **End-to-end Testing:**
- Write end-to-end tests to verify the entire application workflow.
- Use a tool like Selenium or Cypress for automating browser tests.
- **Test Organization:**
- Organize tests into separate directories based on component or functionality.
- Use descriptive test names to clearly indicate the purpose of each test.
- **Mocking and Stubbing:**
- Use mocking to simulate external dependencies during testing.
- Use stubbing to replace complex components with simplified versions.
- **Common Pitfalls and Gotchas**
- **Frequent Mistakes:**
- Incorrectly configuring Datadog integrations.
- Not properly handling errors or exceptions.
- Overusing logging, which can impact performance.
- **Edge Cases:**
- Handling large volumes of data.
- Dealing with intermittent network connectivity issues.
- **Version-specific Issues:**
- Be aware of compatibility issues between different versions of Datadog and its dependencies.
- **Compatibility Concerns:**
- Ensure compatibility between Datadog and other technologies used in the project.
- **Debugging Strategies:**
- Use Datadog's monitoring tools to track down performance bottlenecks and errors.
- Use logging to trace the execution flow of the application.
- **Tooling and Environment**
- **Recommended Tools:**
- Use an IDE like VS Code or PyCharm for development.
- Use a version control system like Git for managing code.
- Use a build tool like Make or Poetry for building and deploying the application.
- **Build Configuration:**
- Use a build tool to automate the build process.
- Configure the build tool to generate optimized bundles.
- **Linting and Formatting:**
- Use a linter like Flake8 to enforce coding standards.
- Use a formatter like Black to automatically format code.
- **Deployment:**
- Use a deployment tool like Docker or Kubernetes for deploying the application.
- Use a CI/CD pipeline to automate the deployment process.
- **CI/CD Integration:**
- Integrate Datadog into the CI/CD pipeline to automatically monitor and analyze application performance.
- Use Datadog's API to create custom dashboards and alerts.