Metadata-Version: 2.4
Name: dt-async
Version: 1.0.13
Summary: Dynatrace async API Python client
License-File: LICENSE
Author: David Lopes
Author-email: davidribeirolopes@gmail.com
Maintainer: David Lopes
Maintainer-email: davidribeirolopes@gmail.com
Requires-Python: >=3.10
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: MacOS
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Topic :: Software Development
Requires-Dist: authlib (>=1.7.1)
Requires-Dist: httpx (>=0.28.1)
Project-URL: Documentation, https://github.com/pharbuz/api-client-python-async
Project-URL: Homepage, https://github.com/pharbuz/api-client-python-async
Project-URL: Repository, https://github.com/pharbuz/api-client-python-async
Description-Content-Type: text/markdown

# dt-async - Dynatrace Python API Client

**dt-async** is a Python client for the [Dynatrace Rest API].   
It focuses on ease of use and nice type hints, perfect to explore the API and create quick scripts

This project is a modified fork of the original library released by Dynatrace.

[Dynatrace Rest API]: https://www.dynatrace.com/support/help/dynatrace-api

## Install

```bash
$ pip install dt-async
```

## Authentication

This library supports two authentication methods:

### OAuth 2.0 (client credentials)

Use `DynatraceOAuthCredentials` for the OAuth 2.0 client credentials flow.

```python
from dynatrace import DynatraceAsync, DynatraceOAuthCredentials

dt = DynatraceAsync(
    base_url="environment_url",
    credentials=DynatraceOAuthCredentials(
        client_id="oauth_client_id",
        client_secret="oauth_client_secret",
        account_uuid="your-account-uuid",
        scope="environment-api:entities:read environment-api:metrics:read",
    ),
)
```

The `scope` value must include the permissions required by the APIs you want to call.

### API Token

Use `DynatraceAccessToken` for token-based authentication. The client will send an `Api-Token` header with every request.

```python
from dynatrace import DynatraceAsync, DynatraceAccessToken

dt = DynatraceAsync(
    base_url="environment_url",
    credentials=DynatraceAccessToken(token="dt0c01..."),
)
```

## Simple Demo

