Update a ticket creation rule

Note: This endpoint is in Preview and is subject to change. If you have any feedback, contact Datadog support.

PUT https://api.ap1.datadoghq.com/api/v2/security/findings/automation/ticket_creation_rules/{rule_id}https://api.ap2.datadoghq.com/api/v2/security/findings/automation/ticket_creation_rules/{rule_id}https://api.datadoghq.eu/api/v2/security/findings/automation/ticket_creation_rules/{rule_id}https://api.ddog-gov.com/api/v2/security/findings/automation/ticket_creation_rules/{rule_id}https://api.us2.ddog-gov.com/api/v2/security/findings/automation/ticket_creation_rules/{rule_id}https://api.uk1.datadoghq.com/api/v2/security/findings/automation/ticket_creation_rules/{rule_id}https://api.datadoghq.com/api/v2/security/findings/automation/ticket_creation_rules/{rule_id}https://api.us3.datadoghq.com/api/v2/security/findings/automation/ticket_creation_rules/{rule_id}https://api.us5.datadoghq.com/api/v2/security/findings/automation/ticket_creation_rules/{rule_id}

Overview

Update an existing ticket creation rule by ID. This endpoint requires the security_pipelines_write permission.

Arguments

Path Parameters

Name

Type

Description

rule_id [required]

string

The ID of the ticket creation rule.

Request

Body Data (required)

Expand All

Field

Type

Description

data [required]

object

The data object for a ticket creation rule create or update request.

attributes [required]

object

Attributes for creating or updating a ticket creation rule.

action [required]

object

The action to take when the ticket creation rule matches a finding.

assignee_id

uuid

The UUID of the default assignee for created tickets.

fields

object

Custom fields of the Jira issue to create. For the list of available fields, see Jira documentation.

max_tickets_per_day [required]

int64

The maximum number of tickets the rule may create per day. If exceeded, one final ticket will be created, explaining the limit was hit and link back to the responsible rule.

project_id [required]

uuid

The UUID of the case management project.

target [required]

enum

The ticketing system to create tickets in. Allowed enum values: jira,case_management

enabled

boolean

Whether the ticket creation rule is enabled.

name [required]

string

The name of the ticket creation rule.

rule [required]

object

Defines the scope of findings to which the automation rule applies.

finding_types [required]

[string]

The list of security finding types that the automation rule applies to.

query

string

A search query to further filter the findings matched by this rule. The @workflow.* namespace and @status fields are not permitted. For a reference of available fields, see the Security Findings schema documentation.

type [required]

enum

The JSON:API type for ticket creation rules. Allowed enum values: ticket_creation_rules

{
  "data": {
    "attributes": {
      "action": {
        "max_tickets_per_day": 5,
        "project_id": "11111111-1111-1111-1111-111111111111",
        "target": "jira"
      },
      "enabled": false,
      "name": "Example-Security-Monitoring",
      "rule": {
        "finding_types": [
          "misconfiguration"
        ],
        "query": "env:staging"
      }
    },
    "type": "ticket_creation_rules"
  }
}

Response

Successfully updated the ticket creation rule

A single ticket creation rule response.

Expand All

Field

Type

Description

data [required]

object

The data object for a ticket creation rule returned by the API.

attributes [required]

object

Attributes of a ticket creation rule returned by the API.

action [required]

object

The action to take when the ticket creation rule matches a finding.

assignee_id

uuid

The UUID of the default assignee for created tickets.

auto_disabled_reason

string

The reason the rule was automatically disabled by the system due to a ticketing integration error.

fields

object

Custom fields of the Jira issue to create. For the list of available fields, see Jira documentation.

max_tickets_per_day [required]

int64

The maximum number of tickets the rule may create per day. If exceeded, one final ticket will be created, explaining the limit was hit and link back to the responsible rule.

project_id [required]

uuid

The UUID of the case management project.

target [required]

enum

The ticketing system to create tickets in. Allowed enum values: jira,case_management

created_at [required]

int64

The Unix timestamp in milliseconds when the rule was created.

created_by [required]

object

The user or Datadog system who created the rule.

id [required]

string

The actor's identifier (a user UUID or a system identifier).

name [required]

string

The name of the actor.

type [required]

enum

Whether the actor is a user or the Datadog system. Allowed enum values: user,system

