Skip to content

Repository files navigation

datadog-sync-cli

Datadog cli tool to sync resources across organizations.

Table of Contents

Quick Start

See Installing section for guides on how to install and setup the tool.

Run the import command to read the specified resources from the source organization and store them locally into JSON files in the directory resources/source.

Then, you can run the sync command which will use the stored files from previous import command (unless --force-missing-dependencies flag is passed) to create/modify the resources on the destination organization. The pushed resources are saved in the directory resources/destination.

The migrate command will run an import followed immediately by a sync.

The reset command will delete resources at the destination; however, by default it backs up those resources first and fails if it cannot. You can (but probably shouldn't) skip the backup by using the --do-not-backup flag.

The prune command deletes per-resource state files (in resources/source/ and resources/destination/) for resources that are no longer present in the source organization. It is intended for use with --resource-per-file mode, where deleted upstream resources otherwise leave orphaned files on disk indefinitely. prune requires explicit --resources and refuses to run with --filters set. Supports --dry-run to preview deletions and --force to skip the interactive confirmation.

Note: The tool uses the resources directory as the source of truth for determining what resources need to be created and modified. Hence, this directory should not be removed or corrupted.

Example Usage

# Import resources from parent organization and store them locally
$ datadog-sync import \
--source-api-key="..." \
--source-app-key="..." \
--source-api-url="https://api.datadoghq.com"
> 2024-03-14 14:53:54,280 - INFO - Starting import...
> ...
> 2024-03-14 15:00:46,100 - INFO - Finished import
# Check diff output to see what resources will be created/modified
$ datadog-sync diffs \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 15:46:22,014 - INFO - Starting diffs...
> ...
> 2024-03-14 14:51:15,379 - INFO - Finished diffs
# Sync the resources to the child organization from locally stored files and save the output locally
$ datadog-sync sync \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 14:55:56,535 - INFO - Starting sync...
> ...
> 2024-03-14 14:56:00,797 - INFO - Finished sync: 1 successes, 0 errors

Purpose

The purpose of the datadog-sync-cli package is to provide an easy way to sync Datadog resources across Datadog organizations.

Note: this tool does not, nor is intended, for migrating intake data such as ingested logs, metrics, etc.

The source organization will not be modified, but the destination organization will have resources created and updated by the sync command.

Installing

Installing from source

Note:: Instlling from source requires Python >= v3.9

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Install datadog-sync-cli tool using pip pip install .
  3. Invoke the cli tool using datadog-sync <command> <options>

Installing from Releases

MacOS and Linux

  1. Download the executable from the Releases page
  2. Provide the executable with executable permission chmod +x datadog-sync-cli-{system-name}-{machine-type}
  3. Move the executable to your bin directory sudo mv datadog-sync-cli-{system-name}-{machine-type} /usr/local/bin/datadog-sync
  4. Invoke the CLI tool using datadog-sync <command> <options>

Windows

  1. Download the executable with extension .exe from the Releases page
  2. Add the directory containing the exe file to your path
  3. Invoke the CLI tool in cmd/powershell using the file name and omitting the extension: datadog-sync-cli-windows-amd64 <command> <options>

Using docker and building the image

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Build the provided Dockerfile docker build . -t datadog-sync
  3. Run the Docker image using entrypoint below:
docker run --rm -v <PATH_TO_WORKING_DIR>:/datadog-sync:rw \
-e DD_SOURCE_API_KEY=<DATADOG_API_KEY> \
-e DD_SOURCE_APP_KEY=<DATADOG_APP_KEY> \
-e DD_SOURCE_API_URL=<DATADOG_API_URL> \
-e DD_DESTINATION_API_KEY=<DATADOG_API_KEY> \
-e DD_DESTINATION_APP_KEY=<DATADOG_APP_KEY> \
-e DD_DESTINATION_API_URL=<DATADOG_API_URL> \
datadog-sync:latest <command> <options>

The docker run command mounts a specified <PATH_TO_WORKING_DIR> working directory to the container.

Usage

API URL

Available URL's for the source and destination API URLs are:

  • https://api.datadoghq.com
  • https://api.datadoghq.eu
  • https://api.us5.datadoghq.com
  • https://api.us3.datadoghq.com
  • https://api.ddog-gov.com
  • https://api.ap1.datadoghq.com

For all available regions, see Getting Started with Datadog Sites.

Filtering

Filtering is done on two levels, at top resources level and per individual resource level using --resources and --filter respectively.

Top resources level filtering

By default all resources are imported, synced, etc. If you would like to perform actions on a specific top level resource, or subset of resources, use --resources option. For example, the command datadog-sync import --resources="dashboard_lists,dashboards" will import ALL dashboards and dashboard lists in your Datadog organization.

Per resource level filtering

Individual resources can be further filtered using the --filter flag. For example, the following command datadog-sync import --resources="dashboards,dashboard_lists" --filter='Type=dashboard_lists;Name=name;Value=My custom list', will import ALL dashboards and ONLY dashboard lists with the name attribute equal to My custom list.

Filter option (--filter) accepts a string made up of key=value pairs separated by ;.

--filter 'Type=<resource>;Name=<attribute_name>;Value=<attribute_value>;Operator=<operator>'

Available keys:

  • Type: Resource such as Monitors, Dashboards, and more. [required]
  • Name: Attribute key to filter on. This can be any attribute represented in dot notation (such as attributes.user_count). [required]
  • Value: Regex to filter attribute value by. Note: special regex characters need to be escaped if filtering by raw string. [required]
  • Operator: Available operators are below. All invalid operator's default to ExactMatch.

By default, if multiple filters are passed for the same resource, OR logic is applied to the filters. This behavior can be adjusted using the --filter-operator option.

SubString and ExactMatch Deprecation

In future releases the SubString and ExactMatch Operator will be removed. This is because the Value key supports regex so both of these scenarios are covered by just writing the appropriate regex. Below is an example:

Let's take the scenario where you would like to filter for monitors that have the filter test in the name attribute:

OperatorCommand
SubString--filter 'Type=monitors;Name=name;Value=filter test;Operator=SubString'
Using Value--filter 'Type=monitors;Name=name;Value=.*filter test.*
ExactMatch--filter 'Type=monitors;Name=name;Value=filter test;Operator=ExactMatch'
Using Value--filter 'Type=monitors;Name=name;Value=^filter test$

Config file

A Custom config text file can be passed in place of options.

This is an example config file:

# config
destination_api_url="https://api.datadoghq.eu"
destination_api_key="<API_KEY>"
destination_app_key="<APP_KEY>"
source_api_key="<API_KEY>"
source_app_key="<APP_KEY>"
source_api_url="https://api.datadoghq.com"
filter=["Type=Dashboards;Name=title;Value=Test screenboard", "Type=Monitors;Name=tags;Value=sync:true"]

Then, run: datadog-sync import --config config

Cleanup flag

The tools sync command provides a cleanup flag (--cleanup). Passing the cleanup flag will delete resources from the destination organization which have been removed from the source organization. The resources to be deleted are determined based on the difference between the state files of source and destination organization.

For example, ResourceA and ResourceB are imported and synced, followed by deleting ResourceA from the source organization. Running the import command will update the source organizations state file to only include ResourceB. The following sync --cleanup=Force command will now delete ResourceA from the destination organization.

Verify DDR status flag

By default all commands check the Datadog Disaster Recovery (DDR) status of both the source and destination organizations before running. This behavior is controlled by the boolean flag --verify-ddr-status or the environment variable DD_VERIFY_DDR_STATUS.

Running behind an HTTP proxy

By default the tool's HTTP client ignores the environment and talks to Datadog directly. To run it behind a proxy, set --http-client-trust-env true (or the environment variable DD_HTTP_CLIENT_TRUST_ENV=true). When enabled, the underlying HTTP client honors the standard HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables, as well as credentials from .netrc. This option is off by default. Note that when enabled, the configured proxy can observe all Datadog API traffic — including the DD-API-KEY, DD-APPLICATION-KEY, or JWT headers if it terminates TLS — and .netrc credentials may be automatically attached for matching hosts, so only enable this for a proxy you trust.

State files

By default, a resources directory is generated in the current working directory of the user. This directory contains json mapping of resources between the source and destination organization. To avoid duplication and loss of mapping, this directory should be retained between tool usage. To override these directories use the --source-resources-path and --destination-resource-path.

When running againts multiple destination organizations, a seperate working directory should be used to ensure seperation of data.

Supported resources

ResourceDescription
authn_mappingsSync Datadog authn mappings.
dashboard_listsSync Datadog dashboard lists.
dashboardsSync Datadog dashboards.
downtime_schedulesSync Datadog downtimes.
downtimes (deprecated)Sync Datadog downtimes.
host_tagsSync Datadog host tags.
logs_archivesSync Datadog logs archives. Requires GCP, Azure, or AWS integration.
logs_archives_orderSync Datadog logs archives order.
logs_custom_pipelines (deprecated)Sync Datadog logs custom pipelines.
logs_indexesSync Datadog logs indexes.
logs_indexes_orderSync Datadog logs indexes order.
logs_metricsSync Datadog logs metrics.
logs_pipelinesSync Datadog logs OOTB integration and custom pipelines.
logs_pipelines_orderSync Datadog logs pipelines order.
logs_restriction_queriesSync Datadog logs restriction queries.
metric_percentilesSync Datadog metric percentiles.
metric_tag_configurationsSync Datadog metric tags configurations.
metrics_metadataSync Datadog metric metadata.
monitorsSync Datadog monitors.
notebooksSync Datadog notebooks.
powerpacksSync Datadog powerpacks.
restriction_policiesSync Datadog restriction policies.
rolesSync Datadog roles.
sensitive_data_scanner_groupsSync SDS groups
sensitive_data_scanner_groups_orderSync SDS groups order
sensitive_data_scanner_rulesSync SDS rules
service_level_objectivesSync Datadog SLOs.
slo_correctionsSync Datadog SLO corrections.
spans_metricsSync Datadog spans metrics.
synthetics_global_variablesSync Datadog synthetic global variables.
synthetics_private_locationsSync Datadog Synthetics Private Locations. See DDR guide.
synthetics_testsSync Datadog synthetic tests.
teamsSync Datadog teams (excluding permissions).
team_membershipsSync Datadog team memberships.
usersSync Datadog users.

Note:logs_custom_pipelines resource has been deprecated in favor of logs_pipelines resource which supports both logs OOTB integration and custom pipelines. To migrate to the new resource, rename the existing state files from logs_custom_pipelines.json to logs_pipelines.json for both source and destination files.

Best practices

Many Datadog resources are interdependent. For example, some Datadog resource can reference roles and dashboards, which includes widgets that may use Monitors or Synthetics data. The datadog-sync tool syncs these resources in order to ensure dependencies are not broken.

If importing/syncing subset of resources, users should ensure that dependent resources are imported and synced as well.

See Supported resources section below for potential resource dependencies.

ResourceDependencies
authn_mappingsroles, teams
dashboard_listsdashboards
dashboardsmonitors, roles, powerpacks, service_level_objectives
downtime_schedulesmonitors
downtimes (deprecated)monitors
host_tags-
logs_archives- (Requires manual setup of AWS, GCP or Azure integration)
logs_archives_orderlogs_archives
logs_custom_pipelines (deprecated)-
logs_indexes-
logs_indexes_orderlogs_indexes
logs_metrics-
logs_pipelines-
logs_pipelines_orderlogs_pipelines
logs_restriction_queriesroles
metric_percentiles-
metric_tag_configurations-
metrics_metadata-
monitorsroles, service_level_objectives
notebooks-
powerpacksmonitors, service_level_objectives
restriction_policiesdashboards, service_level_objectives, notebooks, users, roles
roles-
sensitive_data_scanner_groups-
sensitive_data_scanner_groups_ordersensitive_data_scanner_groups
sensitive_data_scanner_rulessensitive_data_scanner_groups
service_level_objectivesmonitors, synthetics_tests
slo_correctionsservice_level_objectives
spans_metrics-
synthetics_global_variablessynthetics_tests
synthetics_private_locations-
synthetics_testssynthetics_global_variables, roles
teams-
team_membershipsteams, users
usersroles

About

Datadog cli tool to sync resources across organizations.

Resources

Contributing

Stars

80 stars

Watchers

340 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - DataDog/datadog-sync-cli: Datadog cli tool to sync resources across organizations. · GitHub
Skip to content

Repository files navigation

datadog-sync-cli

Datadog cli tool to sync resources across organizations.

Table of Contents

Quick Start

See Installing section for guides on how to install and setup the tool.

Run the import command to read the specified resources from the source organization and store them locally into JSON files in the directory resources/source.

Then, you can run the sync command which will use the stored files from previous import command (unless --force-missing-dependencies flag is passed) to create/modify the resources on the destination organization. The pushed resources are saved in the directory resources/destination.

The migrate command will run an import followed immediately by a sync.

The reset command will delete resources at the destination; however, by default it backs up those resources first and fails if it cannot. You can (but probably shouldn't) skip the backup by using the --do-not-backup flag.

The prune command deletes per-resource state files (in resources/source/ and resources/destination/) for resources that are no longer present in the source organization. It is intended for use with --resource-per-file mode, where deleted upstream resources otherwise leave orphaned files on disk indefinitely. prune requires explicit --resources and refuses to run with --filters set. Supports --dry-run to preview deletions and --force to skip the interactive confirmation.

Note: The tool uses the resources directory as the source of truth for determining what resources need to be created and modified. Hence, this directory should not be removed or corrupted.

Example Usage

# Import resources from parent organization and store them locally
$ datadog-sync import \
--source-api-key="..." \
--source-app-key="..." \
--source-api-url="https://api.datadoghq.com"
> 2024-03-14 14:53:54,280 - INFO - Starting import...
> ...
> 2024-03-14 15:00:46,100 - INFO - Finished import
# Check diff output to see what resources will be created/modified
$ datadog-sync diffs \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 15:46:22,014 - INFO - Starting diffs...
> ...
> 2024-03-14 14:51:15,379 - INFO - Finished diffs
# Sync the resources to the child organization from locally stored files and save the output locally
$ datadog-sync sync \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 14:55:56,535 - INFO - Starting sync...
> ...
> 2024-03-14 14:56:00,797 - INFO - Finished sync: 1 successes, 0 errors

Purpose

The purpose of the datadog-sync-cli package is to provide an easy way to sync Datadog resources across Datadog organizations.

Note: this tool does not, nor is intended, for migrating intake data such as ingested logs, metrics, etc.

The source organization will not be modified, but the destination organization will have resources created and updated by the sync command.

Installing

Installing from source

Note:: Instlling from source requires Python >= v3.9

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Install datadog-sync-cli tool using pip pip install .
  3. Invoke the cli tool using datadog-sync <command> <options>

Installing from Releases

MacOS and Linux

  1. Download the executable from the Releases page
  2. Provide the executable with executable permission chmod +x datadog-sync-cli-{system-name}-{machine-type}
  3. Move the executable to your bin directory sudo mv datadog-sync-cli-{system-name}-{machine-type} /usr/local/bin/datadog-sync
  4. Invoke the CLI tool using datadog-sync <command> <options>

Windows

  1. Download the executable with extension .exe from the Releases page
  2. Add the directory containing the exe file to your path
  3. Invoke the CLI tool in cmd/powershell using the file name and omitting the extension: datadog-sync-cli-windows-amd64 <command> <options>

Using docker and building the image

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Build the provided Dockerfile docker build . -t datadog-sync
  3. Run the Docker image using entrypoint below:
docker run --rm -v <PATH_TO_WORKING_DIR>:/datadog-sync:rw \
-e DD_SOURCE_API_KEY=<DATADOG_API_KEY> \
-e DD_SOURCE_APP_KEY=<DATADOG_APP_KEY> \
-e DD_SOURCE_API_URL=<DATADOG_API_URL> \
-e DD_DESTINATION_API_KEY=<DATADOG_API_KEY> \
-e DD_DESTINATION_APP_KEY=<DATADOG_APP_KEY> \
-e DD_DESTINATION_API_URL=<DATADOG_API_URL> \
datadog-sync:latest <command> <options>

The docker run command mounts a specified <PATH_TO_WORKING_DIR> working directory to the container.

Usage

API URL

Available URL's for the source and destination API URLs are:

  • https://api.datadoghq.com
  • https://api.datadoghq.eu
  • https://api.us5.datadoghq.com
  • https://api.us3.datadoghq.com
  • https://api.ddog-gov.com
  • https://api.ap1.datadoghq.com

For all available regions, see Getting Started with Datadog Sites.

Filtering

Filtering is done on two levels, at top resources level and per individual resource level using --resources and --filter respectively.

Top resources level filtering

By default all resources are imported, synced, etc. If you would like to perform actions on a specific top level resource, or subset of resources, use --resources option. For example, the command datadog-sync import --resources="dashboard_lists,dashboards" will import ALL dashboards and dashboard lists in your Datadog organization.

Per resource level filtering

Individual resources can be further filtered using the --filter flag. For example, the following command datadog-sync import --resources="dashboards,dashboard_lists" --filter='Type=dashboard_lists;Name=name;Value=My custom list', will import ALL dashboards and ONLY dashboard lists with the name attribute equal to My custom list.

Filter option (--filter) accepts a string made up of key=value pairs separated by ;.

--filter 'Type=<resource>;Name=<attribute_name>;Value=<attribute_value>;Operator=<operator>'

Available keys:

  • Type: Resource such as Monitors, Dashboards, and more. [required]
  • Name: Attribute key to filter on. This can be any attribute represented in dot notation (such as attributes.user_count). [required]
  • Value: Regex to filter attribute value by. Note: special regex characters need to be escaped if filtering by raw string. [required]
  • Operator: Available operators are below. All invalid operator's default to ExactMatch.

By default, if multiple filters are passed for the same resource, OR logic is applied to the filters. This behavior can be adjusted using the --filter-operator option.

SubString and ExactMatch Deprecation

In future releases the SubString and ExactMatch Operator will be removed. This is because the Value key supports regex so both of these scenarios are covered by just writing the appropriate regex. Below is an example:

Let's take the scenario where you would like to filter for monitors that have the filter test in the name attribute:

OperatorCommand
SubString--filter 'Type=monitors;Name=name;Value=filter test;Operator=SubString'
Using Value--filter 'Type=monitors;Name=name;Value=.*filter test.*
ExactMatch--filter 'Type=monitors;Name=name;Value=filter test;Operator=ExactMatch'
Using Value--filter 'Type=monitors;Name=name;Value=^filter test$

Config file

A Custom config text file can be passed in place of options.

This is an example config file:

# config
destination_api_url="https://api.datadoghq.eu"
destination_api_key="<API_KEY>"
destination_app_key="<APP_KEY>"
source_api_key="<API_KEY>"
source_app_key="<APP_KEY>"
source_api_url="https://api.datadoghq.com"
filter=["Type=Dashboards;Name=title;Value=Test screenboard", "Type=Monitors;Name=tags;Value=sync:true"]

Then, run: datadog-sync import --config config

Cleanup flag

The tools sync command provides a cleanup flag (--cleanup). Passing the cleanup flag will delete resources from the destination organization which have been removed from the source organization. The resources to be deleted are determined based on the difference between the state files of source and destination organization.

For example, ResourceA and ResourceB are imported and synced, followed by deleting ResourceA from the source organization. Running the import command will update the source organizations state file to only include ResourceB. The following sync --cleanup=Force command will now delete ResourceA from the destination organization.

Verify DDR status flag

By default all commands check the Datadog Disaster Recovery (DDR) status of both the source and destination organizations before running. This behavior is controlled by the boolean flag --verify-ddr-status or the environment variable DD_VERIFY_DDR_STATUS.

Running behind an HTTP proxy

By default the tool's HTTP client ignores the environment and talks to Datadog directly. To run it behind a proxy, set --http-client-trust-env true (or the environment variable DD_HTTP_CLIENT_TRUST_ENV=true). When enabled, the underlying HTTP client honors the standard HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables, as well as credentials from .netrc. This option is off by default. Note that when enabled, the configured proxy can observe all Datadog API traffic — including the DD-API-KEY, DD-APPLICATION-KEY, or JWT headers if it terminates TLS — and .netrc credentials may be automatically attached for matching hosts, so only enable this for a proxy you trust.

State files

By default, a resources directory is generated in the current working directory of the user. This directory contains json mapping of resources between the source and destination organization. To avoid duplication and loss of mapping, this directory should be retained between tool usage. To override these directories use the --source-resources-path and --destination-resource-path.

When running againts multiple destination organizations, a seperate working directory should be used to ensure seperation of data.

Supported resources

ResourceDescription
authn_mappingsSync Datadog authn mappings.
dashboard_listsSync Datadog dashboard lists.
dashboardsSync Datadog dashboards.
downtime_schedulesSync Datadog downtimes.
downtimes (deprecated)Sync Datadog downtimes.
host_tagsSync Datadog host tags.
logs_archivesSync Datadog logs archives. Requires GCP, Azure, or AWS integration.
logs_archives_orderSync Datadog logs archives order.
logs_custom_pipelines (deprecated)Sync Datadog logs custom pipelines.
logs_indexesSync Datadog logs indexes.
logs_indexes_orderSync Datadog logs indexes order.
logs_metricsSync Datadog logs metrics.
logs_pipelinesSync Datadog logs OOTB integration and custom pipelines.
logs_pipelines_orderSync Datadog logs pipelines order.
logs_restriction_queriesSync Datadog logs restriction queries.
metric_percentilesSync Datadog metric percentiles.
metric_tag_configurationsSync Datadog metric tags configurations.
metrics_metadataSync Datadog metric metadata.
monitorsSync Datadog monitors.
notebooksSync Datadog notebooks.
powerpacksSync Datadog powerpacks.
restriction_policiesSync Datadog restriction policies.
rolesSync Datadog roles.
sensitive_data_scanner_groupsSync SDS groups
sensitive_data_scanner_groups_orderSync SDS groups order
sensitive_data_scanner_rulesSync SDS rules
service_level_objectivesSync Datadog SLOs.
slo_correctionsSync Datadog SLO corrections.
spans_metricsSync Datadog spans metrics.
synthetics_global_variablesSync Datadog synthetic global variables.
synthetics_private_locationsSync Datadog Synthetics Private Locations. See DDR guide.
synthetics_testsSync Datadog synthetic tests.
teamsSync Datadog teams (excluding permissions).
team_membershipsSync Datadog team memberships.
usersSync Datadog users.

Note:logs_custom_pipelines resource has been deprecated in favor of logs_pipelines resource which supports both logs OOTB integration and custom pipelines. To migrate to the new resource, rename the existing state files from logs_custom_pipelines.json to logs_pipelines.json for both source and destination files.

Best practices

Many Datadog resources are interdependent. For example, some Datadog resource can reference roles and dashboards, which includes widgets that may use Monitors or Synthetics data. The datadog-sync tool syncs these resources in order to ensure dependencies are not broken.

If importing/syncing subset of resources, users should ensure that dependent resources are imported and synced as well.

See Supported resources section below for potential resource dependencies.

ResourceDependencies
authn_mappingsroles, teams
dashboard_listsdashboards
dashboardsmonitors, roles, powerpacks, service_level_objectives
downtime_schedulesmonitors
downtimes (deprecated)monitors
host_tags-
logs_archives- (Requires manual setup of AWS, GCP or Azure integration)
logs_archives_orderlogs_archives
logs_custom_pipelines (deprecated)-
logs_indexes-
logs_indexes_orderlogs_indexes
logs_metrics-
logs_pipelines-
logs_pipelines_orderlogs_pipelines
logs_restriction_queriesroles
metric_percentiles-
metric_tag_configurations-
metrics_metadata-
monitorsroles, service_level_objectives
notebooks-
powerpacksmonitors, service_level_objectives
restriction_policiesdashboards, service_level_objectives, notebooks, users, roles
roles-
sensitive_data_scanner_groups-
sensitive_data_scanner_groups_ordersensitive_data_scanner_groups
sensitive_data_scanner_rulessensitive_data_scanner_groups
service_level_objectivesmonitors, synthetics_tests
slo_correctionsservice_level_objectives
spans_metrics-
synthetics_global_variablessynthetics_tests
synthetics_private_locations-
synthetics_testssynthetics_global_variables, roles
teams-
team_membershipsteams, users
usersroles

About

Datadog cli tool to sync resources across organizations.

Resources

Contributing

Stars

80 stars

Watchers

340 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - DataDog/datadog-sync-cli: Datadog cli tool to sync resources across organizations. · GitHub
Skip to content

Repository files navigation

datadog-sync-cli

Datadog cli tool to sync resources across organizations.

Table of Contents

Quick Start

See Installing section for guides on how to install and setup the tool.

Run the import command to read the specified resources from the source organization and store them locally into JSON files in the directory resources/source.

Then, you can run the sync command which will use the stored files from previous import command (unless --force-missing-dependencies flag is passed) to create/modify the resources on the destination organization. The pushed resources are saved in the directory resources/destination.

The migrate command will run an import followed immediately by a sync.

The reset command will delete resources at the destination; however, by default it backs up those resources first and fails if it cannot. You can (but probably shouldn't) skip the backup by using the --do-not-backup flag.

The prune command deletes per-resource state files (in resources/source/ and resources/destination/) for resources that are no longer present in the source organization. It is intended for use with --resource-per-file mode, where deleted upstream resources otherwise leave orphaned files on disk indefinitely. prune requires explicit --resources and refuses to run with --filters set. Supports --dry-run to preview deletions and --force to skip the interactive confirmation.

Note: The tool uses the resources directory as the source of truth for determining what resources need to be created and modified. Hence, this directory should not be removed or corrupted.

Example Usage

# Import resources from parent organization and store them locally
$ datadog-sync import \
--source-api-key="..." \
--source-app-key="..." \
--source-api-url="https://api.datadoghq.com"
> 2024-03-14 14:53:54,280 - INFO - Starting import...
> ...
> 2024-03-14 15:00:46,100 - INFO - Finished import
# Check diff output to see what resources will be created/modified
$ datadog-sync diffs \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 15:46:22,014 - INFO - Starting diffs...
> ...
> 2024-03-14 14:51:15,379 - INFO - Finished diffs
# Sync the resources to the child organization from locally stored files and save the output locally
$ datadog-sync sync \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 14:55:56,535 - INFO - Starting sync...
> ...
> 2024-03-14 14:56:00,797 - INFO - Finished sync: 1 successes, 0 errors

Purpose

The purpose of the datadog-sync-cli package is to provide an easy way to sync Datadog resources across Datadog organizations.

Note: this tool does not, nor is intended, for migrating intake data such as ingested logs, metrics, etc.

The source organization will not be modified, but the destination organization will have resources created and updated by the sync command.

Installing

Installing from source

Note:: Instlling from source requires Python >= v3.9

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Install datadog-sync-cli tool using pip pip install .
  3. Invoke the cli tool using datadog-sync <command> <options>

Installing from Releases

MacOS and Linux

  1. Download the executable from the Releases page
  2. Provide the executable with executable permission chmod +x datadog-sync-cli-{system-name}-{machine-type}
  3. Move the executable to your bin directory sudo mv datadog-sync-cli-{system-name}-{machine-type} /usr/local/bin/datadog-sync
  4. Invoke the CLI tool using datadog-sync <command> <options>

Windows

  1. Download the executable with extension .exe from the Releases page
  2. Add the directory containing the exe file to your path
  3. Invoke the CLI tool in cmd/powershell using the file name and omitting the extension: datadog-sync-cli-windows-amd64 <command> <options>

Using docker and building the image

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Build the provided Dockerfile docker build . -t datadog-sync
  3. Run the Docker image using entrypoint below:
docker run --rm -v <PATH_TO_WORKING_DIR>:/datadog-sync:rw \
-e DD_SOURCE_API_KEY=<DATADOG_API_KEY> \
-e DD_SOURCE_APP_KEY=<DATADOG_APP_KEY> \
-e DD_SOURCE_API_URL=<DATADOG_API_URL> \
-e DD_DESTINATION_API_KEY=<DATADOG_API_KEY> \
-e DD_DESTINATION_APP_KEY=<DATADOG_APP_KEY> \
-e DD_DESTINATION_API_URL=<DATADOG_API_URL> \
datadog-sync:latest <command> <options>

The docker run command mounts a specified <PATH_TO_WORKING_DIR> working directory to the container.

Usage

API URL

Available URL's for the source and destination API URLs are:

  • https://api.datadoghq.com
  • https://api.datadoghq.eu
  • https://api.us5.datadoghq.com
  • https://api.us3.datadoghq.com
  • https://api.ddog-gov.com
  • https://api.ap1.datadoghq.com

For all available regions, see Getting Started with Datadog Sites.

Filtering

Filtering is done on two levels, at top resources level and per individual resource level using --resources and --filter respectively.

Top resources level filtering

By default all resources are imported, synced, etc. If you would like to perform actions on a specific top level resource, or subset of resources, use --resources option. For example, the command datadog-sync import --resources="dashboard_lists,dashboards" will import ALL dashboards and dashboard lists in your Datadog organization.

Per resource level filtering

Individual resources can be further filtered using the --filter flag. For example, the following command datadog-sync import --resources="dashboards,dashboard_lists" --filter='Type=dashboard_lists;Name=name;Value=My custom list', will import ALL dashboards and ONLY dashboard lists with the name attribute equal to My custom list.

Filter option (--filter) accepts a string made up of key=value pairs separated by ;.

--filter 'Type=<resource>;Name=<attribute_name>;Value=<attribute_value>;Operator=<operator>'

Available keys:

  • Type: Resource such as Monitors, Dashboards, and more. [required]
  • Name: Attribute key to filter on. This can be any attribute represented in dot notation (such as attributes.user_count). [required]
  • Value: Regex to filter attribute value by. Note: special regex characters need to be escaped if filtering by raw string. [required]
  • Operator: Available operators are below. All invalid operator's default to ExactMatch.

By default, if multiple filters are passed for the same resource, OR logic is applied to the filters. This behavior can be adjusted using the --filter-operator option.

SubString and ExactMatch Deprecation

In future releases the SubString and ExactMatch Operator will be removed. This is because the Value key supports regex so both of these scenarios are covered by just writing the appropriate regex. Below is an example:

Let's take the scenario where you would like to filter for monitors that have the filter test in the name attribute:

OperatorCommand
SubString--filter 'Type=monitors;Name=name;Value=filter test;Operator=SubString'
Using Value--filter 'Type=monitors;Name=name;Value=.*filter test.*
ExactMatch--filter 'Type=monitors;Name=name;Value=filter test;Operator=ExactMatch'
Using Value--filter 'Type=monitors;Name=name;Value=^filter test$

Config file

A Custom config text file can be passed in place of options.

This is an example config file:

# config
destination_api_url="https://api.datadoghq.eu"
destination_api_key="<API_KEY>"
destination_app_key="<APP_KEY>"
source_api_key="<API_KEY>"
source_app_key="<APP_KEY>"
source_api_url="https://api.datadoghq.com"
filter=["Type=Dashboards;Name=title;Value=Test screenboard", "Type=Monitors;Name=tags;Value=sync:true"]

Then, run: datadog-sync import --config config

Cleanup flag

The tools sync command provides a cleanup flag (--cleanup). Passing the cleanup flag will delete resources from the destination organization which have been removed from the source organization. The resources to be deleted are determined based on the difference between the state files of source and destination organization.

For example, ResourceA and ResourceB are imported and synced, followed by deleting ResourceA from the source organization. Running the import command will update the source organizations state file to only include ResourceB. The following sync --cleanup=Force command will now delete ResourceA from the destination organization.

Verify DDR status flag

By default all commands check the Datadog Disaster Recovery (DDR) status of both the source and destination organizations before running. This behavior is controlled by the boolean flag --verify-ddr-status or the environment variable DD_VERIFY_DDR_STATUS.

Running behind an HTTP proxy

By default the tool's HTTP client ignores the environment and talks to Datadog directly. To run it behind a proxy, set --http-client-trust-env true (or the environment variable DD_HTTP_CLIENT_TRUST_ENV=true). When enabled, the underlying HTTP client honors the standard HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables, as well as credentials from .netrc. This option is off by default. Note that when enabled, the configured proxy can observe all Datadog API traffic — including the DD-API-KEY, DD-APPLICATION-KEY, or JWT headers if it terminates TLS — and .netrc credentials may be automatically attached for matching hosts, so only enable this for a proxy you trust.

State files

By default, a resources directory is generated in the current working directory of the user. This directory contains json mapping of resources between the source and destination organization. To avoid duplication and loss of mapping, this directory should be retained between tool usage. To override these directories use the --source-resources-path and --destination-resource-path.

When running againts multiple destination organizations, a seperate working directory should be used to ensure seperation of data.

Supported resources

ResourceDescription
authn_mappingsSync Datadog authn mappings.
dashboard_listsSync Datadog dashboard lists.
dashboardsSync Datadog dashboards.
downtime_schedulesSync Datadog downtimes.
downtimes (deprecated)Sync Datadog downtimes.
host_tagsSync Datadog host tags.
logs_archivesSync Datadog logs archives. Requires GCP, Azure, or AWS integration.
logs_archives_orderSync Datadog logs archives order.
logs_custom_pipelines (deprecated)Sync Datadog logs custom pipelines.
logs_indexesSync Datadog logs indexes.
logs_indexes_orderSync Datadog logs indexes order.
logs_metricsSync Datadog logs metrics.
logs_pipelinesSync Datadog logs OOTB integration and custom pipelines.
logs_pipelines_orderSync Datadog logs pipelines order.
logs_restriction_queriesSync Datadog logs restriction queries.
metric_percentilesSync Datadog metric percentiles.
metric_tag_configurationsSync Datadog metric tags configurations.
metrics_metadataSync Datadog metric metadata.
monitorsSync Datadog monitors.
notebooksSync Datadog notebooks.
powerpacksSync Datadog powerpacks.
restriction_policiesSync Datadog restriction policies.
rolesSync Datadog roles.
sensitive_data_scanner_groupsSync SDS groups
sensitive_data_scanner_groups_orderSync SDS groups order
sensitive_data_scanner_rulesSync SDS rules
service_level_objectivesSync Datadog SLOs.
slo_correctionsSync Datadog SLO corrections.
spans_metricsSync Datadog spans metrics.
synthetics_global_variablesSync Datadog synthetic global variables.
synthetics_private_locationsSync Datadog Synthetics Private Locations. See DDR guide.
synthetics_testsSync Datadog synthetic tests.
teamsSync Datadog teams (excluding permissions).
team_membershipsSync Datadog team memberships.
usersSync Datadog users.

Note:logs_custom_pipelines resource has been deprecated in favor of logs_pipelines resource which supports both logs OOTB integration and custom pipelines. To migrate to the new resource, rename the existing state files from logs_custom_pipelines.json to logs_pipelines.json for both source and destination files.

Best practices

Many Datadog resources are interdependent. For example, some Datadog resource can reference roles and dashboards, which includes widgets that may use Monitors or Synthetics data. The datadog-sync tool syncs these resources in order to ensure dependencies are not broken.

If importing/syncing subset of resources, users should ensure that dependent resources are imported and synced as well.

See Supported resources section below for potential resource dependencies.

ResourceDependencies
authn_mappingsroles, teams
dashboard_listsdashboards
dashboardsmonitors, roles, powerpacks, service_level_objectives
downtime_schedulesmonitors
downtimes (deprecated)monitors
host_tags-
logs_archives- (Requires manual setup of AWS, GCP or Azure integration)
logs_archives_orderlogs_archives
logs_custom_pipelines (deprecated)-
logs_indexes-
logs_indexes_orderlogs_indexes
logs_metrics-
logs_pipelines-
logs_pipelines_orderlogs_pipelines
logs_restriction_queriesroles
metric_percentiles-
metric_tag_configurations-
metrics_metadata-
monitorsroles, service_level_objectives
notebooks-
powerpacksmonitors, service_level_objectives
restriction_policiesdashboards, service_level_objectives, notebooks, users, roles
roles-
sensitive_data_scanner_groups-
sensitive_data_scanner_groups_ordersensitive_data_scanner_groups
sensitive_data_scanner_rulessensitive_data_scanner_groups
service_level_objectivesmonitors, synthetics_tests
slo_correctionsservice_level_objectives
spans_metrics-
synthetics_global_variablessynthetics_tests
synthetics_private_locations-
synthetics_testssynthetics_global_variables, roles
teams-
team_membershipsteams, users
usersroles

About

Datadog cli tool to sync resources across organizations.

Resources

Contributing

Stars

80 stars

Watchers

340 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - DataDog/datadog-sync-cli: Datadog cli tool to sync resources across organizations. · GitHub
Skip to content

Repository files navigation

datadog-sync-cli

Datadog cli tool to sync resources across organizations.

Table of Contents

Quick Start

See Installing section for guides on how to install and setup the tool.

Run the import command to read the specified resources from the source organization and store them locally into JSON files in the directory resources/source.

Then, you can run the sync command which will use the stored files from previous import command (unless --force-missing-dependencies flag is passed) to create/modify the resources on the destination organization. The pushed resources are saved in the directory resources/destination.

The migrate command will run an import followed immediately by a sync.

The reset command will delete resources at the destination; however, by default it backs up those resources first and fails if it cannot. You can (but probably shouldn't) skip the backup by using the --do-not-backup flag.

The prune command deletes per-resource state files (in resources/source/ and resources/destination/) for resources that are no longer present in the source organization. It is intended for use with --resource-per-file mode, where deleted upstream resources otherwise leave orphaned files on disk indefinitely. prune requires explicit --resources and refuses to run with --filters set. Supports --dry-run to preview deletions and --force to skip the interactive confirmation.

Note: The tool uses the resources directory as the source of truth for determining what resources need to be created and modified. Hence, this directory should not be removed or corrupted.

Example Usage

# Import resources from parent organization and store them locally
$ datadog-sync import \
--source-api-key="..." \
--source-app-key="..." \
--source-api-url="https://api.datadoghq.com"
> 2024-03-14 14:53:54,280 - INFO - Starting import...
> ...
> 2024-03-14 15:00:46,100 - INFO - Finished import
# Check diff output to see what resources will be created/modified
$ datadog-sync diffs \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 15:46:22,014 - INFO - Starting diffs...
> ...
> 2024-03-14 14:51:15,379 - INFO - Finished diffs
# Sync the resources to the child organization from locally stored files and save the output locally
$ datadog-sync sync \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 14:55:56,535 - INFO - Starting sync...
> ...
> 2024-03-14 14:56:00,797 - INFO - Finished sync: 1 successes, 0 errors

Purpose

The purpose of the datadog-sync-cli package is to provide an easy way to sync Datadog resources across Datadog organizations.

Note: this tool does not, nor is intended, for migrating intake data such as ingested logs, metrics, etc.

The source organization will not be modified, but the destination organization will have resources created and updated by the sync command.

Installing

Installing from source

Note:: Instlling from source requires Python >= v3.9

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Install datadog-sync-cli tool using pip pip install .
  3. Invoke the cli tool using datadog-sync <command> <options>

Installing from Releases

MacOS and Linux

  1. Download the executable from the Releases page
  2. Provide the executable with executable permission chmod +x datadog-sync-cli-{system-name}-{machine-type}
  3. Move the executable to your bin directory sudo mv datadog-sync-cli-{system-name}-{machine-type} /usr/local/bin/datadog-sync
  4. Invoke the CLI tool using datadog-sync <command> <options>

Windows

  1. Download the executable with extension .exe from the Releases page
  2. Add the directory containing the exe file to your path
  3. Invoke the CLI tool in cmd/powershell using the file name and omitting the extension: datadog-sync-cli-windows-amd64 <command> <options>

Using docker and building the image

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Build the provided Dockerfile docker build . -t datadog-sync
  3. Run the Docker image using entrypoint below:
docker run --rm -v <PATH_TO_WORKING_DIR>:/datadog-sync:rw \
-e DD_SOURCE_API_KEY=<DATADOG_API_KEY> \
-e DD_SOURCE_APP_KEY=<DATADOG_APP_KEY> \
-e DD_SOURCE_API_URL=<DATADOG_API_URL> \
-e DD_DESTINATION_API_KEY=<DATADOG_API_KEY> \
-e DD_DESTINATION_APP_KEY=<DATADOG_APP_KEY> \
-e DD_DESTINATION_API_URL=<DATADOG_API_URL> \
datadog-sync:latest <command> <options>

The docker run command mounts a specified <PATH_TO_WORKING_DIR> working directory to the container.

Usage

API URL

Available URL's for the source and destination API URLs are:

  • https://api.datadoghq.com
  • https://api.datadoghq.eu
  • https://api.us5.datadoghq.com
  • https://api.us3.datadoghq.com
  • https://api.ddog-gov.com
  • https://api.ap1.datadoghq.com

For all available regions, see Getting Started with Datadog Sites.

Filtering

Filtering is done on two levels, at top resources level and per individual resource level using --resources and --filter respectively.

Top resources level filtering

By default all resources are imported, synced, etc. If you would like to perform actions on a specific top level resource, or subset of resources, use --resources option. For example, the command datadog-sync import --resources="dashboard_lists,dashboards" will import ALL dashboards and dashboard lists in your Datadog organization.

Per resource level filtering

Individual resources can be further filtered using the --filter flag. For example, the following command datadog-sync import --resources="dashboards,dashboard_lists" --filter='Type=dashboard_lists;Name=name;Value=My custom list', will import ALL dashboards and ONLY dashboard lists with the name attribute equal to My custom list.

Filter option (--filter) accepts a string made up of key=value pairs separated by ;.

--filter 'Type=<resource>;Name=<attribute_name>;Value=<attribute_value>;Operator=<operator>'

Available keys:

  • Type: Resource such as Monitors, Dashboards, and more. [required]
  • Name: Attribute key to filter on. This can be any attribute represented in dot notation (such as attributes.user_count). [required]
  • Value: Regex to filter attribute value by. Note: special regex characters need to be escaped if filtering by raw string. [required]
  • Operator: Available operators are below. All invalid operator's default to ExactMatch.

By default, if multiple filters are passed for the same resource, OR logic is applied to the filters. This behavior can be adjusted using the --filter-operator option.

SubString and ExactMatch Deprecation

In future releases the SubString and ExactMatch Operator will be removed. This is because the Value key supports regex so both of these scenarios are covered by just writing the appropriate regex. Below is an example:

Let's take the scenario where you would like to filter for monitors that have the filter test in the name attribute:

OperatorCommand
SubString--filter 'Type=monitors;Name=name;Value=filter test;Operator=SubString'
Using Value--filter 'Type=monitors;Name=name;Value=.*filter test.*
ExactMatch--filter 'Type=monitors;Name=name;Value=filter test;Operator=ExactMatch'
Using Value--filter 'Type=monitors;Name=name;Value=^filter test$

Config file

A Custom config text file can be passed in place of options.

This is an example config file:

# config
destination_api_url="https://api.datadoghq.eu"
destination_api_key="<API_KEY>"
destination_app_key="<APP_KEY>"
source_api_key="<API_KEY>"
source_app_key="<APP_KEY>"
source_api_url="https://api.datadoghq.com"
filter=["Type=Dashboards;Name=title;Value=Test screenboard", "Type=Monitors;Name=tags;Value=sync:true"]

Then, run: datadog-sync import --config config

Cleanup flag

The tools sync command provides a cleanup flag (--cleanup). Passing the cleanup flag will delete resources from the destination organization which have been removed from the source organization. The resources to be deleted are determined based on the difference between the state files of source and destination organization.

For example, ResourceA and ResourceB are imported and synced, followed by deleting ResourceA from the source organization. Running the import command will update the source organizations state file to only include ResourceB. The following sync --cleanup=Force command will now delete ResourceA from the destination organization.

Verify DDR status flag

By default all commands check the Datadog Disaster Recovery (DDR) status of both the source and destination organizations before running. This behavior is controlled by the boolean flag --verify-ddr-status or the environment variable DD_VERIFY_DDR_STATUS.

Running behind an HTTP proxy

By default the tool's HTTP client ignores the environment and talks to Datadog directly. To run it behind a proxy, set --http-client-trust-env true (or the environment variable DD_HTTP_CLIENT_TRUST_ENV=true). When enabled, the underlying HTTP client honors the standard HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables, as well as credentials from .netrc. This option is off by default. Note that when enabled, the configured proxy can observe all Datadog API traffic — including the DD-API-KEY, DD-APPLICATION-KEY, or JWT headers if it terminates TLS — and .netrc credentials may be automatically attached for matching hosts, so only enable this for a proxy you trust.

State files

By default, a resources directory is generated in the current working directory of the user. This directory contains json mapping of resources between the source and destination organization. To avoid duplication and loss of mapping, this directory should be retained between tool usage. To override these directories use the --source-resources-path and --destination-resource-path.

When running againts multiple destination organizations, a seperate working directory should be used to ensure seperation of data.

Supported resources

ResourceDescription
authn_mappingsSync Datadog authn mappings.
dashboard_listsSync Datadog dashboard lists.
dashboardsSync Datadog dashboards.
downtime_schedulesSync Datadog downtimes.
downtimes (deprecated)Sync Datadog downtimes.
host_tagsSync Datadog host tags.
logs_archivesSync Datadog logs archives. Requires GCP, Azure, or AWS integration.
logs_archives_orderSync Datadog logs archives order.
logs_custom_pipelines (deprecated)Sync Datadog logs custom pipelines.
logs_indexesSync Datadog logs indexes.
logs_indexes_orderSync Datadog logs indexes order.
logs_metricsSync Datadog logs metrics.
logs_pipelinesSync Datadog logs OOTB integration and custom pipelines.
logs_pipelines_orderSync Datadog logs pipelines order.
logs_restriction_queriesSync Datadog logs restriction queries.
metric_percentilesSync Datadog metric percentiles.
metric_tag_configurationsSync Datadog metric tags configurations.
metrics_metadataSync Datadog metric metadata.
monitorsSync Datadog monitors.
notebooksSync Datadog notebooks.
powerpacksSync Datadog powerpacks.
restriction_policiesSync Datadog restriction policies.
rolesSync Datadog roles.
sensitive_data_scanner_groupsSync SDS groups
sensitive_data_scanner_groups_orderSync SDS groups order
sensitive_data_scanner_rulesSync SDS rules
service_level_objectivesSync Datadog SLOs.
slo_correctionsSync Datadog SLO corrections.
spans_metricsSync Datadog spans metrics.
synthetics_global_variablesSync Datadog synthetic global variables.
synthetics_private_locationsSync Datadog Synthetics Private Locations. See DDR guide.
synthetics_testsSync Datadog synthetic tests.
teamsSync Datadog teams (excluding permissions).
team_membershipsSync Datadog team memberships.
usersSync Datadog users.

Note:logs_custom_pipelines resource has been deprecated in favor of logs_pipelines resource which supports both logs OOTB integration and custom pipelines. To migrate to the new resource, rename the existing state files from logs_custom_pipelines.json to logs_pipelines.json for both source and destination files.

Best practices

Many Datadog resources are interdependent. For example, some Datadog resource can reference roles and dashboards, which includes widgets that may use Monitors or Synthetics data. The datadog-sync tool syncs these resources in order to ensure dependencies are not broken.

If importing/syncing subset of resources, users should ensure that dependent resources are imported and synced as well.

See Supported resources section below for potential resource dependencies.

ResourceDependencies
authn_mappingsroles, teams
dashboard_listsdashboards
dashboardsmonitors, roles, powerpacks, service_level_objectives
downtime_schedulesmonitors
downtimes (deprecated)monitors
host_tags-
logs_archives- (Requires manual setup of AWS, GCP or Azure integration)
logs_archives_orderlogs_archives
logs_custom_pipelines (deprecated)-
logs_indexes-
logs_indexes_orderlogs_indexes
logs_metrics-
logs_pipelines-
logs_pipelines_orderlogs_pipelines
logs_restriction_queriesroles
metric_percentiles-
metric_tag_configurations-
metrics_metadata-
monitorsroles, service_level_objectives
notebooks-
powerpacksmonitors, service_level_objectives
restriction_policiesdashboards, service_level_objectives, notebooks, users, roles
roles-
sensitive_data_scanner_groups-
sensitive_data_scanner_groups_ordersensitive_data_scanner_groups
sensitive_data_scanner_rulessensitive_data_scanner_groups
service_level_objectivesmonitors, synthetics_tests
slo_correctionsservice_level_objectives
spans_metrics-
synthetics_global_variablessynthetics_tests
synthetics_private_locations-
synthetics_testssynthetics_global_variables, roles
teams-
team_membershipsteams, users
usersroles

About

Datadog cli tool to sync resources across organizations.

Resources

Contributing

Stars

80 stars

Watchers

340 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - DataDog/datadog-sync-cli: Datadog cli tool to sync resources across organizations. · GitHub
Skip to content

Repository files navigation

datadog-sync-cli

Datadog cli tool to sync resources across organizations.

Table of Contents

Quick Start

See Installing section for guides on how to install and setup the tool.

Run the import command to read the specified resources from the source organization and store them locally into JSON files in the directory resources/source.

Then, you can run the sync command which will use the stored files from previous import command (unless --force-missing-dependencies flag is passed) to create/modify the resources on the destination organization. The pushed resources are saved in the directory resources/destination.

The migrate command will run an import followed immediately by a sync.

The reset command will delete resources at the destination; however, by default it backs up those resources first and fails if it cannot. You can (but probably shouldn't) skip the backup by using the --do-not-backup flag.

The prune command deletes per-resource state files (in resources/source/ and resources/destination/) for resources that are no longer present in the source organization. It is intended for use with --resource-per-file mode, where deleted upstream resources otherwise leave orphaned files on disk indefinitely. prune requires explicit --resources and refuses to run with --filters set. Supports --dry-run to preview deletions and --force to skip the interactive confirmation.

Note: The tool uses the resources directory as the source of truth for determining what resources need to be created and modified. Hence, this directory should not be removed or corrupted.

Example Usage

# Import resources from parent organization and store them locally
$ datadog-sync import \
--source-api-key="..." \
--source-app-key="..." \
--source-api-url="https://api.datadoghq.com"
> 2024-03-14 14:53:54,280 - INFO - Starting import...
> ...
> 2024-03-14 15:00:46,100 - INFO - Finished import
# Check diff output to see what resources will be created/modified
$ datadog-sync diffs \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 15:46:22,014 - INFO - Starting diffs...
> ...
> 2024-03-14 14:51:15,379 - INFO - Finished diffs
# Sync the resources to the child organization from locally stored files and save the output locally
$ datadog-sync sync \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 14:55:56,535 - INFO - Starting sync...
> ...
> 2024-03-14 14:56:00,797 - INFO - Finished sync: 1 successes, 0 errors

Purpose

The purpose of the datadog-sync-cli package is to provide an easy way to sync Datadog resources across Datadog organizations.

Note: this tool does not, nor is intended, for migrating intake data such as ingested logs, metrics, etc.

The source organization will not be modified, but the destination organization will have resources created and updated by the sync command.

Installing

Installing from source

Note:: Instlling from source requires Python >= v3.9

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Install datadog-sync-cli tool using pip pip install .
  3. Invoke the cli tool using datadog-sync <command> <options>

Installing from Releases

MacOS and Linux

  1. Download the executable from the Releases page
  2. Provide the executable with executable permission chmod +x datadog-sync-cli-{system-name}-{machine-type}
  3. Move the executable to your bin directory sudo mv datadog-sync-cli-{system-name}-{machine-type} /usr/local/bin/datadog-sync
  4. Invoke the CLI tool using datadog-sync <command> <options>

Windows

  1. Download the executable with extension .exe from the Releases page
  2. Add the directory containing the exe file to your path
  3. Invoke the CLI tool in cmd/powershell using the file name and omitting the extension: datadog-sync-cli-windows-amd64 <command> <options>

Using docker and building the image

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Build the provided Dockerfile docker build . -t datadog-sync
  3. Run the Docker image using entrypoint below:
docker run --rm -v <PATH_TO_WORKING_DIR>:/datadog-sync:rw \
-e DD_SOURCE_API_KEY=<DATADOG_API_KEY> \
-e DD_SOURCE_APP_KEY=<DATADOG_APP_KEY> \
-e DD_SOURCE_API_URL=<DATADOG_API_URL> \
-e DD_DESTINATION_API_KEY=<DATADOG_API_KEY> \
-e DD_DESTINATION_APP_KEY=<DATADOG_APP_KEY> \
-e DD_DESTINATION_API_URL=<DATADOG_API_URL> \
datadog-sync:latest <command> <options>

The docker run command mounts a specified <PATH_TO_WORKING_DIR> working directory to the container.

Usage

API URL

Available URL's for the source and destination API URLs are:

  • https://api.datadoghq.com
  • https://api.datadoghq.eu
  • https://api.us5.datadoghq.com
  • https://api.us3.datadoghq.com
  • https://api.ddog-gov.com
  • https://api.ap1.datadoghq.com

For all available regions, see Getting Started with Datadog Sites.

Filtering

Filtering is done on two levels, at top resources level and per individual resource level using --resources and --filter respectively.

Top resources level filtering

By default all resources are imported, synced, etc. If you would like to perform actions on a specific top level resource, or subset of resources, use --resources option. For example, the command datadog-sync import --resources="dashboard_lists,dashboards" will import ALL dashboards and dashboard lists in your Datadog organization.

Per resource level filtering

Individual resources can be further filtered using the --filter flag. For example, the following command datadog-sync import --resources="dashboards,dashboard_lists" --filter='Type=dashboard_lists;Name=name;Value=My custom list', will import ALL dashboards and ONLY dashboard lists with the name attribute equal to My custom list.

Filter option (--filter) accepts a string made up of key=value pairs separated by ;.

--filter 'Type=<resource>;Name=<attribute_name>;Value=<attribute_value>;Operator=<operator>'

Available keys:

  • Type: Resource such as Monitors, Dashboards, and more. [required]
  • Name: Attribute key to filter on. This can be any attribute represented in dot notation (such as attributes.user_count). [required]
  • Value: Regex to filter attribute value by. Note: special regex characters need to be escaped if filtering by raw string. [required]
  • Operator: Available operators are below. All invalid operator's default to ExactMatch.

By default, if multiple filters are passed for the same resource, OR logic is applied to the filters. This behavior can be adjusted using the --filter-operator option.

SubString and ExactMatch Deprecation

In future releases the SubString and ExactMatch Operator will be removed. This is because the Value key supports regex so both of these scenarios are covered by just writing the appropriate regex. Below is an example:

Let's take the scenario where you would like to filter for monitors that have the filter test in the name attribute:

OperatorCommand
SubString--filter 'Type=monitors;Name=name;Value=filter test;Operator=SubString'
Using Value--filter 'Type=monitors;Name=name;Value=.*filter test.*
ExactMatch--filter 'Type=monitors;Name=name;Value=filter test;Operator=ExactMatch'
Using Value--filter 'Type=monitors;Name=name;Value=^filter test$

Config file

A Custom config text file can be passed in place of options.

This is an example config file:

# config
destination_api_url="https://api.datadoghq.eu"
destination_api_key="<API_KEY>"
destination_app_key="<APP_KEY>"
source_api_key="<API_KEY>"
source_app_key="<APP_KEY>"
source_api_url="https://api.datadoghq.com"
filter=["Type=Dashboards;Name=title;Value=Test screenboard", "Type=Monitors;Name=tags;Value=sync:true"]

Then, run: datadog-sync import --config config

Cleanup flag

The tools sync command provides a cleanup flag (--cleanup). Passing the cleanup flag will delete resources from the destination organization which have been removed from the source organization. The resources to be deleted are determined based on the difference between the state files of source and destination organization.

For example, ResourceA and ResourceB are imported and synced, followed by deleting ResourceA from the source organization. Running the import command will update the source organizations state file to only include ResourceB. The following sync --cleanup=Force command will now delete ResourceA from the destination organization.

Verify DDR status flag

By default all commands check the Datadog Disaster Recovery (DDR) status of both the source and destination organizations before running. This behavior is controlled by the boolean flag --verify-ddr-status or the environment variable DD_VERIFY_DDR_STATUS.

Running behind an HTTP proxy

By default the tool's HTTP client ignores the environment and talks to Datadog directly. To run it behind a proxy, set --http-client-trust-env true (or the environment variable DD_HTTP_CLIENT_TRUST_ENV=true). When enabled, the underlying HTTP client honors the standard HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables, as well as credentials from .netrc. This option is off by default. Note that when enabled, the configured proxy can observe all Datadog API traffic — including the DD-API-KEY, DD-APPLICATION-KEY, or JWT headers if it terminates TLS — and .netrc credentials may be automatically attached for matching hosts, so only enable this for a proxy you trust.

State files

By default, a resources directory is generated in the current working directory of the user. This directory contains json mapping of resources between the source and destination organization. To avoid duplication and loss of mapping, this directory should be retained between tool usage. To override these directories use the --source-resources-path and --destination-resource-path.

When running againts multiple destination organizations, a seperate working directory should be used to ensure seperation of data.

Supported resources

ResourceDescription
authn_mappingsSync Datadog authn mappings.
dashboard_listsSync Datadog dashboard lists.
dashboardsSync Datadog dashboards.
downtime_schedulesSync Datadog downtimes.
downtimes (deprecated)Sync Datadog downtimes.
host_tagsSync Datadog host tags.
logs_archivesSync Datadog logs archives. Requires GCP, Azure, or AWS integration.
logs_archives_orderSync Datadog logs archives order.
logs_custom_pipelines (deprecated)Sync Datadog logs custom pipelines.
logs_indexesSync Datadog logs indexes.
logs_indexes_orderSync Datadog logs indexes order.
logs_metricsSync Datadog logs metrics.
logs_pipelinesSync Datadog logs OOTB integration and custom pipelines.
logs_pipelines_orderSync Datadog logs pipelines order.
logs_restriction_queriesSync Datadog logs restriction queries.
metric_percentilesSync Datadog metric percentiles.
metric_tag_configurationsSync Datadog metric tags configurations.
metrics_metadataSync Datadog metric metadata.
monitorsSync Datadog monitors.
notebooksSync Datadog notebooks.
powerpacksSync Datadog powerpacks.
restriction_policiesSync Datadog restriction policies.
rolesSync Datadog roles.
sensitive_data_scanner_groupsSync SDS groups
sensitive_data_scanner_groups_orderSync SDS groups order
sensitive_data_scanner_rulesSync SDS rules
service_level_objectivesSync Datadog SLOs.
slo_correctionsSync Datadog SLO corrections.
spans_metricsSync Datadog spans metrics.
synthetics_global_variablesSync Datadog synthetic global variables.
synthetics_private_locationsSync Datadog Synthetics Private Locations. See DDR guide.
synthetics_testsSync Datadog synthetic tests.
teamsSync Datadog teams (excluding permissions).
team_membershipsSync Datadog team memberships.
usersSync Datadog users.

Note:logs_custom_pipelines resource has been deprecated in favor of logs_pipelines resource which supports both logs OOTB integration and custom pipelines. To migrate to the new resource, rename the existing state files from logs_custom_pipelines.json to logs_pipelines.json for both source and destination files.

Best practices

Many Datadog resources are interdependent. For example, some Datadog resource can reference roles and dashboards, which includes widgets that may use Monitors or Synthetics data. The datadog-sync tool syncs these resources in order to ensure dependencies are not broken.

If importing/syncing subset of resources, users should ensure that dependent resources are imported and synced as well.

See Supported resources section below for potential resource dependencies.

ResourceDependencies
authn_mappingsroles, teams
dashboard_listsdashboards
dashboardsmonitors, roles, powerpacks, service_level_objectives
downtime_schedulesmonitors
downtimes (deprecated)monitors
host_tags-
logs_archives- (Requires manual setup of AWS, GCP or Azure integration)
logs_archives_orderlogs_archives
logs_custom_pipelines (deprecated)-
logs_indexes-
logs_indexes_orderlogs_indexes
logs_metrics-
logs_pipelines-
logs_pipelines_orderlogs_pipelines
logs_restriction_queriesroles
metric_percentiles-
metric_tag_configurations-
metrics_metadata-
monitorsroles, service_level_objectives
notebooks-
powerpacksmonitors, service_level_objectives
restriction_policiesdashboards, service_level_objectives, notebooks, users, roles
roles-
sensitive_data_scanner_groups-
sensitive_data_scanner_groups_ordersensitive_data_scanner_groups
sensitive_data_scanner_rulessensitive_data_scanner_groups
service_level_objectivesmonitors, synthetics_tests
slo_correctionsservice_level_objectives
spans_metrics-
synthetics_global_variablessynthetics_tests
synthetics_private_locations-
synthetics_testssynthetics_global_variables, roles
teams-
team_membershipsteams, users
usersroles

About

Datadog cli tool to sync resources across organizations.

Resources

Contributing

Stars

80 stars

Watchers

340 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - DataDog/datadog-sync-cli: Datadog cli tool to sync resources across organizations. · GitHub
Skip to content

Repository files navigation

datadog-sync-cli

Datadog cli tool to sync resources across organizations.

Table of Contents

Quick Start

See Installing section for guides on how to install and setup the tool.

Run the import command to read the specified resources from the source organization and store them locally into JSON files in the directory resources/source.

Then, you can run the sync command which will use the stored files from previous import command (unless --force-missing-dependencies flag is passed) to create/modify the resources on the destination organization. The pushed resources are saved in the directory resources/destination.

The migrate command will run an import followed immediately by a sync.

The reset command will delete resources at the destination; however, by default it backs up those resources first and fails if it cannot. You can (but probably shouldn't) skip the backup by using the --do-not-backup flag.

The prune command deletes per-resource state files (in resources/source/ and resources/destination/) for resources that are no longer present in the source organization. It is intended for use with --resource-per-file mode, where deleted upstream resources otherwise leave orphaned files on disk indefinitely. prune requires explicit --resources and refuses to run with --filters set. Supports --dry-run to preview deletions and --force to skip the interactive confirmation.

Note: The tool uses the resources directory as the source of truth for determining what resources need to be created and modified. Hence, this directory should not be removed or corrupted.

Example Usage

# Import resources from parent organization and store them locally
$ datadog-sync import \
--source-api-key="..." \
--source-app-key="..." \
--source-api-url="https://api.datadoghq.com"
> 2024-03-14 14:53:54,280 - INFO - Starting import...
> ...
> 2024-03-14 15:00:46,100 - INFO - Finished import
# Check diff output to see what resources will be created/modified
$ datadog-sync diffs \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 15:46:22,014 - INFO - Starting diffs...
> ...
> 2024-03-14 14:51:15,379 - INFO - Finished diffs
# Sync the resources to the child organization from locally stored files and save the output locally
$ datadog-sync sync \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 14:55:56,535 - INFO - Starting sync...
> ...
> 2024-03-14 14:56:00,797 - INFO - Finished sync: 1 successes, 0 errors

Purpose

The purpose of the datadog-sync-cli package is to provide an easy way to sync Datadog resources across Datadog organizations.

Note: this tool does not, nor is intended, for migrating intake data such as ingested logs, metrics, etc.

The source organization will not be modified, but the destination organization will have resources created and updated by the sync command.

Installing

Installing from source

Note:: Instlling from source requires Python >= v3.9

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Install datadog-sync-cli tool using pip pip install .
  3. Invoke the cli tool using datadog-sync <command> <options>

Installing from Releases

MacOS and Linux

  1. Download the executable from the Releases page
  2. Provide the executable with executable permission chmod +x datadog-sync-cli-{system-name}-{machine-type}
  3. Move the executable to your bin directory sudo mv datadog-sync-cli-{system-name}-{machine-type} /usr/local/bin/datadog-sync
  4. Invoke the CLI tool using datadog-sync <command> <options>

Windows

  1. Download the executable with extension .exe from the Releases page
  2. Add the directory containing the exe file to your path
  3. Invoke the CLI tool in cmd/powershell using the file name and omitting the extension: datadog-sync-cli-windows-amd64 <command> <options>

Using docker and building the image

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Build the provided Dockerfile docker build . -t datadog-sync
  3. Run the Docker image using entrypoint below:
docker run --rm -v <PATH_TO_WORKING_DIR>:/datadog-sync:rw \
-e DD_SOURCE_API_KEY=<DATADOG_API_KEY> \
-e DD_SOURCE_APP_KEY=<DATADOG_APP_KEY> \
-e DD_SOURCE_API_URL=<DATADOG_API_URL> \
-e DD_DESTINATION_API_KEY=<DATADOG_API_KEY> \
-e DD_DESTINATION_APP_KEY=<DATADOG_APP_KEY> \
-e DD_DESTINATION_API_URL=<DATADOG_API_URL> \
datadog-sync:latest <command> <options>

The docker run command mounts a specified <PATH_TO_WORKING_DIR> working directory to the container.

Usage

API URL

Available URL's for the source and destination API URLs are:

  • https://api.datadoghq.com
  • https://api.datadoghq.eu
  • https://api.us5.datadoghq.com
  • https://api.us3.datadoghq.com
  • https://api.ddog-gov.com
  • https://api.ap1.datadoghq.com

For all available regions, see Getting Started with Datadog Sites.

Filtering

Filtering is done on two levels, at top resources level and per individual resource level using --resources and --filter respectively.

Top resources level filtering

By default all resources are imported, synced, etc. If you would like to perform actions on a specific top level resource, or subset of resources, use --resources option. For example, the command datadog-sync import --resources="dashboard_lists,dashboards" will import ALL dashboards and dashboard lists in your Datadog organization.

Per resource level filtering

Individual resources can be further filtered using the --filter flag. For example, the following command datadog-sync import --resources="dashboards,dashboard_lists" --filter='Type=dashboard_lists;Name=name;Value=My custom list', will import ALL dashboards and ONLY dashboard lists with the name attribute equal to My custom list.

Filter option (--filter) accepts a string made up of key=value pairs separated by ;.

--filter 'Type=<resource>;Name=<attribute_name>;Value=<attribute_value>;Operator=<operator>'

Available keys:

  • Type: Resource such as Monitors, Dashboards, and more. [required]
  • Name: Attribute key to filter on. This can be any attribute represented in dot notation (such as attributes.user_count). [required]
  • Value: Regex to filter attribute value by. Note: special regex characters need to be escaped if filtering by raw string. [required]
  • Operator: Available operators are below. All invalid operator's default to ExactMatch.

By default, if multiple filters are passed for the same resource, OR logic is applied to the filters. This behavior can be adjusted using the --filter-operator option.

SubString and ExactMatch Deprecation

In future releases the SubString and ExactMatch Operator will be removed. This is because the Value key supports regex so both of these scenarios are covered by just writing the appropriate regex. Below is an example:

Let's take the scenario where you would like to filter for monitors that have the filter test in the name attribute:

OperatorCommand
SubString--filter 'Type=monitors;Name=name;Value=filter test;Operator=SubString'
Using Value--filter 'Type=monitors;Name=name;Value=.*filter test.*
ExactMatch--filter 'Type=monitors;Name=name;Value=filter test;Operator=ExactMatch'
Using Value--filter 'Type=monitors;Name=name;Value=^filter test$

Config file

A Custom config text file can be passed in place of options.

This is an example config file:

# config
destination_api_url="https://api.datadoghq.eu"
destination_api_key="<API_KEY>"
destination_app_key="<APP_KEY>"
source_api_key="<API_KEY>"
source_app_key="<APP_KEY>"
source_api_url="https://api.datadoghq.com"
filter=["Type=Dashboards;Name=title;Value=Test screenboard", "Type=Monitors;Name=tags;Value=sync:true"]

Then, run: datadog-sync import --config config

Cleanup flag

The tools sync command provides a cleanup flag (--cleanup). Passing the cleanup flag will delete resources from the destination organization which have been removed from the source organization. The resources to be deleted are determined based on the difference between the state files of source and destination organization.

For example, ResourceA and ResourceB are imported and synced, followed by deleting ResourceA from the source organization. Running the import command will update the source organizations state file to only include ResourceB. The following sync --cleanup=Force command will now delete ResourceA from the destination organization.

Verify DDR status flag

By default all commands check the Datadog Disaster Recovery (DDR) status of both the source and destination organizations before running. This behavior is controlled by the boolean flag --verify-ddr-status or the environment variable DD_VERIFY_DDR_STATUS.

Running behind an HTTP proxy

By default the tool's HTTP client ignores the environment and talks to Datadog directly. To run it behind a proxy, set --http-client-trust-env true (or the environment variable DD_HTTP_CLIENT_TRUST_ENV=true). When enabled, the underlying HTTP client honors the standard HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables, as well as credentials from .netrc. This option is off by default. Note that when enabled, the configured proxy can observe all Datadog API traffic — including the DD-API-KEY, DD-APPLICATION-KEY, or JWT headers if it terminates TLS — and .netrc credentials may be automatically attached for matching hosts, so only enable this for a proxy you trust.

State files

By default, a resources directory is generated in the current working directory of the user. This directory contains json mapping of resources between the source and destination organization. To avoid duplication and loss of mapping, this directory should be retained between tool usage. To override these directories use the --source-resources-path and --destination-resource-path.

When running againts multiple destination organizations, a seperate working directory should be used to ensure seperation of data.

Supported resources

ResourceDescription
authn_mappingsSync Datadog authn mappings.
dashboard_listsSync Datadog dashboard lists.
dashboardsSync Datadog dashboards.
downtime_schedulesSync Datadog downtimes.
downtimes (deprecated)Sync Datadog downtimes.
host_tagsSync Datadog host tags.
logs_archivesSync Datadog logs archives. Requires GCP, Azure, or AWS integration.
logs_archives_orderSync Datadog logs archives order.
logs_custom_pipelines (deprecated)Sync Datadog logs custom pipelines.
logs_indexesSync Datadog logs indexes.
logs_indexes_orderSync Datadog logs indexes order.
logs_metricsSync Datadog logs metrics.
logs_pipelinesSync Datadog logs OOTB integration and custom pipelines.
logs_pipelines_orderSync Datadog logs pipelines order.
logs_restriction_queriesSync Datadog logs restriction queries.
metric_percentilesSync Datadog metric percentiles.
metric_tag_configurationsSync Datadog metric tags configurations.
metrics_metadataSync Datadog metric metadata.
monitorsSync Datadog monitors.
notebooksSync Datadog notebooks.
powerpacksSync Datadog powerpacks.
restriction_policiesSync Datadog restriction policies.
rolesSync Datadog roles.
sensitive_data_scanner_groupsSync SDS groups
sensitive_data_scanner_groups_orderSync SDS groups order
sensitive_data_scanner_rulesSync SDS rules
service_level_objectivesSync Datadog SLOs.
slo_correctionsSync Datadog SLO corrections.
spans_metricsSync Datadog spans metrics.
synthetics_global_variablesSync Datadog synthetic global variables.
synthetics_private_locationsSync Datadog Synthetics Private Locations. See DDR guide.
synthetics_testsSync Datadog synthetic tests.
teamsSync Datadog teams (excluding permissions).
team_membershipsSync Datadog team memberships.
usersSync Datadog users.

Note:logs_custom_pipelines resource has been deprecated in favor of logs_pipelines resource which supports both logs OOTB integration and custom pipelines. To migrate to the new resource, rename the existing state files from logs_custom_pipelines.json to logs_pipelines.json for both source and destination files.

Best practices

Many Datadog resources are interdependent. For example, some Datadog resource can reference roles and dashboards, which includes widgets that may use Monitors or Synthetics data. The datadog-sync tool syncs these resources in order to ensure dependencies are not broken.

If importing/syncing subset of resources, users should ensure that dependent resources are imported and synced as well.

See Supported resources section below for potential resource dependencies.

ResourceDependencies
authn_mappingsroles, teams
dashboard_listsdashboards
dashboardsmonitors, roles, powerpacks, service_level_objectives
downtime_schedulesmonitors
downtimes (deprecated)monitors
host_tags-
logs_archives- (Requires manual setup of AWS, GCP or Azure integration)
logs_archives_orderlogs_archives
logs_custom_pipelines (deprecated)-
logs_indexes-
logs_indexes_orderlogs_indexes
logs_metrics-
logs_pipelines-
logs_pipelines_orderlogs_pipelines
logs_restriction_queriesroles
metric_percentiles-
metric_tag_configurations-
metrics_metadata-
monitorsroles, service_level_objectives
notebooks-
powerpacksmonitors, service_level_objectives
restriction_policiesdashboards, service_level_objectives, notebooks, users, roles
roles-
sensitive_data_scanner_groups-
sensitive_data_scanner_groups_ordersensitive_data_scanner_groups
sensitive_data_scanner_rulessensitive_data_scanner_groups
service_level_objectivesmonitors, synthetics_tests
slo_correctionsservice_level_objectives
spans_metrics-
synthetics_global_variablessynthetics_tests
synthetics_private_locations-
synthetics_testssynthetics_global_variables, roles
teams-
team_membershipsteams, users
usersroles

About

Datadog cli tool to sync resources across organizations.

Resources

Contributing

Stars

80 stars

Watchers

340 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - DataDog/datadog-sync-cli: Datadog cli tool to sync resources across organizations. · GitHub
Skip to content

Repository files navigation

datadog-sync-cli

Datadog cli tool to sync resources across organizations.

Table of Contents

Quick Start

See Installing section for guides on how to install and setup the tool.

Run the import command to read the specified resources from the source organization and store them locally into JSON files in the directory resources/source.

Then, you can run the sync command which will use the stored files from previous import command (unless --force-missing-dependencies flag is passed) to create/modify the resources on the destination organization. The pushed resources are saved in the directory resources/destination.

The migrate command will run an import followed immediately by a sync.

The reset command will delete resources at the destination; however, by default it backs up those resources first and fails if it cannot. You can (but probably shouldn't) skip the backup by using the --do-not-backup flag.

The prune command deletes per-resource state files (in resources/source/ and resources/destination/) for resources that are no longer present in the source organization. It is intended for use with --resource-per-file mode, where deleted upstream resources otherwise leave orphaned files on disk indefinitely. prune requires explicit --resources and refuses to run with --filters set. Supports --dry-run to preview deletions and --force to skip the interactive confirmation.

Note: The tool uses the resources directory as the source of truth for determining what resources need to be created and modified. Hence, this directory should not be removed or corrupted.

Example Usage

# Import resources from parent organization and store them locally
$ datadog-sync import \
--source-api-key="..." \
--source-app-key="..." \
--source-api-url="https://api.datadoghq.com"
> 2024-03-14 14:53:54,280 - INFO - Starting import...
> ...
> 2024-03-14 15:00:46,100 - INFO - Finished import
# Check diff output to see what resources will be created/modified
$ datadog-sync diffs \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 15:46:22,014 - INFO - Starting diffs...
> ...
> 2024-03-14 14:51:15,379 - INFO - Finished diffs
# Sync the resources to the child organization from locally stored files and save the output locally
$ datadog-sync sync \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 14:55:56,535 - INFO - Starting sync...
> ...
> 2024-03-14 14:56:00,797 - INFO - Finished sync: 1 successes, 0 errors

Purpose

The purpose of the datadog-sync-cli package is to provide an easy way to sync Datadog resources across Datadog organizations.

Note: this tool does not, nor is intended, for migrating intake data such as ingested logs, metrics, etc.

The source organization will not be modified, but the destination organization will have resources created and updated by the sync command.

Installing

Installing from source

Note:: Instlling from source requires Python >= v3.9

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Install datadog-sync-cli tool using pip pip install .
  3. Invoke the cli tool using datadog-sync <command> <options>

Installing from Releases

MacOS and Linux

  1. Download the executable from the Releases page
  2. Provide the executable with executable permission chmod +x datadog-sync-cli-{system-name}-{machine-type}
  3. Move the executable to your bin directory sudo mv datadog-sync-cli-{system-name}-{machine-type} /usr/local/bin/datadog-sync
  4. Invoke the CLI tool using datadog-sync <command> <options>

Windows

  1. Download the executable with extension .exe from the Releases page
  2. Add the directory containing the exe file to your path
  3. Invoke the CLI tool in cmd/powershell using the file name and omitting the extension: datadog-sync-cli-windows-amd64 <command> <options>

Using docker and building the image

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Build the provided Dockerfile docker build . -t datadog-sync
  3. Run the Docker image using entrypoint below:
docker run --rm -v <PATH_TO_WORKING_DIR>:/datadog-sync:rw \
-e DD_SOURCE_API_KEY=<DATADOG_API_KEY> \
-e DD_SOURCE_APP_KEY=<DATADOG_APP_KEY> \
-e DD_SOURCE_API_URL=<DATADOG_API_URL> \
-e DD_DESTINATION_API_KEY=<DATADOG_API_KEY> \
-e DD_DESTINATION_APP_KEY=<DATADOG_APP_KEY> \
-e DD_DESTINATION_API_URL=<DATADOG_API_URL> \
datadog-sync:latest <command> <options>

The docker run command mounts a specified <PATH_TO_WORKING_DIR> working directory to the container.

Usage

API URL

Available URL's for the source and destination API URLs are:

  • https://api.datadoghq.com
  • https://api.datadoghq.eu
  • https://api.us5.datadoghq.com
  • https://api.us3.datadoghq.com
  • https://api.ddog-gov.com
  • https://api.ap1.datadoghq.com

For all available regions, see Getting Started with Datadog Sites.

Filtering

Filtering is done on two levels, at top resources level and per individual resource level using --resources and --filter respectively.

Top resources level filtering

By default all resources are imported, synced, etc. If you would like to perform actions on a specific top level resource, or subset of resources, use --resources option. For example, the command datadog-sync import --resources="dashboard_lists,dashboards" will import ALL dashboards and dashboard lists in your Datadog organization.

Per resource level filtering

Individual resources can be further filtered using the --filter flag. For example, the following command datadog-sync import --resources="dashboards,dashboard_lists" --filter='Type=dashboard_lists;Name=name;Value=My custom list', will import ALL dashboards and ONLY dashboard lists with the name attribute equal to My custom list.

Filter option (--filter) accepts a string made up of key=value pairs separated by ;.

--filter 'Type=<resource>;Name=<attribute_name>;Value=<attribute_value>;Operator=<operator>'

Available keys:

  • Type: Resource such as Monitors, Dashboards, and more. [required]
  • Name: Attribute key to filter on. This can be any attribute represented in dot notation (such as attributes.user_count). [required]
  • Value: Regex to filter attribute value by. Note: special regex characters need to be escaped if filtering by raw string. [required]
  • Operator: Available operators are below. All invalid operator's default to ExactMatch.

By default, if multiple filters are passed for the same resource, OR logic is applied to the filters. This behavior can be adjusted using the --filter-operator option.

SubString and ExactMatch Deprecation

In future releases the SubString and ExactMatch Operator will be removed. This is because the Value key supports regex so both of these scenarios are covered by just writing the appropriate regex. Below is an example:

Let's take the scenario where you would like to filter for monitors that have the filter test in the name attribute:

OperatorCommand
SubString--filter 'Type=monitors;Name=name;Value=filter test;Operator=SubString'
Using Value--filter 'Type=monitors;Name=name;Value=.*filter test.*
ExactMatch--filter 'Type=monitors;Name=name;Value=filter test;Operator=ExactMatch'
Using Value--filter 'Type=monitors;Name=name;Value=^filter test$

Config file

A Custom config text file can be passed in place of options.

This is an example config file:

# config
destination_api_url="https://api.datadoghq.eu"
destination_api_key="<API_KEY>"
destination_app_key="<APP_KEY>"
source_api_key="<API_KEY>"
source_app_key="<APP_KEY>"
source_api_url="https://api.datadoghq.com"
filter=["Type=Dashboards;Name=title;Value=Test screenboard", "Type=Monitors;Name=tags;Value=sync:true"]

Then, run: datadog-sync import --config config

Cleanup flag

The tools sync command provides a cleanup flag (--cleanup). Passing the cleanup flag will delete resources from the destination organization which have been removed from the source organization. The resources to be deleted are determined based on the difference between the state files of source and destination organization.

For example, ResourceA and ResourceB are imported and synced, followed by deleting ResourceA from the source organization. Running the import command will update the source organizations state file to only include ResourceB. The following sync --cleanup=Force command will now delete ResourceA from the destination organization.

Verify DDR status flag

By default all commands check the Datadog Disaster Recovery (DDR) status of both the source and destination organizations before running. This behavior is controlled by the boolean flag --verify-ddr-status or the environment variable DD_VERIFY_DDR_STATUS.

Running behind an HTTP proxy

By default the tool's HTTP client ignores the environment and talks to Datadog directly. To run it behind a proxy, set --http-client-trust-env true (or the environment variable DD_HTTP_CLIENT_TRUST_ENV=true). When enabled, the underlying HTTP client honors the standard HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables, as well as credentials from .netrc. This option is off by default. Note that when enabled, the configured proxy can observe all Datadog API traffic — including the DD-API-KEY, DD-APPLICATION-KEY, or JWT headers if it terminates TLS — and .netrc credentials may be automatically attached for matching hosts, so only enable this for a proxy you trust.

State files

By default, a resources directory is generated in the current working directory of the user. This directory contains json mapping of resources between the source and destination organization. To avoid duplication and loss of mapping, this directory should be retained between tool usage. To override these directories use the --source-resources-path and --destination-resource-path.

When running againts multiple destination organizations, a seperate working directory should be used to ensure seperation of data.

Supported resources

ResourceDescription
authn_mappingsSync Datadog authn mappings.
dashboard_listsSync Datadog dashboard lists.
dashboardsSync Datadog dashboards.
downtime_schedulesSync Datadog downtimes.
downtimes (deprecated)Sync Datadog downtimes.
host_tagsSync Datadog host tags.
logs_archivesSync Datadog logs archives. Requires GCP, Azure, or AWS integration.
logs_archives_orderSync Datadog logs archives order.
logs_custom_pipelines (deprecated)Sync Datadog logs custom pipelines.
logs_indexesSync Datadog logs indexes.
logs_indexes_orderSync Datadog logs indexes order.
logs_metricsSync Datadog logs metrics.
logs_pipelinesSync Datadog logs OOTB integration and custom pipelines.
logs_pipelines_orderSync Datadog logs pipelines order.
logs_restriction_queriesSync Datadog logs restriction queries.
metric_percentilesSync Datadog metric percentiles.
metric_tag_configurationsSync Datadog metric tags configurations.
metrics_metadataSync Datadog metric metadata.
monitorsSync Datadog monitors.
notebooksSync Datadog notebooks.
powerpacksSync Datadog powerpacks.
restriction_policiesSync Datadog restriction policies.
rolesSync Datadog roles.
sensitive_data_scanner_groupsSync SDS groups
sensitive_data_scanner_groups_orderSync SDS groups order
sensitive_data_scanner_rulesSync SDS rules
service_level_objectivesSync Datadog SLOs.
slo_correctionsSync Datadog SLO corrections.
spans_metricsSync Datadog spans metrics.
synthetics_global_variablesSync Datadog synthetic global variables.
synthetics_private_locationsSync Datadog Synthetics Private Locations. See DDR guide.
synthetics_testsSync Datadog synthetic tests.
teamsSync Datadog teams (excluding permissions).
team_membershipsSync Datadog team memberships.
usersSync Datadog users.

Note:logs_custom_pipelines resource has been deprecated in favor of logs_pipelines resource which supports both logs OOTB integration and custom pipelines. To migrate to the new resource, rename the existing state files from logs_custom_pipelines.json to logs_pipelines.json for both source and destination files.

Best practices

Many Datadog resources are interdependent. For example, some Datadog resource can reference roles and dashboards, which includes widgets that may use Monitors or Synthetics data. The datadog-sync tool syncs these resources in order to ensure dependencies are not broken.

If importing/syncing subset of resources, users should ensure that dependent resources are imported and synced as well.

See Supported resources section below for potential resource dependencies.

ResourceDependencies
authn_mappingsroles, teams
dashboard_listsdashboards
dashboardsmonitors, roles, powerpacks, service_level_objectives
downtime_schedulesmonitors
downtimes (deprecated)monitors
host_tags-
logs_archives- (Requires manual setup of AWS, GCP or Azure integration)
logs_archives_orderlogs_archives
logs_custom_pipelines (deprecated)-
logs_indexes-
logs_indexes_orderlogs_indexes
logs_metrics-
logs_pipelines-
logs_pipelines_orderlogs_pipelines
logs_restriction_queriesroles
metric_percentiles-
metric_tag_configurations-
metrics_metadata-
monitorsroles, service_level_objectives
notebooks-
powerpacksmonitors, service_level_objectives
restriction_policiesdashboards, service_level_objectives, notebooks, users, roles
roles-
sensitive_data_scanner_groups-
sensitive_data_scanner_groups_ordersensitive_data_scanner_groups
sensitive_data_scanner_rulessensitive_data_scanner_groups
service_level_objectivesmonitors, synthetics_tests
slo_correctionsservice_level_objectives
spans_metrics-
synthetics_global_variablessynthetics_tests
synthetics_private_locations-
synthetics_testssynthetics_global_variables, roles
teams-
team_membershipsteams, users
usersroles

About

Datadog cli tool to sync resources across organizations.

Resources

Contributing

Stars

80 stars

Watchers

340 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - DataDog/datadog-sync-cli: Datadog cli tool to sync resources across organizations. · GitHub
Skip to content

Repository files navigation

datadog-sync-cli

Datadog cli tool to sync resources across organizations.

Table of Contents

Quick Start

See Installing section for guides on how to install and setup the tool.

Run the import command to read the specified resources from the source organization and store them locally into JSON files in the directory resources/source.

Then, you can run the sync command which will use the stored files from previous import command (unless --force-missing-dependencies flag is passed) to create/modify the resources on the destination organization. The pushed resources are saved in the directory resources/destination.

The migrate command will run an import followed immediately by a sync.

The reset command will delete resources at the destination; however, by default it backs up those resources first and fails if it cannot. You can (but probably shouldn't) skip the backup by using the --do-not-backup flag.

The prune command deletes per-resource state files (in resources/source/ and resources/destination/) for resources that are no longer present in the source organization. It is intended for use with --resource-per-file mode, where deleted upstream resources otherwise leave orphaned files on disk indefinitely. prune requires explicit --resources and refuses to run with --filters set. Supports --dry-run to preview deletions and --force to skip the interactive confirmation.

Note: The tool uses the resources directory as the source of truth for determining what resources need to be created and modified. Hence, this directory should not be removed or corrupted.

Example Usage

# Import resources from parent organization and store them locally
$ datadog-sync import \
--source-api-key="..." \
--source-app-key="..." \
--source-api-url="https://api.datadoghq.com"
> 2024-03-14 14:53:54,280 - INFO - Starting import...
> ...
> 2024-03-14 15:00:46,100 - INFO - Finished import
# Check diff output to see what resources will be created/modified
$ datadog-sync diffs \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 15:46:22,014 - INFO - Starting diffs...
> ...
> 2024-03-14 14:51:15,379 - INFO - Finished diffs
# Sync the resources to the child organization from locally stored files and save the output locally
$ datadog-sync sync \
--destination-api-key="..." \
--destination-app-key="..." \
--destination-api-url="https://api.datadoghq.eu"
> 2024-03-14 14:55:56,535 - INFO - Starting sync...
> ...
> 2024-03-14 14:56:00,797 - INFO - Finished sync: 1 successes, 0 errors

Purpose

The purpose of the datadog-sync-cli package is to provide an easy way to sync Datadog resources across Datadog organizations.

Note: this tool does not, nor is intended, for migrating intake data such as ingested logs, metrics, etc.

The source organization will not be modified, but the destination organization will have resources created and updated by the sync command.

Installing

Installing from source

Note:: Instlling from source requires Python >= v3.9

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Install datadog-sync-cli tool using pip pip install .
  3. Invoke the cli tool using datadog-sync <command> <options>

Installing from Releases

MacOS and Linux

  1. Download the executable from the Releases page
  2. Provide the executable with executable permission chmod +x datadog-sync-cli-{system-name}-{machine-type}
  3. Move the executable to your bin directory sudo mv datadog-sync-cli-{system-name}-{machine-type} /usr/local/bin/datadog-sync
  4. Invoke the CLI tool using datadog-sync <command> <options>

Windows

  1. Download the executable with extension .exe from the Releases page
  2. Add the directory containing the exe file to your path
  3. Invoke the CLI tool in cmd/powershell using the file name and omitting the extension: datadog-sync-cli-windows-amd64 <command> <options>

Using docker and building the image

  1. Clone the project repo and CD into the directory git clone https://github.com/DataDog/datadog-sync-cli.git; cd datadog-sync-cli
  2. Build the provided Dockerfile docker build . -t datadog-sync
  3. Run the Docker image using entrypoint below:
docker run --rm -v <PATH_TO_WORKING_DIR>:/datadog-sync:rw \
-e DD_SOURCE_API_KEY=<DATADOG_API_KEY> \
-e DD_SOURCE_APP_KEY=<DATADOG_APP_KEY> \
-e DD_SOURCE_API_URL=<DATADOG_API_URL> \
-e DD_DESTINATION_API_KEY=<DATADOG_API_KEY> \
-e DD_DESTINATION_APP_KEY=<DATADOG_APP_KEY> \
-e DD_DESTINATION_API_URL=<DATADOG_API_URL> \
datadog-sync:latest <command> <options>

The docker run command mounts a specified <PATH_TO_WORKING_DIR> working directory to the container.

Usage

API URL

Available URL's for the source and destination API URLs are:

  • https://api.datadoghq.com
  • https://api.datadoghq.eu
  • https://api.us5.datadoghq.com
  • https://api.us3.datadoghq.com
  • https://api.ddog-gov.com
  • https://api.ap1.datadoghq.com

For all available regions, see Getting Started with Datadog Sites.

Filtering

Filtering is done on two levels, at top resources level and per individual resource level using --resources and --filter respectively.

Top resources level filtering

By default all resources are imported, synced, etc. If you would like to perform actions on a specific top level resource, or subset of resources, use --resources option. For example, the command datadog-sync import --resources="dashboard_lists,dashboards" will import ALL dashboards and dashboard lists in your Datadog organization.

Per resource level filtering

Individual resources can be further filtered using the --filter flag. For example, the following command datadog-sync import --resources="dashboards,dashboard_lists" --filter='Type=dashboard_lists;Name=name;Value=My custom list', will import ALL dashboards and ONLY dashboard lists with the name attribute equal to My custom list.

Filter option (--filter) accepts a string made up of key=value pairs separated by ;.

--filter 'Type=<resource>;Name=<attribute_name>;Value=<attribute_value>;Operator=<operator>'

Available keys:

  • Type: Resource such as Monitors, Dashboards, and more. [required]
  • Name: Attribute key to filter on. This can be any attribute represented in dot notation (such as attributes.user_count). [required]
  • Value: Regex to filter attribute value by. Note: special regex characters need to be escaped if filtering by raw string. [required]
  • Operator: Available operators are below. All invalid operator's default to ExactMatch.

By default, if multiple filters are passed for the same resource, OR logic is applied to the filters. This behavior can be adjusted using the --filter-operator option.

SubString and ExactMatch Deprecation

In future releases the SubString and ExactMatch Operator will be removed. This is because the Value key supports regex so both of these scenarios are covered by just writing the appropriate regex. Below is an example:

Let's take the scenario where you would like to filter for monitors that have the filter test in the name attribute:

OperatorCommand
SubString--filter 'Type=monitors;Name=name;Value=filter test;Operator=SubString'
Using Value--filter 'Type=monitors;Name=name;Value=.*filter test.*
ExactMatch--filter 'Type=monitors;Name=name;Value=filter test;Operator=ExactMatch'
Using Value--filter 'Type=monitors;Name=name;Value=^filter test$

Config file

A Custom config text file can be passed in place of options.

This is an example config file:

# config
destination_api_url="https://api.datadoghq.eu"
destination_api_key="<API_KEY>"
destination_app_key="<APP_KEY>"
source_api_key="<API_KEY>"
source_app_key="<APP_KEY>"
source_api_url="https://api.datadoghq.com"
filter=["Type=Dashboards;Name=title;Value=Test screenboard", "Type=Monitors;Name=tags;Value=sync:true"]

Then, run: datadog-sync import --config config

Cleanup flag

The tools sync command provides a cleanup flag (--cleanup). Passing the cleanup flag will delete resources from the destination organization which have been removed from the source organization. The resources to be deleted are determined based on the difference between the state files of source and destination organization.

For example, ResourceA and ResourceB are imported and synced, followed by deleting ResourceA from the source organization. Running the import command will update the source organizations state file to only include ResourceB. The following sync --cleanup=Force command will now delete ResourceA from the destination organization.

Verify DDR status flag

By default all commands check the Datadog Disaster Recovery (DDR) status of both the source and destination organizations before running. This behavior is controlled by the boolean flag --verify-ddr-status or the environment variable DD_VERIFY_DDR_STATUS.

Running behind an HTTP proxy

By default the tool's HTTP client ignores the environment and talks to Datadog directly. To run it behind a proxy, set --http-client-trust-env true (or the environment variable DD_HTTP_CLIENT_TRUST_ENV=true). When enabled, the underlying HTTP client honors the standard HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables, as well as credentials from .netrc. This option is off by default. Note that when enabled, the configured proxy can observe all Datadog API traffic — including the DD-API-KEY, DD-APPLICATION-KEY, or JWT headers if it terminates TLS — and .netrc credentials may be automatically attached for matching hosts, so only enable this for a proxy you trust.

State files

By default, a resources directory is generated in the current working directory of the user. This directory contains json mapping of resources between the source and destination organization. To avoid duplication and loss of mapping, this directory should be retained between tool usage. To override these directories use the --source-resources-path and --destination-resource-path.

When running againts multiple destination organizations, a seperate working directory should be used to ensure seperation of data.

Supported resources

ResourceDescription
authn_mappingsSync Datadog authn mappings.
dashboard_listsSync Datadog dashboard lists.
dashboardsSync Datadog dashboards.
downtime_schedulesSync Datadog downtimes.
downtimes (deprecated)Sync Datadog downtimes.
host_tagsSync Datadog host tags.
logs_archivesSync Datadog logs archives. Requires GCP, Azure, or AWS integration.
logs_archives_orderSync Datadog logs archives order.
logs_custom_pipelines (deprecated)Sync Datadog logs custom pipelines.
logs_indexesSync Datadog logs indexes.
logs_indexes_orderSync Datadog logs indexes order.
logs_metricsSync Datadog logs metrics.
logs_pipelinesSync Datadog logs OOTB integration and custom pipelines.
logs_pipelines_orderSync Datadog logs pipelines order.
logs_restriction_queriesSync Datadog logs restriction queries.
metric_percentilesSync Datadog metric percentiles.
metric_tag_configurationsSync Datadog metric tags configurations.
metrics_metadataSync Datadog metric metadata.
monitorsSync Datadog monitors.
notebooksSync Datadog notebooks.
powerpacksSync Datadog powerpacks.
restriction_policiesSync Datadog restriction policies.
rolesSync Datadog roles.
sensitive_data_scanner_groupsSync SDS groups
sensitive_data_scanner_groups_orderSync SDS groups order
sensitive_data_scanner_rulesSync SDS rules
service_level_objectivesSync Datadog SLOs.
slo_correctionsSync Datadog SLO corrections.
spans_metricsSync Datadog spans metrics.
synthetics_global_variablesSync Datadog synthetic global variables.
synthetics_private_locationsSync Datadog Synthetics Private Locations. See DDR guide.
synthetics_testsSync Datadog synthetic tests.
teamsSync Datadog teams (excluding permissions).
team_membershipsSync Datadog team memberships.
usersSync Datadog users.

Note:logs_custom_pipelines resource has been deprecated in favor of logs_pipelines resource which supports both logs OOTB integration and custom pipelines. To migrate to the new resource, rename the existing state files from logs_custom_pipelines.json to logs_pipelines.json for both source and destination files.

Best practices

Many Datadog resources are interdependent. For example, some Datadog resource can reference roles and dashboards, which includes widgets that may use Monitors or Synthetics data. The datadog-sync tool syncs these resources in order to ensure dependencies are not broken.

If importing/syncing subset of resources, users should ensure that dependent resources are imported and synced as well.

See Supported resources section below for potential resource dependencies.

ResourceDependencies
authn_mappingsroles, teams
dashboard_listsdashboards
dashboardsmonitors, roles, powerpacks, service_level_objectives
downtime_schedulesmonitors
downtimes (deprecated)monitors
host_tags-
logs_archives- (Requires manual setup of AWS, GCP or Azure integration)
logs_archives_orderlogs_archives
logs_custom_pipelines (deprecated)-
logs_indexes-
logs_indexes_orderlogs_indexes
logs_metrics-
logs_pipelines-
logs_pipelines_orderlogs_pipelines
logs_restriction_queriesroles
metric_percentiles-
metric_tag_configurations-
metrics_metadata-
monitorsroles, service_level_objectives
notebooks-
powerpacksmonitors, service_level_objectives
restriction_policiesdashboards, service_level_objectives, notebooks, users, roles
roles-
sensitive_data_scanner_groups-
sensitive_data_scanner_groups_ordersensitive_data_scanner_groups
sensitive_data_scanner_rulessensitive_data_scanner_groups
service_level_objectivesmonitors, synthetics_tests
slo_correctionsservice_level_objectives
spans_metrics-
synthetics_global_variablessynthetics_tests
synthetics_private_locations-
synthetics_testssynthetics_global_variables, roles
teams-
team_membershipsteams, users
usersroles

About

Datadog cli tool to sync resources across organizations.

Resources

Contributing

Stars

80 stars

Watchers

340 watching

Forks

Releases

Packages

Used by

Contributors

Languages