```python
import asyncio
from datetime import datetime, timedelta

from dynatrace import DynatraceAsync, DynatraceOAuthCredentials
from dynatrace import TOO_MANY_REQUESTS_WAIT
from dynatrace.environment_v2.credential_vault import PublicCertificateCredentials
from dynatrace.environment_v2.settings import SettingsObjectCreate
from dynatrace.environment_v2.tokens_api import (
    SCOPE_METRICS_INGEST,
    SCOPE_METRICS_READ,
)

async def main():
    # Create a Dynatrace client with OAuth credentials
    async with DynatraceAsync(
        base_url="environment_url",
        credentials=DynatraceOAuthCredentials(
            client_id="oauth_client_id",
            client_secret="oauth_client_secret",
            account_uuid="your-account-uuid",
        ),
    ) as dt:
        # Create a client that handles too many requests (429)
        # dt = DynatraceAsync(
        #     base_url="environment_url",
        #     credentials=DynatraceOAuthCredentials(
        #         client_id="oauth_client_id",
        #         client_secret="oauth_client_secret",
        #         account_uuid="your-account-uuid",
        #     ),
        #     too_many_requests_strategy=TOO_MANY_REQUESTS_WAIT,
        # )
        # Create a client that automatically retries on errors, up to 5 times, with a 1 second delay between retries
        # dt = DynatraceAsync(
        #     base_url="environment_url",
        #     credentials=DynatraceOAuthCredentials(
        #         client_id="oauth_client_id",
        #         client_secret="oauth_client_secret",
        #         account_uuid="your-account-uuid",
        #     ),
        #     retries=5,
        #     retry_delay_ms=1000,
        # )

        # Create a client with a custom HTTP timeout of 10 seconds
        # dt = DynatraceAsync(
        #     base_url="environment_url",
        #     credentials=DynatraceOAuthCredentials(
        #         client_id="oauth_client_id",
        #         client_secret="oauth_client_secret",
        #         account_uuid="your-account-uuid",
        #     ),
        #     timeout=10,
        # )

        # Create a client that automatically retries on errors, up to 5 times, with a 1 second delay between retries
        # dt = DynatraceAsync(
        #     client_id="oauth_client_id",
        #     client_secret="oauth_client_secret",
        #     account_uuid="your-account-uuid",
        #     base_url="environment_url",
        #     retries=5,
        #     retry_delay_ms=1000,
        # )

        # Create a client with a custom HTTP timeout of 10 seconds
        # dt = DynatraceAsync(
        #     client_id="oauth_client_id",
        #     client_secret="oauth_client_secret",
        #     account_uuid="your-account-uuid",
        #     base_url="environment_url",
        #     timeout=10,
        # )

        # Get all hosts and some properties
        async for entity in await dt.entities.list(
            'type("HOST")',
            fields="properties.memoryTotal,properties.monitoringMode",
        ):
            print(entity.entity_id, entity.display_name, entity.properties)

        # Get idle CPU for all hosts
        async for metric in await dt.metrics.query(
            "builtin:host.cpu.idle",
            resolution="Inf",
        ):
            print(metric)

        # Print dimensions, timestamp and values for the AWS Billing Metric
        async for metric in await dt.metrics.query(
            "ext:cloud.aws.billing.estimatedChargesByRegionCurrency"
        ):
            for data in metric.data:
                for timestamp, value in zip(data.timestamps, data.values):
                    print(data.dimensions, timestamp, value)

        # Get all ActiveGates
        async for ag in await dt.activegates.list():
            print(ag)

        # Get metric descriptions for all host metrics
        async for metric in await dt.metrics.list("builtin:host.*"):
            print(metric)

        # Delete endpoints that contain the word test
        async for plugin in await dt.plugins.list():
            # This could also be dt.get_endpoints(plugin.id)
            async for endpoint in plugin.endpoints:
                if "test" in endpoint.name:
                    await endpoint.delete(plugin.id)

        # Prints dashboard ID, owner and number of tiles
        async for dashboard in await dt.dashboards.list():
            full_dashboard = await dashboard.get_full_dashboard()
            print(full_dashboard.id, dashboard.owner, len(full_dashboard.tiles))

        # Delete API Tokens that haven't been used for more than 3 months
        async for token in await dt.tokens.list(fields="+lastUsedDate,+scopes"):
            if token.last_used_date and token.last_used_date < datetime.now() - timedelta(
                days=90
            ):
                print(
                    f"Deleting token! {token}, last used date: {token.last_used_date}"
                )

        # Create an API Token that can read and ingest metrics
        new_token = await dt.tokens.create(
            "metrics_token",
            scopes=[SCOPE_METRICS_READ, SCOPE_METRICS_INGEST],
        )
        print(new_token.token)

        # Upload a public PEM certificate to the Credential Vault
        with open("ca.pem", "r") as f:
            ca_cert = f.read()

        my_cred = PublicCertificateCredentials(
            name="my_cred",
            scopes=["EXTENSION"],
            description="my_cred description",
            owner_access_only=False,
            certificate=ca_cert,
            password="",
            certificate_format="PEM",
        )

        credential = await dt.credentials.post(my_cred)
        print(credential.id)

        # Create a new settings 2.0 object
        settings_value = {
            "enabled": True,
            "summary": "DT API TEST 1",
            "queryDefinition": {
                "type": "METRIC_KEY",
                "metricKey": "netapp.ontap.node.fru.state",
                "aggregation": "AVG",
                "entityFilter": {
                    "dimensionKey": "dt.entity.netapp_ontap:fru",
                    "conditions": [],
                },
                "dimensionFilter": [],
            },
            "modelProperties": {
                "type": "STATIC_THRESHOLD",
                "threshold": 100.0,
                "alertOnNoData": False,
                "alertCondition": "BELOW",
                "violatingSamples": 3,
                "samples": 5,
                "dealertingSamples": 5,
            },
            "eventTemplate": {
                "title": "OnTap {dims:type} {dims:fru_id} is in Error State",
                "description": "OnTap field replaceable unit (FRU) {dims:type} with id {dims:fru_id} on node {dims:node} in cluster {dims:cluster} is in an error state.\n",
                "eventType": "RESOURCE",
                "davisMerge": True,
                "metadata": [],
            },
            "eventEntityDimensionKey": "dt.entity.netapp_ontap:fru",
        }

        settings_object = SettingsObjectCreate(
            schema_id="builtin:anomaly-detection.metric-events",
            value=settings_value,
            scope="environment",
        )
        await dt.settings.create_object(validate_only=False, body=settings_object)


asyncio.run(main())
```