enabled [required]

boolean

Whether the ticket creation rule is enabled.

modified_at [required]

int64

The Unix timestamp in milliseconds when the rule was last modified.

modified_by [required]

object

The user or Datadog system who last modified the rule.

id [required]

string

The actor's identifier (a user UUID or a system identifier).

name [required]

string

The name of the actor.

type [required]

enum

Whether the actor is a user or the Datadog system. Allowed enum values: user,system

name [required]

string

The name of the ticket creation rule.

rule [required]

object

Defines the scope of findings to which the automation rule applies.

finding_types [required]

[string]

The list of security finding types that the automation rule applies to.

query

string

A search query to further filter the findings matched by this rule. The @workflow.* namespace and @status fields are not permitted. For a reference of available fields, see the Security Findings schema documentation.

id [required]

uuid

The ID of the ticket creation rule.

type [required]

enum

The JSON:API type for ticket creation rules. Allowed enum values: ticket_creation_rules

{
  "data": {
    "attributes": {
      "action": {
        "assignee_id": "22222222-2222-2222-2222-222222222222",
        "auto_disabled_reason": "Daily ticket creation limit exceeded",
        "fields": {
          "labels": [
            "security"
          ]
        },
        "max_tickets_per_day": 100,
        "project_id": "11111111-1111-1111-1111-111111111111",
        "target": "jira"
      },
      "created_at": 1722439510282,
      "created_by": {
        "id": "00000000-0000-0000-0000-000000000000",
        "name": "Jane Doe",
        "type": "user"
      },
      "enabled": true,
      "modified_at": 1722439510282,
      "modified_by": {
        "id": "00000000-0000-0000-0000-000000000000",
        "name": "Jane Doe",
        "type": "user"
      },
      "name": "Auto-create Jira tickets for critical findings",
      "rule": {
        "finding_types": [
          "misconfiguration"
        ],
        "query": "env:prod team:platform"
      }
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "ticket_creation_rules"
  }
}

Bad Request

API error response.

Expand All

Field

Type

Description

errors [required]

[object]

A list of errors.

detail

string

A human-readable explanation specific to this occurrence of the error.

meta

object

Non-standard meta-information about the error

source

object

References to the source of the error.

header

string

A string indicating the name of a single request header which caused the error.

parameter

string

A string indicating which URI query parameter caused the error.

pointer

string

A JSON pointer to the value in the request document that caused the error.

status

string

Status code of the response.

title

string

Short human-readable summary of the error.

{
  "errors": [
    {
      "detail": "Missing required attribute in body",
      "meta": {},
      "source": {
        "header": "Authorization",
        "parameter": "limit",
        "pointer": "/data/attributes/title"
      },
      "status": "400",
      "title": "Bad Request"
    }
  ]
}

Forbidden

API error response.

Expand All

Field

Type

Description

errors [required]

[string]

A list of errors.

{
  "errors": [
    "Bad Request"
  ]
}

Not Found

API error response.

Expand All

Field

Type

Description

errors [required]

[string]

A list of errors.

{
  "errors": [
    "Bad Request"
  ]
}

Unprocessable Entity

API error response.

Expand All

Field

Type

Description

errors [required]

[object]

A list of errors.

detail

string

A human-readable explanation specific to this occurrence of the error.

meta

object

Non-standard meta-information about the error

source

object

References to the source of the error.

header

string

A string indicating the name of a single request header which caused the error.

parameter

string

A string indicating which URI query parameter caused the error.

pointer

string

A JSON pointer to the value in the request document that caused the error.

status

string

Status code of the response.

title

string

Short human-readable summary of the error.

{
  "errors": [
    {
      "detail": "Missing required attribute in body",
      "meta": {},
      "source": {
        "header": "Authorization",
        "parameter": "limit",
        "pointer": "/data/attributes/title"
      },
      "status": "400",
      "title": "Bad Request"
    }
  ]
}

Too many requests

API error response.

Expand All

Field

Type

Description

errors [required]

[string]

A list of errors.

{
  "errors": [
    "Bad Request"
  ]
}

Code Example

                          ## default
# 

# Path parameters
export rule_id="00000000-0000-0000-0000-000000000000"
# Curl command
curl -X PUT "https://api.ap1.datadoghq.com"https://api.ap2.datadoghq.com"https://api.datadoghq.eu"https://api.ddog-gov.com"https://api.us2.ddog-gov.com"https://api.uk1.datadoghq.com"https://api.datadoghq.com"https://api.us3.datadoghq.com"https://api.us5.datadoghq.com/api/v2/security/findings/automation/ticket_creation_rules/${rule_id}" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "DD-API-KEY: ${DD_API_KEY}" \ -H "DD-APPLICATION-KEY: ${DD_APP_KEY}" \ -d @- << EOF { "data": { "attributes": { "action": { "max_tickets_per_day": 50, "project_id": "11111111-1111-1111-1111-111111111111", "target": "jira" }, "enabled": true, "name": "Auto-create Jira tickets for critical findings", "rule": { "finding_types": [ "misconfiguration" ], "query": "env:prod" } }, "type": "ticket_creation_rules" } } EOF
// Update a ticket creation rule returns "Successfully updated the ticket creation rule" response

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"os"

	"github.com/DataDog/datadog-api-client-go/v2/api/datadog"
	"github.com/DataDog/datadog-api-client-go/v2/api/datadogV2"
	"github.com/google/uuid"
)

func main() {
	// there is a valid "valid_ticket_creation_rule" in the system
	ValidTicketCreationRuleDataID := uuid.MustParse(os.Getenv("VALID_TICKET_CREATION_RULE_DATA_ID"))

	body := datadogV2.TicketCreationRuleUpdateRequest{
		Data: datadogV2.TicketCreationRuleDataCreate{
			Attributes: datadogV2.TicketCreationRuleAttributesCreate{
				Action: datadogV2.TicketCreationRuleAction{
					MaxTicketsPerDay: 5,
					ProjectId:        uuid.MustParse("11111111-1111-1111-1111-111111111111"),
					Target:           datadogV2.TICKETCREATIONTARGET_JIRA,
				},
				Enabled: datadog.PtrBool(false),
				Name:    "Example-Security-Monitoring",
				Rule: datadogV2.AutomationRuleScope{
					FindingTypes: []datadogV2.SecurityFindingType{
						datadogV2.SECURITYFINDINGTYPE_MISCONFIGURATION,
					},
					Query: datadog.PtrString("env:staging"),
				},
			},
			Type: datadogV2.TICKETCREATIONRULETYPE_TICKET_CREATION_RULES,
		},
	}
	ctx := datadog.NewDefaultContext(context.Background())
	configuration := datadog.NewConfiguration()
	configuration.SetUnstableOperationEnabled("v2.UpdateSecurityFindingsAutomationTicketCreationRule", true)
	apiClient := datadog.NewAPIClient(configuration)
	api := datadogV2.NewSecurityMonitoringApi(apiClient)
	resp, r, err := api.UpdateSecurityFindingsAutomationTicketCreationRule(ctx, ValidTicketCreationRuleDataID, body)

	if err != nil {
		fmt.Fprintf(os.Stderr, "Error when calling `SecurityMonitoringApi.UpdateSecurityFindingsAutomationTicketCreationRule`: %v\n", err)
		fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
	}

	responseContent, _ := json.MarshalIndent(resp, "", "  ")
	fmt.Fprintf(os.Stdout, "Response from `SecurityMonitoringApi.UpdateSecurityFindingsAutomationTicketCreationRule`:\n%s\n", responseContent)
}

Instructions

First install the library and its dependencies and then save the example to main.go and run following commands:

    
DD_SITE="datadoghq.comus3.datadoghq.comus5.datadoghq.comdatadoghq.euap1.datadoghq.comap2.datadoghq.comuk1.datadoghq.comddog-gov.comus2.ddog-gov.com" DD_API_KEY="<DD_API_KEY>" DD_APP_KEY="<DD_APP_KEY>" go run "main.go"
// Update a ticket creation rule returns "Successfully updated the ticket creation rule" response