## Implementation Progress

### Environment API V2

 API                                     |       Level        | Access                                    |
:----------------------------------------|:------------------:|:------------------------------------------|
 Access Tokens - API tokens              | :heavy_check_mark: | `dt.tokens`                               |
 Access tokens - Tenant tokens           | :heavy_check_mark: | `dt.tenant_tokens`                        |
 ActiveGates                             | :heavy_check_mark: | `dt.activegates`                          |
 ActiveGates - Auto-update configuration | :heavy_check_mark: | `dt.activegates_autoupdate_configuration` |
 ActiveGates - Auto-update jobs          | :heavy_check_mark: | `dt.activegates_autoupdate_jobs`          |
 ActiveGates - Remote configuration      | :heavy_check_mark: | `dt.activegates_remote_configuration`     |
 Audit Logs                              | :heavy_check_mark: | `dt.audit_logs`                           |
 Events                                  | :heavy_check_mark: | `dt.events_v2`                            |
 Extensions 2.0                          | :heavy_check_mark: | `dt.extensions_v2`                        |
 Logs                                    | :heavy_check_mark: | `dt.logs`                                 |
 Metrics                                 | :heavy_check_mark: | `dt.metrics`                              |
 Monitored entities                      | :heavy_check_mark: | `dt.entities`                             |
 Monitored entities - Custom tags        | :heavy_check_mark: | `dt.custom_tags`                          |
 Network zones                           | :heavy_check_mark: | `dt.network_zones`                        |
 OneAgents - Remote configuration        | :heavy_check_mark: | `dt.oneagents_remote_configuration`       |
 Problems                                | :heavy_check_mark: | `dt.problems`                             |
 Security problems                       | :heavy_check_mark: | `dt.security_problems`                    |
 Service-level objectives                | :heavy_check_mark: | `dt.slos`                                 |
 Settings                                | :heavy_check_mark: | `dt.settings`                             |
 Settings - Management zones             | :heavy_check_mark: | `dt.management_zones_v2`                  |
 Synthetic - Monitors                    | :heavy_check_mark: | `dt.synthetic_monitors_v2`                |
 Credential vault                        | :heavy_check_mark: | `dt.credentials`                          |

### Environment API V1

 API                                   |       Level        | Access                          |