import com.datadog.api.client.ApiClient;
import com.datadog.api.client.ApiException;
import com.datadog.api.client.v2.api.SecurityMonitoringApi;
import com.datadog.api.client.v2.model.AutomationRuleScope;
import com.datadog.api.client.v2.model.SecurityFindingType;
import com.datadog.api.client.v2.model.TicketCreationRuleAction;
import com.datadog.api.client.v2.model.TicketCreationRuleAttributesCreate;
import com.datadog.api.client.v2.model.TicketCreationRuleDataCreate;
import com.datadog.api.client.v2.model.TicketCreationRuleResponse;
import com.datadog.api.client.v2.model.TicketCreationRuleType;
import com.datadog.api.client.v2.model.TicketCreationRuleUpdateRequest;
import com.datadog.api.client.v2.model.TicketCreationTarget;
import java.util.Collections;
import java.util.UUID;

public class Example {
  public static void main(String[] args) {
    ApiClient defaultClient = ApiClient.getDefaultApiClient();
    defaultClient.setUnstableOperationEnabled(
        "v2.updateSecurityFindingsAutomationTicketCreationRule", true);
    SecurityMonitoringApi apiInstance = new SecurityMonitoringApi(defaultClient);

    // there is a valid "valid_ticket_creation_rule" in the system
    UUID VALID_TICKET_CREATION_RULE_DATA_ID = null;
    try {
      VALID_TICKET_CREATION_RULE_DATA_ID =
          UUID.fromString(System.getenv("VALID_TICKET_CREATION_RULE_DATA_ID"));
    } catch (IllegalArgumentException e) {
      System.err.println("Error parsing UUID: " + e.getMessage());
    }

    TicketCreationRuleUpdateRequest body =
        new TicketCreationRuleUpdateRequest()
            .data(
                new TicketCreationRuleDataCreate()
                    .attributes(
                        new TicketCreationRuleAttributesCreate()
                            .action(
                                new TicketCreationRuleAction()
                                    .maxTicketsPerDay(5L)
                                    .projectId(
                                        UUID.fromString("11111111-1111-1111-1111-111111111111"))
                                    .target(TicketCreationTarget.JIRA))
                            .enabled(false)
                            .name("Example-Security-Monitoring")
                            .rule(
                                new AutomationRuleScope()
                                    .findingTypes(
                                        Collections.singletonList(
                                            SecurityFindingType.MISCONFIGURATION))
                                    .query("env:staging")))
                    .type(TicketCreationRuleType.TICKET_CREATION_RULES));

    try {
      TicketCreationRuleResponse result =
          apiInstance.updateSecurityFindingsAutomationTicketCreationRule(
              VALID_TICKET_CREATION_RULE_DATA_ID, body);
      System.out.println(result);
    } catch (ApiException e) {
      System.err.println(
          "Exception when calling"
              + " SecurityMonitoringApi#updateSecurityFindingsAutomationTicketCreationRule");
      System.err.println("Status code: " + e.getCode());
      System.err.println("Reason: " + e.getResponseBody());
      System.err.println("Response headers: " + e.getResponseHeaders());
      e.printStackTrace();
    }
  }
}

Instructions

First install the library and its dependencies and then save the example to Example.java and run following commands:

    
DD_SITE="datadoghq.comus3.datadoghq.comus5.datadoghq.comdatadoghq.euap1.datadoghq.comap2.datadoghq.comuk1.datadoghq.comddog-gov.comus2.ddog-gov.com" DD_API_KEY="<DD_API_KEY>" DD_APP_KEY="<DD_APP_KEY>" java "Example.java"
"""
Update a ticket creation rule returns "Successfully updated the ticket creation rule" response
"""

from os import environ
from datadog_api_client import ApiClient, Configuration
from datadog_api_client.v2.api.security_monitoring_api import SecurityMonitoringApi
from datadog_api_client.v2.model.automation_rule_scope import AutomationRuleScope
from datadog_api_client.v2.model.security_finding_type import SecurityFindingType
from datadog_api_client.v2.model.ticket_creation_rule_action import TicketCreationRuleAction
from datadog_api_client.v2.model.ticket_creation_rule_attributes_create import TicketCreationRuleAttributesCreate
from datadog_api_client.v2.model.ticket_creation_rule_data_create import TicketCreationRuleDataCreate
from datadog_api_client.v2.model.ticket_creation_rule_type import TicketCreationRuleType
from datadog_api_client.v2.model.ticket_creation_rule_update_request import TicketCreationRuleUpdateRequest
from datadog_api_client.v2.model.ticket_creation_target import TicketCreationTarget
from uuid import UUID