:--------------------------------------|:------------------:|:--------------------------------|
 Anonymization                         |        :x:         |                                 |
 Cluster time                          | :heavy_check_mark: | `dt.cluster_time`               |
 Cluster version                       |        :x:         |                                 |
 Custom devices                        | :heavy_check_mark: | `dt.custom_devices`             |
 Deployment                            | :heavy_check_mark: | `dt.deployment`                 |
 Events                                |     :warning:      | `dt.events`                     |
 JavaScript tag management             |        :x:         |                                 |
 Log monitoring - Custom devices       |        :x:         |                                 |
 Log monitoring - Hosts                |        :x:         |                                 |
 Log monitoring - Process groups       |        :x:         |                                 |
 Maintenance window                    |        :x:         |                                 |
 OneAgent on a host                    |     :warning:      | `dt.oneagents`                  |
 Problem                               |        :x:         |                                 |
 Synthetic - Locations and nodes       |        :x:         |                                 |
 Synthetic - Monitors                  |     :warning:      | `dt.synthetic_monitors`         |
 Synthetic - Third party               | :heavy_check_mark: | `dt.third_part_synthetic_tests` |
 Threshold                             |        :x:         |                                 |
 Timeseries                            |     :warning:      | `dt.timeseries`                 |
 Tokens                                |        :x:         |                                 |
 Topology & Smartscape - Application   |        :x:         |                                 |
 Topology & Smartscape - Custom device |     :warning:      | `dt.custom_devices`             |
 Topology & Smartscape - Host          |     :warning:      | `dt.smartscape_hosts`           |
 Topology & Smartscape - Process       |        :x:         |                                 |
 Topology & Smartscape - Process group |        :x:         |                                 |
 Topology & Smartscape - Service       |        :x:         |                                 |
 User sessions                         |        :x:         |                                 |

### Configuration API V1

 API                                                 |       Level        | Access                                |
:----------------------------------------------------|:------------------:|:--------------------------------------|
 Alerting Profiles                                   |     :warning:      | `dt.alerting_profiles`                |
 Anomaly detection - Applications                    |        :x:         |                                       |
 Anomaly detection - AWS                             |        :x:         |                                       |
 Anomaly detection - Database services               |        :x:         |                                       |
 Anomaly detection - Disk events                     |        :x:         |                                       |
 Anomaly detection - Hosts                           |        :x:         |                                       |
 Anomaly detection - Metric events                   |     :warning:      | `dt.anomaly_detection_metric_events`  |
 Anomaly detection - Process groups                  |     :warning:      | `dt.anomaly_detection_process_groups` |
 Anomaly detection - Services                        |        :x:         |                                       |
 Anomaly detection - VMware                          |        :x:         |                                       |
 Automatically applied tags                          |     :warning:      | `dt.auto_tags`                        |
 AWS credentials configuration                       |        :x:         |                                       |
 AWS PrivateLink                                     |        :x:         |                                       |
 Azure credentials configuration                     |        :x:         |                                       |
 Calculated metrics - Log monitoring                 |        :x:         |                                       |
 Calculated metrics - Mobile & custom applications   |        :x:         |                                       |
 Calculated metrics - Services                       |        :x:         |                                       |
 Calculated metrics - Synthetic                      |        :x:         |                                       |
 Calculated metrics - Web applications               |        :x:         |                                       |
 Cloud Foundry credentials configuration             |        :x:         |                                       |
 Conditional naming                                  |        :x:         |                                       |
 Custom tags                                         | :heavy_check_mark: | `dt.custom_tags`                      |
 Dashboards                                          |     :warning:      | `dt.dashboards`                       |
 Data privacy and security                           |        :x:         |                                       |
 Extensions                                          | :heavy_check_mark: | `dt.extensions`                       |
 Frequent issue detection                            |        :x:         |                                       |
 Kubernetes credentials configuration                |        :x:         |                                       |
 Maintenance windows                                 |     :warning:      | `dt.maintenance_windows`              |
 Management zones                                    |     :warning:      | `dt.management_zones`                 |
 Notifications                                       |     :warning:      | `dt.notifications`                    |
 OneAgent - Environment-wide configuration           | :heavy_check_mark: | `dt.oneagents_config_environment`     |
 OneAgent in a host group                            | :heavy_check_mark: | `dt.oneagents_config_hostgroup`       |
 OneAgent on a host                                  | :heavy_check_mark: | `dt.oneagents_config_host`            |
 Plugins                                             |     :warning:      | `dt.plugins`                          |
 Remote environments                                 |        :x:         |                                       |
 Reports                                             |        :x:         |                                       |
 RUM - Allowed beacon origins for CORS               |        :x:         |                                       |
 RUM - Application detection rules                   |        :x:         |                                       |
 RUM - Application detection rules - Host detection  |        :x:         |                                       |
 RUM - Content resources                             |        :x:         |                                       |
 RUM - Geographic regions - custom client IP headers |        :x:         |                                       |
 RUM - Geographic regions - IP address mapping       |        :x:         |                                       |
 RUM - Mobile and custom application configuration   |        :x:         |                                       |
 RUM - Web application configuration                 |        :x:         |                                       |
 Service - Custom services                           |        :x:         |                                       |
 Service - Detection full web request                |        :x:         |                                       |
 Service - Detection full web service                |        :x:         |                                       |
 Service - Detection opaque and external web request |        :x:         |                                       |
 Service - Detection opaque and external web service |        :x:         |                                       |
 Service - Failure detection parameter sets          |        :x:         |                                       |
 Service - Failure detection rules                   |        :x:         |                                       |
 Service - IBM MQ tracing                            |        :x:         |                                       |
 Service - Request attributes                        |        :x:         |                                       |
 Service - Request naming                            |        :x:         |                                       |