# there is a valid "valid_ticket_creation_rule" in the system
VALID_TICKET_CREATION_RULE_DATA_ID = environ["VALID_TICKET_CREATION_RULE_DATA_ID"]

body = TicketCreationRuleUpdateRequest(
    data=TicketCreationRuleDataCreate(
        attributes=TicketCreationRuleAttributesCreate(
            action=TicketCreationRuleAction(
                max_tickets_per_day=5,
                project_id=UUID("11111111-1111-1111-1111-111111111111"),
                target=TicketCreationTarget.JIRA,
            ),
            enabled=False,
            name="Example-Security-Monitoring",
            rule=AutomationRuleScope(
                finding_types=[
                    SecurityFindingType.MISCONFIGURATION,
                ],
                query="env:staging",
            ),
        ),
        type=TicketCreationRuleType.TICKET_CREATION_RULES,
    ),
)

configuration = Configuration()
configuration.unstable_operations["update_security_findings_automation_ticket_creation_rule"] = True
with ApiClient(configuration) as api_client:
    api_instance = SecurityMonitoringApi(api_client)
    response = api_instance.update_security_findings_automation_ticket_creation_rule(
        rule_id=VALID_TICKET_CREATION_RULE_DATA_ID, body=body
    )

    print(response)

Instructions

First install the library and its dependencies and then save the example to example.py and run following commands:

    
DD_SITE="datadoghq.comus3.datadoghq.comus5.datadoghq.comdatadoghq.euap1.datadoghq.comap2.datadoghq.comuk1.datadoghq.comddog-gov.comus2.ddog-gov.com" DD_API_KEY="<DD_API_KEY>" DD_APP_KEY="<DD_APP_KEY>" python3 "example.py"
# Update a ticket creation rule returns "Successfully updated the ticket creation rule" response

require "datadog_api_client"
DatadogAPIClient.configure do |config|
  config.unstable_operations["v2.update_security_findings_automation_ticket_creation_rule".to_sym] = true
end
api_instance = DatadogAPIClient::V2::SecurityMonitoringAPI.new

# there is a valid "valid_ticket_creation_rule" in the system
VALID_TICKET_CREATION_RULE_DATA_ID = ENV["VALID_TICKET_CREATION_RULE_DATA_ID"]

body = DatadogAPIClient::V2::TicketCreationRuleUpdateRequest.new({
  data: DatadogAPIClient::V2::TicketCreationRuleDataCreate.new({
    attributes: DatadogAPIClient::V2::TicketCreationRuleAttributesCreate.new({
      action: DatadogAPIClient::V2::TicketCreationRuleAction.new({
        max_tickets_per_day: 5,
        project_id: "11111111-1111-1111-1111-111111111111",
        target: DatadogAPIClient::V2::TicketCreationTarget::JIRA,
      }),
      enabled: false,
      name: "Example-Security-Monitoring",
      rule: DatadogAPIClient::V2::AutomationRuleScope.new({
        finding_types: [
          DatadogAPIClient::V2::SecurityFindingType::MISCONFIGURATION,
        ],
        query: "env:staging",
      }),
    }),
    type: DatadogAPIClient::V2::TicketCreationRuleType::TICKET_CREATION_RULES,
  }),
})
p api_instance.update_security_findings_automation_ticket_creation_rule(VALID_TICKET_CREATION_RULE_DATA_ID, body)

Instructions

First install the library and its dependencies and then save the example to example.rb and run following commands:

    
DD_SITE="datadoghq.comus3.datadoghq.comus5.datadoghq.comdatadoghq.euap1.datadoghq.comap2.datadoghq.comuk1.datadoghq.comddog-gov.comus2.ddog-gov.com" DD_API_KEY="<DD_API_KEY>" DD_APP_KEY="<DD_APP_KEY>" rb "example.rb"
// Update a ticket creation rule returns "Successfully updated the ticket creation
// rule" response
use datadog_api_client::datadog;
use datadog_api_client::datadogV2::api_security_monitoring::SecurityMonitoringAPI;
use datadog_api_client::datadogV2::model::AutomationRuleScope;
use datadog_api_client::datadogV2::model::SecurityFindingType;
use datadog_api_client::datadogV2::model::TicketCreationRuleAction;
use datadog_api_client::datadogV2::model::TicketCreationRuleAttributesCreate;
use datadog_api_client::datadogV2::model::TicketCreationRuleDataCreate;
use datadog_api_client::datadogV2::model::TicketCreationRuleType;
use datadog_api_client::datadogV2::model::TicketCreationRuleUpdateRequest;
use datadog_api_client::datadogV2::model::TicketCreationTarget;
use uuid::Uuid;