### Platform API

 API                                  |       Level        | Access                                                                    |
:-------------------------------------|:------------------:|:--------------------------------------------------------------------------|
 AppEngine - Registry - Apps          | :heavy_check_mark: | `dt.platform.appengine_registry`                                          |
 AppEngine - Registry - Schema Manifest | :heavy_check_mark: | `dt.platform.appengine_registry`                                        |
 Davis CoPilot API                    | :heavy_check_mark: | `dt.platform.davis_copilot`                                               |
 Davis AI - Predictive and Causal     |     :warning:      | `dt.platform.davis_analyzers`                                             |
 DQL Query                            | :heavy_check_mark: | `dt.platform.grail_query_execution`, `dt.platform.grail_query_assistance` |

### Account API

 API                                                        |       Level        | Access                               |
:-----------------------------------------------------------|:------------------:|:-------------------------------------|
 Account Management - Account limits                        |        :x:         |                                      |
 Account Management - User management                       | :heavy_check_mark: | `dt.account.iam_users`               |
 Account Management - Group management                      | :heavy_check_mark: | `dt.account.iam_groups`              |
 Account Management - Permission management                 | :heavy_check_mark: | `dt.account.iam_policies`            |
 Account Management - Policy management                     | :heavy_check_mark: | `dt.account.iam_policies`            |
 Account Management - Service user management               | :heavy_check_mark: | `dt.account.iam_service_users`       |
 Account Management - Platform tokens                       | :heavy_check_mark: | `dt.account.iam_platform_tokens`     |
 Environment management API v1                              | :heavy_check_mark: | `dt.account.env_v1`                  |
 Environment management API v2                              | :heavy_check_mark: | `dt.account.env_v2`                  |
 Dynatrace Platform Subscription - Subscription management  | :heavy_check_mark: | `dt.account.sub_v2`                  |
 Dynatrace Platform Subscription - Subscription environments v2 |        :x:         |                                      |
 Dynatrace Platform Subscription - Subscription environments v3 | :heavy_check_mark: | `dt.account.sub_v3`                  |
 Dynatrace Platform Subscription - Rate cards               | :heavy_check_mark: | `dt.account.sub_v1_rate_cards`       |
 Dynatrace Platform Subscription - Cost allocation          | :heavy_check_mark: | `dt.account.sub_v1_cost_allocation`  |
 Account Settings                                           |        :x:         |                                      |
 Account Audits                                             | :heavy_check_mark: | `dt.account.audits`                  |
 Reference data                                             |        :x:         |                                      |
 Notifications                                              | :heavy_check_mark: | `dt.account.notifications`           |