#[tokio::main]
async fn main() {
    // there is a valid "valid_ticket_creation_rule" in the system
    let valid_ticket_creation_rule_data_id =
        uuid::Uuid::parse_str(&std::env::var("VALID_TICKET_CREATION_RULE_DATA_ID").unwrap())
            .expect("Invalid UUID");
    let body = TicketCreationRuleUpdateRequest::new(TicketCreationRuleDataCreate::new(
        TicketCreationRuleAttributesCreate::new(
            TicketCreationRuleAction::new(
                5,
                Uuid::parse_str("11111111-1111-1111-1111-111111111111").expect("invalid UUID"),
                TicketCreationTarget::JIRA,
            ),
            "Example-Security-Monitoring".to_string(),
            AutomationRuleScope::new(vec![SecurityFindingType::MISCONFIGURATION])
                .query("env:staging".to_string()),
        )
        .enabled(false),
        TicketCreationRuleType::TICKET_CREATION_RULES,
    ));
    let mut configuration = datadog::Configuration::new();
    configuration.set_unstable_operation_enabled(
        "v2.UpdateSecurityFindingsAutomationTicketCreationRule",
        true,
    );
    let api = SecurityMonitoringAPI::with_config(configuration);
    let resp = api
        .update_security_findings_automation_ticket_creation_rule(
            valid_ticket_creation_rule_data_id.clone(),
            body,
        )
        .await;
    if let Ok(value) = resp {
        println!("{:#?}", value);
    } else {
        println!("{:#?}", resp.unwrap_err());
    }
}

Instructions

First install the library and its dependencies and then save the example to src/main.rs and run following commands:

    
DD_SITE="datadoghq.comus3.datadoghq.comus5.datadoghq.comdatadoghq.euap1.datadoghq.comap2.datadoghq.comuk1.datadoghq.comddog-gov.comus2.ddog-gov.com" DD_API_KEY="<DD_API_KEY>" DD_APP_KEY="<DD_APP_KEY>" cargo run
/**
 * Update a ticket creation rule returns "Successfully updated the ticket creation rule" response
 */

import { client, v2 } from "@datadog/datadog-api-client";

const configuration = client.createConfiguration();
configuration.unstableOperations[
  "v2.updateSecurityFindingsAutomationTicketCreationRule"
] = true;
const apiInstance = new v2.SecurityMonitoringApi(configuration);

// there is a valid "valid_ticket_creation_rule" in the system
const VALID_TICKET_CREATION_RULE_DATA_ID = process.env
  .VALID_TICKET_CREATION_RULE_DATA_ID as string;

const params: v2.SecurityMonitoringApiUpdateSecurityFindingsAutomationTicketCreationRuleRequest =
  {
    body: {
      data: {
        attributes: {
          action: {
            maxTicketsPerDay: 5,
            projectId: "11111111-1111-1111-1111-111111111111",
            target: "jira",
          },
          enabled: false,
          name: "Example-Security-Monitoring",
          rule: {
            findingTypes: ["misconfiguration"],
            query: "env:staging",
          },
        },
        type: "ticket_creation_rules",
      },
    },
    ruleId: VALID_TICKET_CREATION_RULE_DATA_ID,
  };

apiInstance
  .updateSecurityFindingsAutomationTicketCreationRule(params)
  .then((data: v2.TicketCreationRuleResponse) => {
    console.log(
      "API called successfully. Returned data: " + JSON.stringify(data)
    );
  })
  .catch((error: any) => console.error(error));

Instructions

First install the library and its dependencies and then save the example to example.ts and run following commands:

    
DD_SITE="datadoghq.comus3.datadoghq.comus5.datadoghq.comdatadoghq.euap1.datadoghq.comap2.datadoghq.comuk1.datadoghq.comddog-gov.comus2.ddog-gov.com" DD_API_KEY="<DD_API_KEY>" DD_APP_KEY="<DD_APP_KEY>" tsc "example.ts"