diff --git a/config/_default/menus/api.en.yaml b/config/_default/menus/api.en.yaml index 416ae007782..39f5b90a7d5 100644 --- a/config/_default/menus/api.en.yaml +++ b/config/_default/menus/api.en.yaml @@ -10392,6 +10392,19 @@ menu: - ListBudgets unstable: [] order: 33 + - name: Delete a budget's custom forecast + url: /api/latest/cloud-cost-management/delete-a-budgets-custom-forecast/ + identifier: cloud-cost-management-delete-a-budgets-custom-forecast + parent: cloud-cost-management + generated: true + params: + versions: + - v2 + operationids: + - DeleteCustomForecast + unstable: + - v2 + order: 68 - name: Get budget url: /api/latest/cloud-cost-management/get-budget/ identifier: cloud-cost-management-get-budget @@ -10428,6 +10441,19 @@ menu: - ValidateBudget unstable: [] order: 35 + - name: Create or replace a budget's custom forecast + url: /api/latest/cloud-cost-management/create-or-replace-a-budgets-custom-forecast/ + identifier: cloud-cost-management-create-or-replace-a-budgets-custom-forecast + parent: cloud-cost-management + generated: true + params: + versions: + - v2 + operationids: + - UpsertCustomForecast + unstable: + - v2 + order: 67 - name: Validate CSV budget url: /api/latest/cloud-cost-management/validate-csv-budget/ identifier: cloud-cost-management-validate-csv-budget @@ -12549,6 +12575,49 @@ menu: - ListGoogleChatOrganizations unstable: [] order: 7 + - name: Governance Controls + url: /api/latest/governance-controls/ + identifier: governance-controls + generated: true + - name: Update a governance control + url: /api/latest/governance-controls/update-a-governance-control/ + identifier: governance-controls-update-a-governance-control + parent: governance-controls + generated: true + params: + versions: + - v2 + operationids: + - UpdateGovernanceControl + unstable: + - v2 + order: 4 + - name: Get a governance control + url: /api/latest/governance-controls/get-a-governance-control/ + identifier: governance-controls-get-a-governance-control + parent: governance-controls + generated: true + params: + versions: + - v2 + operationids: + - GetGovernanceControl + unstable: + - v2 + order: 3 + - name: List governance controls + url: /api/latest/governance-controls/list-governance-controls/ + identifier: governance-controls-list-governance-controls + parent: governance-controls + generated: true + params: + versions: + - v2 + operationids: + - ListGovernanceControls + unstable: + - v2 + order: 2 - name: Governance Insights url: /api/latest/governance-insights/ identifier: governance-insights diff --git a/config/_default/menus/main.en.yaml b/config/_default/menus/main.en.yaml index daca03a3e54..e6d8f0e54ed 100644 --- a/config/_default/menus/main.en.yaml +++ b/config/_default/menus/main.en.yaml @@ -9740,6 +9740,11 @@ menu: parent: product_analytics identifier: pa_data_collected weight: 6 + - name: Server-Side Events + url: product_analytics/data_collected/server_side_events + parent: pa_data_collected + identifier: pa_data_collected_server_side_events + weight: 601 - name: Experiments url: experiments/ pre: experiment-wui diff --git a/content/en/api/latest/cloud-cost-management/create-or-replace-a-budgets-custom-forecast/index.md b/content/en/api/latest/cloud-cost-management/create-or-replace-a-budgets-custom-forecast/index.md new file mode 100644 index 00000000000..bdfacba5759 --- /dev/null +++ b/content/en/api/latest/cloud-cost-management/create-or-replace-a-budgets-custom-forecast/index.md @@ -0,0 +1,3 @@ +--- +title: Create or replace a budget's custom forecast +--- diff --git a/content/en/api/latest/cloud-cost-management/delete-a-budgets-custom-forecast/index.md b/content/en/api/latest/cloud-cost-management/delete-a-budgets-custom-forecast/index.md new file mode 100644 index 00000000000..bd50b21fdbe --- /dev/null +++ b/content/en/api/latest/cloud-cost-management/delete-a-budgets-custom-forecast/index.md @@ -0,0 +1,3 @@ +--- +title: Delete a budget's custom forecast +--- diff --git a/content/en/api/latest/governance-controls/_index.md b/content/en/api/latest/governance-controls/_index.md new file mode 100644 index 00000000000..e5c63c2ae7a --- /dev/null +++ b/content/en/api/latest/governance-controls/_index.md @@ -0,0 +1,3 @@ +--- +title: Governance Controls +--- diff --git a/content/en/api/latest/governance-controls/get-a-governance-control/index.md b/content/en/api/latest/governance-controls/get-a-governance-control/index.md new file mode 100644 index 00000000000..fbcf0e1f47d --- /dev/null +++ b/content/en/api/latest/governance-controls/get-a-governance-control/index.md @@ -0,0 +1,3 @@ +--- +title: Get a governance control +--- diff --git a/content/en/api/latest/governance-controls/list-governance-controls/index.md b/content/en/api/latest/governance-controls/list-governance-controls/index.md new file mode 100644 index 00000000000..de4a84eabba --- /dev/null +++ b/content/en/api/latest/governance-controls/list-governance-controls/index.md @@ -0,0 +1,3 @@ +--- +title: List governance controls +--- diff --git a/content/en/api/latest/governance-controls/update-a-governance-control/index.md b/content/en/api/latest/governance-controls/update-a-governance-control/index.md new file mode 100644 index 00000000000..fe2cb26918a --- /dev/null +++ b/content/en/api/latest/governance-controls/update-a-governance-control/index.md @@ -0,0 +1,3 @@ +--- +title: Update a governance control +--- diff --git a/content/en/api/v2/cloud-cost-management/examples.json b/content/en/api/v2/cloud-cost-management/examples.json index 034ef9beab9..4c33a17067e 100644 --- a/content/en/api/v2/cloud-cost-management/examples.json +++ b/content/en/api/v2/cloud-cost-management/examples.json @@ -1562,12 +1562,35 @@ "json": { "data": { "attributes": { + "costs": { + "actual": "number", + "amount": "number", + "forecast": "number", + "ootb_forecast": "number" + }, + "costs_period_end": "integer", + "costs_period_start": "integer", + "costs_unit": { + "family": "string", + "id": "string", + "name": "string", + "plural": "string", + "scale_factor": "number", + "short_name": "string" + }, "created_at": 1738258683590, "created_by": "00000000-0a0a-0a0a-aaa0-00000000000a", "end_month": 202502, "entries": [ { "amount": "number", + "costs": { + "actual": "number", + "amount": "number", + "custom_forecast": "number", + "forecast": "number", + "ootb_forecast": "number" + }, "month": "integer", "tag_filters": [ { @@ -1589,7 +1612,7 @@ "type": "" } }, - "html": "
\n
\n
\n
\n

data

\n
\n

object

\n

A budget and all its entries.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a budget.

\n
\n
\n
\n
\n
\n

created_at

\n
\n

int64

\n

The timestamp when the budget was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n

end_month

\n
\n

int64

\n

The month when the budget ends.

\n
\n \n
\n
\n
\n
\n
\n

entries

\n
\n

[object]

\n

The list of monthly budget entries.

\n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

month

\n
\n

int64

\n

The month this budget entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters

\n
\n

[object]

\n

The list of tag filters that scope this budget entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

metrics_query

\n
\n

string

\n

The cost query used to track against the budget.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The name of the budget.

\n
\n \n
\n
\n
\n
\n
\n

org_id

\n
\n

int64

\n

The id of the org the budget belongs to.

\n
\n \n
\n
\n
\n
\n
\n

start_month

\n
\n

int64

\n

The month when the budget starts.

\n
\n \n
\n
\n
\n
\n
\n

total_amount

\n
\n

double

\n

The sum of all budget entries' amounts.

\n
\n \n
\n
\n
\n
\n
\n

updated_at

\n
\n

int64

\n

The timestamp when the budget was last updated.

\n
\n \n
\n
\n
\n
\n
\n

updated_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The BudgetWithEntriesData id.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

string

\n

The type of the object, must be budget.

\n
\n \n
\n
\n
\n
" + "html": "
\n
\n
\n
\n

data

\n
\n

object

\n

A budget and all its entries.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a budget.

\n
\n
\n
\n
\n
\n

costs

\n
\n

object

\n

Aggregated cost data for the budget. Present only when actual=true or forecast=true is requested.

\n
\n
\n
\n
\n
\n

actual

\n
\n

double

\n

The total actual cost. Present only when actual=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The total budgeted amount over the requested period.

\n
\n \n
\n
\n
\n
\n
\n

forecast

\n
\n

double

\n

The total forecast cost, with any custom forecast overrides applied. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

ootb_forecast

\n
\n

double

\n

The out-of-the-box ML forecast before custom overrides. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

costs_period_end

\n
\n

int64

\n

The end of the period used to compute cost data, in milliseconds since epoch.

\n
\n \n
\n
\n
\n
\n
\n

costs_period_start

\n
\n

int64

\n

The start of the period used to compute cost data, in milliseconds since epoch.

\n
\n \n
\n
\n
\n
\n
\n

costs_unit

\n
\n

object

\n

The unit used for all cost values in the response.

\n
\n
\n
\n
\n
\n

family

\n
\n

string

\n

The unit family (for example, currency).

\n
\n \n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The unique identifier for the unit.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The full name of the unit.

\n
\n \n
\n
\n
\n
\n
\n

plural

\n
\n

string

\n

The plural form of the unit name.

\n
\n \n
\n
\n
\n
\n
\n

scale_factor

\n
\n

double

\n

The scale factor applied to raw cost values.

\n
\n \n
\n
\n
\n
\n
\n

short_name

\n
\n

string

\n

The abbreviated unit name.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

created_at

\n
\n

int64

\n

The timestamp when the budget was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n

end_month

\n
\n

int64

\n

The month when the budget ends.

\n
\n \n
\n
\n
\n
\n
\n

entries

\n
\n

[object]

\n

The list of monthly budget entries.

\n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

costs

\n
\n

object

\n

Cost data for this entry. Present only when actual=true or forecast=true is requested.

\n
\n
\n
\n
\n
\n

actual

\n
\n

double

\n

The actual cost for this entry. Present only when actual=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

custom_forecast

\n
\n

double

\n

The custom forecast override for this entry. null when forecast=true is requested but no custom forecast has been set for this entry's month. A numeric value, including 0, indicates an explicit custom forecast override. Omitted when forecast=false or the feature is not available for the organization.

\n
\n \n
\n
\n
\n
\n
\n

forecast

\n
\n

double

\n

The final forecast for this entry, with any custom forecast override applied. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

ootb_forecast

\n
\n

double

\n

The out-of-the-box ML forecast for this entry, before custom overrides. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

month

\n
\n

int64

\n

The month this budget entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters

\n
\n

[object]

\n

The list of tag filters that scope this budget entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

metrics_query

\n
\n

string

\n

The cost query used to track against the budget.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The name of the budget.

\n
\n \n
\n
\n
\n
\n
\n

org_id

\n
\n

int64

\n

The id of the org the budget belongs to.

\n
\n \n
\n
\n
\n
\n
\n

start_month

\n
\n

int64

\n

The month when the budget starts.

\n
\n \n
\n
\n
\n
\n
\n

total_amount

\n
\n

double

\n

The sum of all budget entries' amounts.

\n
\n \n
\n
\n
\n
\n
\n

updated_at

\n
\n

int64

\n

The timestamp when the budget was last updated.

\n
\n \n
\n
\n
\n
\n
\n

updated_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The BudgetWithEntriesData id.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

string

\n

The type of the object, must be budget.

\n
\n \n
\n
\n
\n
" }, "400": { "json": { @@ -1621,12 +1644,35 @@ "json": { "data": { "attributes": { + "costs": { + "actual": "number", + "amount": "number", + "forecast": "number", + "ootb_forecast": "number" + }, + "costs_period_end": "integer", + "costs_period_start": "integer", + "costs_unit": { + "family": "string", + "id": "string", + "name": "string", + "plural": "string", + "scale_factor": "number", + "short_name": "string" + }, "created_at": 1738258683590, "created_by": "00000000-0a0a-0a0a-aaa0-00000000000a", "end_month": 202502, "entries": [ { "amount": "number", + "costs": { + "actual": "number", + "amount": "number", + "custom_forecast": "number", + "forecast": "number", + "ootb_forecast": "number" + }, "month": "integer", "tag_filters": [ { @@ -1648,7 +1694,7 @@ "type": "" } }, - "html": "
\n
\n
\n
\n

data

\n
\n

object

\n

A budget and all its entries.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a budget.

\n
\n
\n
\n
\n
\n

created_at

\n
\n

int64

\n

The timestamp when the budget was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n

end_month

\n
\n

int64

\n

The month when the budget ends.

\n
\n \n
\n
\n
\n
\n
\n

entries

\n
\n

[object]

\n

The list of monthly budget entries.

\n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

month

\n
\n

int64

\n

The month this budget entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters

\n
\n

[object]

\n

The list of tag filters that scope this budget entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

metrics_query

\n
\n

string

\n

The cost query used to track against the budget.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The name of the budget.

\n
\n \n
\n
\n
\n
\n
\n

org_id

\n
\n

int64

\n

The id of the org the budget belongs to.

\n
\n \n
\n
\n
\n
\n
\n

start_month

\n
\n

int64

\n

The month when the budget starts.

\n
\n \n
\n
\n
\n
\n
\n

total_amount

\n
\n

double

\n

The sum of all budget entries' amounts.

\n
\n \n
\n
\n
\n
\n
\n

updated_at

\n
\n

int64

\n

The timestamp when the budget was last updated.

\n
\n \n
\n
\n
\n
\n
\n

updated_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The BudgetWithEntriesData id.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

string

\n

The type of the object, must be budget.

\n
\n \n
\n
\n
\n
" + "html": "
\n
\n
\n
\n

data

\n
\n

object

\n

A budget and all its entries.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a budget.

\n
\n
\n
\n
\n
\n

costs

\n
\n

object

\n

Aggregated cost data for the budget. Present only when actual=true or forecast=true is requested.

\n
\n
\n
\n
\n
\n

actual

\n
\n

double

\n

The total actual cost. Present only when actual=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The total budgeted amount over the requested period.

\n
\n \n
\n
\n
\n
\n
\n

forecast

\n
\n

double

\n

The total forecast cost, with any custom forecast overrides applied. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

ootb_forecast

\n
\n

double

\n

The out-of-the-box ML forecast before custom overrides. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

costs_period_end

\n
\n

int64

\n

The end of the period used to compute cost data, in milliseconds since epoch.

\n
\n \n
\n
\n
\n
\n
\n

costs_period_start

\n
\n

int64

\n

The start of the period used to compute cost data, in milliseconds since epoch.

\n
\n \n
\n
\n
\n
\n
\n

costs_unit

\n
\n

object

\n

The unit used for all cost values in the response.

\n
\n
\n
\n
\n
\n

family

\n
\n

string

\n

The unit family (for example, currency).

\n
\n \n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The unique identifier for the unit.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The full name of the unit.

\n
\n \n
\n
\n
\n
\n
\n

plural

\n
\n

string

\n

The plural form of the unit name.

\n
\n \n
\n
\n
\n
\n
\n

scale_factor

\n
\n

double

\n

The scale factor applied to raw cost values.

\n
\n \n
\n
\n
\n
\n
\n

short_name

\n
\n

string

\n

The abbreviated unit name.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

created_at

\n
\n

int64

\n

The timestamp when the budget was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n

end_month

\n
\n

int64

\n

The month when the budget ends.

\n
\n \n
\n
\n
\n
\n
\n

entries

\n
\n

[object]

\n

The list of monthly budget entries.

\n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

costs

\n
\n

object

\n

Cost data for this entry. Present only when actual=true or forecast=true is requested.

\n
\n
\n
\n
\n
\n

actual

\n
\n

double

\n

The actual cost for this entry. Present only when actual=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

custom_forecast

\n
\n

double

\n

The custom forecast override for this entry. null when forecast=true is requested but no custom forecast has been set for this entry's month. A numeric value, including 0, indicates an explicit custom forecast override. Omitted when forecast=false or the feature is not available for the organization.

\n
\n \n
\n
\n
\n
\n
\n

forecast

\n
\n

double

\n

The final forecast for this entry, with any custom forecast override applied. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

ootb_forecast

\n
\n

double

\n

The out-of-the-box ML forecast for this entry, before custom overrides. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

month

\n
\n

int64

\n

The month this budget entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters

\n
\n

[object]

\n

The list of tag filters that scope this budget entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

metrics_query

\n
\n

string

\n

The cost query used to track against the budget.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The name of the budget.

\n
\n \n
\n
\n
\n
\n
\n

org_id

\n
\n

int64

\n

The id of the org the budget belongs to.

\n
\n \n
\n
\n
\n
\n
\n

start_month

\n
\n

int64

\n

The month when the budget starts.

\n
\n \n
\n
\n
\n
\n
\n

total_amount

\n
\n

double

\n

The sum of all budget entries' amounts.

\n
\n \n
\n
\n
\n
\n
\n

updated_at

\n
\n

int64

\n

The timestamp when the budget was last updated.

\n
\n \n
\n
\n
\n
\n
\n

updated_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The BudgetWithEntriesData id.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

string

\n

The type of the object, must be budget.

\n
\n \n
\n
\n
\n
" } }, "ValidateCsvBudget": { @@ -1683,6 +1729,106 @@ "html": "" } }, + "UpsertCustomForecast": { + "responses": { + "200": { + "json": { + "data": { + "attributes": { + "budget_uid": "00000000-0000-0000-0000-000000000001", + "created_at": 1738258683590, + "created_by": "00000000-0a0a-0a0a-aaa0-00000000000a", + "entries": [ + { + "amount": 400, + "month": 202501, + "tag_filters": [ + { + "tag_key": "service", + "tag_value": "ec2" + } + ] + } + ], + "updated_at": 1738258683590, + "updated_by": "00000000-0a0a-0a0a-aaa0-00000000000a" + }, + "id": "11111111-1111-1111-1111-111111111111", + "type": "custom_forecast" + } + }, + "html": "
\n
\n
\n
\n

data [required]

\n
\n

object

\n

Custom forecast resource wrapper in a response.

\n
\n
\n
\n
\n
\n

attributes [required]

\n
\n

object

\n

Attributes of a custom forecast.

\n
\n
\n
\n
\n
\n

budget_uid [required]

\n
\n

string

\n

The UUID of the budget that this custom forecast belongs to.

\n
\n \n
\n
\n
\n
\n
\n

created_at [required]

\n
\n

int64

\n

Timestamp the custom forecast was created, in Unix milliseconds.

\n
\n \n
\n
\n
\n
\n
\n

created_by [required]

\n
\n

string

\n

The id of the user that created the custom forecast.

\n
\n \n
\n
\n
\n
\n
\n

entries [required]

\n
\n

[object]

\n

Monthly custom forecast entries.

\n
\n
\n
\n
\n
\n

amount [required]

\n
\n

double

\n

Forecast amount for the month.

\n
\n \n
\n
\n
\n
\n
\n

month [required]

\n
\n

int64

\n

Month the custom forecast entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters [required]

\n
\n

[object]

\n

Tag filters that scope this custom forecast entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key [required]

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value [required]

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

updated_at [required]

\n
\n

int64

\n

Timestamp the custom forecast was last updated, in Unix milliseconds.

\n
\n \n
\n
\n
\n
\n
\n

updated_by [required]

\n
\n

string

\n

The id of the user that last updated the custom forecast.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id [required]

\n
\n

string

\n

The unique identifier of the custom forecast.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

enum

\n

The type of the custom forecast resource. Must be custom_forecast. \nAllowed enum values: custom_forecast

default: custom_forecast

\n
\n \n
\n
\n
\n
" + }, + "400": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" + }, + "404": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" + }, + "429": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" + } + }, + "request": { + "json_curl": { + "data": { + "attributes": { + "budget_uid": "00000000-0000-0000-0000-000000000001", + "entries": [ + { + "amount": 400, + "month": 202501, + "tag_filters": [ + { + "tag_key": "service", + "tag_value": "ec2" + } + ] + } + ] + }, + "type": "custom_forecast" + } + }, + "json": { + "data": { + "attributes": { + "budget_uid": "00000000-0000-0000-0000-000000000001", + "entries": [ + { + "amount": 400, + "month": 202501, + "tag_filters": [ + { + "tag_key": "service", + "tag_value": "ec2" + } + ] + } + ] + }, + "id": "", + "type": "custom_forecast" + } + }, + "html": "
\n
\n
\n
\n

data [required]

\n
\n

object

\n

Custom forecast resource wrapper in an upsert request.

\n
\n
\n
\n
\n
\n

attributes [required]

\n
\n

object

\n

Attributes of a custom forecast upsert request.

\n
\n
\n
\n
\n
\n

budget_uid [required]

\n
\n

string

\n

The UUID of the budget that this custom forecast belongs to.

\n
\n \n
\n
\n
\n
\n
\n

entries [required]

\n
\n

[object]

\n

Monthly custom forecast entries. An empty list deletes any existing\ncustom forecast for the budget.

\n
\n
\n
\n
\n
\n

amount [required]

\n
\n

double

\n

Forecast amount for the month.

\n
\n \n
\n
\n
\n
\n
\n

month [required]

\n
\n

int64

\n

Month the custom forecast entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters [required]

\n
\n

[object]

\n

Tag filters that scope this custom forecast entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key [required]

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value [required]

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

Unused on upsert; the resource is keyed by budget_uid. Send an empty string.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

enum

\n

The type of the custom forecast resource. Must be custom_forecast. \nAllowed enum values: custom_forecast

default: custom_forecast

\n
\n \n
\n
\n
\n
" + } + }, "ValidateBudget": { "responses": { "200": { @@ -1722,6 +1868,13 @@ "entries": [ { "amount": "number", + "costs": { + "actual": "number", + "amount": "number", + "custom_forecast": "number", + "forecast": "number", + "ootb_forecast": "number" + }, "month": "integer", "tag_filters": [ { @@ -1743,7 +1896,7 @@ "type": "budget" } }, - "html": "
\n
\n
\n
\n

data

\n
\n

object

\n

The data object for a budget validation request, containing the resource type, ID, and budget attributes to validate.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a budget including all its monthly entries.

\n
\n
\n
\n
\n
\n

created_at

\n
\n

int64

\n

The timestamp when the budget was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by

\n
\n

string

\n

The ID of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n

end_month

\n
\n

int64

\n

The month when the budget ends, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

entries

\n
\n

[object]

\n

The list of monthly budget entries.

\n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

month

\n
\n

int64

\n

The month this budget entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters

\n
\n

[object]

\n

The list of tag filters that scope this budget entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

metrics_query

\n
\n

string

\n

The cost query used to track spending against the budget.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The name of the budget.

\n
\n \n
\n
\n
\n
\n
\n

org_id

\n
\n

int64

\n

The ID of the organization the budget belongs to.

\n
\n \n
\n
\n
\n
\n
\n

start_month

\n
\n

int64

\n

The month when the budget starts, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

total_amount

\n
\n

double

\n

The total budget amount across all entries.

\n
\n \n
\n
\n
\n
\n
\n

updated_at

\n
\n

int64

\n

The timestamp when the budget was last updated.

\n
\n \n
\n
\n
\n
\n
\n

updated_by

\n
\n

string

\n

The ID of the user that last updated the budget.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The unique identifier of the budget to validate.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

enum

\n

Budget resource type. \nAllowed enum values: budget

default: budget

\n
\n \n
\n
\n
\n
" + "html": "
\n
\n
\n
\n

data

\n
\n

object

\n

The data object for a budget validation request, containing the resource type, ID, and budget attributes to validate.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a budget including all its monthly entries.

\n
\n
\n
\n
\n
\n

created_at

\n
\n

int64

\n

The timestamp when the budget was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by

\n
\n

string

\n

The ID of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n

end_month

\n
\n

int64

\n

The month when the budget ends, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

entries

\n
\n

[object]

\n

The list of monthly budget entries.

\n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

costs

\n
\n

object

\n

Cost data for this entry. Present only when actual=true or forecast=true is requested.

\n
\n
\n
\n
\n
\n

actual

\n
\n

double

\n

The actual cost for this entry. Present only when actual=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

custom_forecast

\n
\n

double

\n

The custom forecast override for this entry. null when forecast=true is requested but no custom forecast has been set for this entry's month. A numeric value, including 0, indicates an explicit custom forecast override. Omitted when forecast=false or the feature is not available for the organization.

\n
\n \n
\n
\n
\n
\n
\n

forecast

\n
\n

double

\n

The final forecast for this entry, with any custom forecast override applied. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

ootb_forecast

\n
\n

double

\n

The out-of-the-box ML forecast for this entry, before custom overrides. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

month

\n
\n

int64

\n

The month this budget entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters

\n
\n

[object]

\n

The list of tag filters that scope this budget entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

metrics_query

\n
\n

string

\n

The cost query used to track spending against the budget.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The name of the budget.

\n
\n \n
\n
\n
\n
\n
\n

org_id

\n
\n

int64

\n

The ID of the organization the budget belongs to.

\n
\n \n
\n
\n
\n
\n
\n

start_month

\n
\n

int64

\n

The month when the budget starts, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

total_amount

\n
\n

double

\n

The total budget amount across all entries.

\n
\n \n
\n
\n
\n
\n
\n

updated_at

\n
\n

int64

\n

The timestamp when the budget was last updated.

\n
\n \n
\n
\n
\n
\n
\n

updated_by

\n
\n

string

\n

The ID of the user that last updated the budget.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The unique identifier of the budget to validate.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

enum

\n

Budget resource type. \nAllowed enum values: budget

default: budget

\n
\n \n
\n
\n
\n
" } }, "DeleteBudget": { @@ -1769,12 +1922,35 @@ "json": { "data": { "attributes": { + "costs": { + "actual": "number", + "amount": "number", + "forecast": "number", + "ootb_forecast": "number" + }, + "costs_period_end": "integer", + "costs_period_start": "integer", + "costs_unit": { + "family": "string", + "id": "string", + "name": "string", + "plural": "string", + "scale_factor": "number", + "short_name": "string" + }, "created_at": 1738258683590, "created_by": "00000000-0a0a-0a0a-aaa0-00000000000a", "end_month": 202502, "entries": [ { "amount": "number", + "costs": { + "actual": "number", + "amount": "number", + "custom_forecast": "number", + "forecast": "number", + "ootb_forecast": "number" + }, "month": "integer", "tag_filters": [ { @@ -1796,7 +1972,56 @@ "type": "" } }, - "html": "
\n
\n
\n
\n

data

\n
\n

object

\n

A budget and all its entries.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a budget.

\n
\n
\n
\n
\n
\n

created_at

\n
\n

int64

\n

The timestamp when the budget was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n

end_month

\n
\n

int64

\n

The month when the budget ends.

\n
\n \n
\n
\n
\n
\n
\n

entries

\n
\n

[object]

\n

The list of monthly budget entries.

\n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

month

\n
\n

int64

\n

The month this budget entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters

\n
\n

[object]

\n

The list of tag filters that scope this budget entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

metrics_query

\n
\n

string

\n

The cost query used to track against the budget.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The name of the budget.

\n
\n \n
\n
\n
\n
\n
\n

org_id

\n
\n

int64

\n

The id of the org the budget belongs to.

\n
\n \n
\n
\n
\n
\n
\n

start_month

\n
\n

int64

\n

The month when the budget starts.

\n
\n \n
\n
\n
\n
\n
\n

total_amount

\n
\n

double

\n

The sum of all budget entries' amounts.

\n
\n \n
\n
\n
\n
\n
\n

updated_at

\n
\n

int64

\n

The timestamp when the budget was last updated.

\n
\n \n
\n
\n
\n
\n
\n

updated_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The BudgetWithEntriesData id.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

string

\n

The type of the object, must be budget.

\n
\n \n
\n
\n
\n
" + "html": "
\n
\n
\n
\n

data

\n
\n

object

\n

A budget and all its entries.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a budget.

\n
\n
\n
\n
\n
\n

costs

\n
\n

object

\n

Aggregated cost data for the budget. Present only when actual=true or forecast=true is requested.

\n
\n
\n
\n
\n
\n

actual

\n
\n

double

\n

The total actual cost. Present only when actual=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The total budgeted amount over the requested period.

\n
\n \n
\n
\n
\n
\n
\n

forecast

\n
\n

double

\n

The total forecast cost, with any custom forecast overrides applied. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

ootb_forecast

\n
\n

double

\n

The out-of-the-box ML forecast before custom overrides. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

costs_period_end

\n
\n

int64

\n

The end of the period used to compute cost data, in milliseconds since epoch.

\n
\n \n
\n
\n
\n
\n
\n

costs_period_start

\n
\n

int64

\n

The start of the period used to compute cost data, in milliseconds since epoch.

\n
\n \n
\n
\n
\n
\n
\n

costs_unit

\n
\n

object

\n

The unit used for all cost values in the response.

\n
\n
\n
\n
\n
\n

family

\n
\n

string

\n

The unit family (for example, currency).

\n
\n \n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The unique identifier for the unit.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The full name of the unit.

\n
\n \n
\n
\n
\n
\n
\n

plural

\n
\n

string

\n

The plural form of the unit name.

\n
\n \n
\n
\n
\n
\n
\n

scale_factor

\n
\n

double

\n

The scale factor applied to raw cost values.

\n
\n \n
\n
\n
\n
\n
\n

short_name

\n
\n

string

\n

The abbreviated unit name.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

created_at

\n
\n

int64

\n

The timestamp when the budget was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n

end_month

\n
\n

int64

\n

The month when the budget ends.

\n
\n \n
\n
\n
\n
\n
\n

entries

\n
\n

[object]

\n

The list of monthly budget entries.

\n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

costs

\n
\n

object

\n

Cost data for this entry. Present only when actual=true or forecast=true is requested.

\n
\n
\n
\n
\n
\n

actual

\n
\n

double

\n

The actual cost for this entry. Present only when actual=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

custom_forecast

\n
\n

double

\n

The custom forecast override for this entry. null when forecast=true is requested but no custom forecast has been set for this entry's month. A numeric value, including 0, indicates an explicit custom forecast override. Omitted when forecast=false or the feature is not available for the organization.

\n
\n \n
\n
\n
\n
\n
\n

forecast

\n
\n

double

\n

The final forecast for this entry, with any custom forecast override applied. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

ootb_forecast

\n
\n

double

\n

The out-of-the-box ML forecast for this entry, before custom overrides. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

month

\n
\n

int64

\n

The month this budget entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters

\n
\n

[object]

\n

The list of tag filters that scope this budget entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

metrics_query

\n
\n

string

\n

The cost query used to track against the budget.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The name of the budget.

\n
\n \n
\n
\n
\n
\n
\n

org_id

\n
\n

int64

\n

The id of the org the budget belongs to.

\n
\n \n
\n
\n
\n
\n
\n

start_month

\n
\n

int64

\n

The month when the budget starts.

\n
\n \n
\n
\n
\n
\n
\n

total_amount

\n
\n

double

\n

The sum of all budget entries' amounts.

\n
\n \n
\n
\n
\n
\n
\n

updated_at

\n
\n

int64

\n

The timestamp when the budget was last updated.

\n
\n \n
\n
\n
\n
\n
\n

updated_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The BudgetWithEntriesData id.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

string

\n

The type of the object, must be budget.

\n
\n \n
\n
\n
\n
" + }, + "400": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" + }, + "404": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" + }, + "429": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" + } + }, + "request": { + "json_curl": {}, + "json": {}, + "html": "" + } + }, + "DeleteCustomForecast": { + "responses": { + "400": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" + }, + "404": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" }, "429": { "json": { @@ -1836,7 +2061,7 @@ } ] }, - "html": "
\n
\n
\n
\n

data [required]

\n
\n

[object]

\n

The BudgetArray data.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a budget.

\n
\n
\n
\n
\n
\n

created_at

\n
\n

int64

\n

The timestamp when the budget was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n

end_month

\n
\n

int64

\n

The month when the budget ends.

\n
\n \n
\n
\n
\n
\n
\n

entries

\n
\n

[object]

\n

The list of monthly budget entries.

\n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

month

\n
\n

int64

\n

The month this budget entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters

\n
\n

[object]

\n

The list of tag filters that scope this budget entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

metrics_query

\n
\n

string

\n

The cost query used to track against the budget.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The name of the budget.

\n
\n \n
\n
\n
\n
\n
\n

org_id

\n
\n

int64

\n

The id of the org the budget belongs to.

\n
\n \n
\n
\n
\n
\n
\n

start_month

\n
\n

int64

\n

The month when the budget starts.

\n
\n \n
\n
\n
\n
\n
\n

total_amount

\n
\n

double

\n

The sum of all budget entries' amounts.

\n
\n \n
\n
\n
\n
\n
\n

updated_at

\n
\n

int64

\n

The timestamp when the budget was last updated.

\n
\n \n
\n
\n
\n
\n
\n

updated_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The id of the budget.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the object, must be budget.

\n
\n \n
\n
\n
\n
" + "html": "
\n
\n
\n
\n

data [required]

\n
\n

[object]

\n

The BudgetArray data.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a budget.

\n
\n
\n
\n
\n
\n

costs

\n
\n

object

\n

Aggregated cost data for the budget. Present only when actual=true or forecast=true is requested.

\n
\n
\n
\n
\n
\n

actual

\n
\n

double

\n

The total actual cost. Present only when actual=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The total budgeted amount over the requested period.

\n
\n \n
\n
\n
\n
\n
\n

forecast

\n
\n

double

\n

The total forecast cost, with any custom forecast overrides applied. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

ootb_forecast

\n
\n

double

\n

The out-of-the-box ML forecast before custom overrides. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

costs_period_end

\n
\n

int64

\n

The end of the period used to compute cost data, in milliseconds since epoch.

\n
\n \n
\n
\n
\n
\n
\n

costs_period_start

\n
\n

int64

\n

The start of the period used to compute cost data, in milliseconds since epoch.

\n
\n \n
\n
\n
\n
\n
\n

costs_unit

\n
\n

object

\n

The unit used for all cost values in the response.

\n
\n
\n
\n
\n
\n

family

\n
\n

string

\n

The unit family (for example, currency).

\n
\n \n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The unique identifier for the unit.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The full name of the unit.

\n
\n \n
\n
\n
\n
\n
\n

plural

\n
\n

string

\n

The plural form of the unit name.

\n
\n \n
\n
\n
\n
\n
\n

scale_factor

\n
\n

double

\n

The scale factor applied to raw cost values.

\n
\n \n
\n
\n
\n
\n
\n

short_name

\n
\n

string

\n

The abbreviated unit name.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

created_at

\n
\n

int64

\n

The timestamp when the budget was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n

end_month

\n
\n

int64

\n

The month when the budget ends.

\n
\n \n
\n
\n
\n
\n
\n

entries

\n
\n

[object]

\n

The list of monthly budget entries.

\n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

costs

\n
\n

object

\n

Cost data for this entry. Present only when actual=true or forecast=true is requested.

\n
\n
\n
\n
\n
\n

actual

\n
\n

double

\n

The actual cost for this entry. Present only when actual=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

amount

\n
\n

double

\n

The budgeted amount for this entry.

\n
\n \n
\n
\n
\n
\n
\n

custom_forecast

\n
\n

double

\n

The custom forecast override for this entry. null when forecast=true is requested but no custom forecast has been set for this entry's month. A numeric value, including 0, indicates an explicit custom forecast override. Omitted when forecast=false or the feature is not available for the organization.

\n
\n \n
\n
\n
\n
\n
\n

forecast

\n
\n

double

\n

The final forecast for this entry, with any custom forecast override applied. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n

ootb_forecast

\n
\n

double

\n

The out-of-the-box ML forecast for this entry, before custom overrides. Present only when forecast=true is requested.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

month

\n
\n

int64

\n

The month this budget entry applies to, in YYYYMM format.

\n
\n \n
\n
\n
\n
\n
\n

tag_filters

\n
\n

[object]

\n

The list of tag filters that scope this budget entry to specific resources.

\n
\n
\n
\n
\n
\n

tag_key

\n
\n

string

\n

The tag key to filter on.

\n
\n \n
\n
\n
\n
\n
\n

tag_value

\n
\n

string

\n

The tag value to filter on.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

metrics_query

\n
\n

string

\n

The cost query used to track against the budget.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

The name of the budget.

\n
\n \n
\n
\n
\n
\n
\n

org_id

\n
\n

int64

\n

The id of the org the budget belongs to.

\n
\n \n
\n
\n
\n
\n
\n

start_month

\n
\n

int64

\n

The month when the budget starts.

\n
\n \n
\n
\n
\n
\n
\n

total_amount

\n
\n

double

\n

The sum of all budget entries' amounts.

\n
\n \n
\n
\n
\n
\n
\n

updated_at

\n
\n

int64

\n

The timestamp when the budget was last updated.

\n
\n \n
\n
\n
\n
\n
\n

updated_by

\n
\n

string

\n

The id of the user that created the budget.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The id of the budget.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the object, must be budget.

\n
\n \n
\n
\n
\n
" }, "429": { "json": { diff --git a/content/en/api/v2/governance-controls/_index.md b/content/en/api/v2/governance-controls/_index.md new file mode 100644 index 00000000000..632371199e2 --- /dev/null +++ b/content/en/api/v2/governance-controls/_index.md @@ -0,0 +1,4 @@ +--- +title: Governance Controls +headless: true +--- diff --git a/content/en/api/v2/governance-controls/examples.json b/content/en/api/v2/governance-controls/examples.json new file mode 100644 index 00000000000..0d087862ad8 --- /dev/null +++ b/content/en/api/v2/governance-controls/examples.json @@ -0,0 +1,614 @@ +{ + "ListGovernanceControls": { + "responses": { + "200": { + "json": { + "data": [ + { + "attributes": { + "active_detections_count": 12, + "category": "security", + "created_at": "2024-01-15T09:30:00Z", + "created_by": "11111111-2222-3333-4444-555555555555", + "description": "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials.", + "detection_frequency": "daily", + "detection_parameters": {}, + "detection_type": "unused_api_keys", + "feature_flags": [ + [] + ], + "insights": [ + [] + ], + "last_detection_at": "2024-03-01T12:00:00Z", + "mitigated_detections_count": 3, + "mitigation_parameters": {}, + "mitigation_type": "revoke_api_key", + "mitigations": [ + { + "action_verb": "revoke", + "description": "Automatically identifies and revokes inactive API keys to improve security and reduce potential attack surface.", + "execution_modes": [ + "manual", + "automatic" + ], + "feature_flags": [ + [] + ], + "id": "revoke_api_key", + "manual_mitigation_warning": "These API keys will be revoked immediately upon confirmation. To revoke future API keys, you must go through this flow again.", + "permissions": [ + "api_keys_write", + "api_keys_delete" + ], + "requires_ai": false, + "supported_parameters": [ + { + "default_value": 30, + "description": "Number of days of inactivity before an API key is considered unused.", + "display_name": "Unused API Key Threshold", + "hidden": false, + "name": "api_key_threshold", + "required": false, + "supported_values": [ + { + "label": "30 days", + "value": "thirty" + } + ], + "type": "integer" + } + ], + "title": "Revoke Unused API Keys" + } + ], + "name": "Unused API Keys", + "next_steps": "Review and revoke API keys that are no longer in use to maintain a secure authentication posture.", + "notification_frequency": "", + "notification_parameters": {}, + "notification_type": "", + "priority": "High", + "product": "api_keys", + "release_status": "prod", + "resource_type": "api_key", + "resource_type_display_name": "API Key", + "supported_detection_parameters": [ + { + "default_value": 30, + "description": "Number of days of inactivity before an API key is considered unused.", + "display_name": "Unused API Key Threshold", + "hidden": false, + "name": "api_key_threshold", + "required": false, + "supported_values": [ + { + "label": "30 days", + "value": "thirty" + } + ], + "type": "integer" + } + ], + "supported_notification_parameters": [ + { + "default_value": 30, + "description": "Number of days of inactivity before an API key is considered unused.", + "display_name": "Unused API Key Threshold", + "hidden": false, + "name": "api_key_threshold", + "required": false, + "supported_values": [ + { + "label": "30 days", + "value": "thirty" + } + ], + "type": "integer" + } + ], + "task": "Review and revoke unused API keys.", + "type": "Proactive", + "usage_concern": "Security" + }, + "id": "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a", + "type": "governance_control" + } + ] + }, + "html": "
\n
\n
\n
\n

data [required]

\n
\n

[object]

\n

An array of governance control resources.

\n
\n
\n
\n
\n
\n

attributes [required]

\n
\n

object

\n

The attributes of a governance control.

\n
\n
\n
\n
\n
\n

active_detections_count [required]

\n
\n

int64

\n

The number of active detections for the control.

\n
\n \n
\n
\n
\n
\n
\n

category [required]

\n
\n

string

\n

The value driver the control is grouped under, such as security or cost.

\n
\n \n
\n
\n
\n
\n
\n

created_at [required]

\n
\n

date-time

\n

The time the control configuration was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by [required]

\n
\n

string

\n

The UUID of the user who created the control configuration.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of what the control detects.

\n
\n \n
\n
\n
\n
\n
\n

detection_frequency [required]

\n
\n

string

\n

How often detections are evaluated for the control.

\n
\n \n
\n
\n
\n
\n
\n

detection_parameters [required]

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

detection_type [required]

\n
\n

string

\n

The detection type that uniquely identifies the control.

\n
\n \n
\n
\n
\n
\n
\n

feature_flags [required]

\n
\n

[string]

\n

The feature flags that gate the control.

\n
\n \n
\n
\n
\n
\n
\n

insights [required]

\n
\n

[string]

\n

The insight slugs associated with the control.

\n
\n \n
\n
\n
\n
\n
\n

last_detection_at [required]

\n
\n

date-time

\n

The time of the most recent detection for the control. null when there are no detections.

\n
\n \n
\n
\n
\n
\n
\n

mitigated_detections_count [required]

\n
\n

int64

\n

The number of mitigated detections for the control.

\n
\n \n
\n
\n
\n
\n
\n

mitigation_parameters [required]

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

mitigation_type [required]

\n
\n

string

\n

The configured mitigation type for the control. Empty when not configured.

\n
\n \n
\n
\n
\n
\n
\n

mitigations [required]

\n
\n

[object]

\n

The mitigations available for a control.

\n
\n
\n
\n
\n
\n

action_verb [required]

\n
\n

string

\n

The verb describing the mitigation action, such as revoke or delete.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

execution_modes

\n
\n

[string]

\n

The execution modes the mitigation supports, such as manual or automatic.

\n
\n \n
\n
\n
\n
\n
\n

feature_flags [required]

\n
\n

[string]

\n

The feature flags that gate the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

id [required]

\n
\n

string

\n

The unique identifier of the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

manual_mitigation_warning [required]

\n
\n

string

\n

A warning shown to the user before applying the mitigation manually.

\n
\n \n
\n
\n
\n
\n
\n

permissions [required]

\n
\n

[string]

\n

The permissions required to apply the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

requires_ai [required]

\n
\n

boolean

\n

Whether the mitigation requires AI to be enabled.

\n
\n \n
\n
\n
\n
\n
\n

supported_parameters [required]

\n
\n

[object]

\n

An array of parameter definitions.

\n
\n
\n
\n
\n
\n

default_value [required]

\n
\n

\n

The default value of the parameter. The JSON type depends on the parameter's type.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

display_name [required]

\n
\n

string

\n

The human-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

hidden [required]

\n
\n

boolean

\n

Whether the parameter is hidden from the UI.

\n
\n \n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

The machine-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

required [required]

\n
\n

boolean

\n

Whether the parameter must be provided.

\n
\n \n
\n
\n
\n
\n
\n

supported_values [required]

\n
\n

[object]

\n

The supported values for an enumerated parameter.

\n
\n
\n
\n
\n
\n

label [required]

\n
\n

string

\n

The human-readable label for the value.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

The machine-readable value.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the parameter, such as integer, string, boolean, enum, or pattern_list.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

title [required]

\n
\n

string

\n

A short, human-readable name for the mitigation.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

Human-readable name of the control.

\n
\n \n
\n
\n
\n
\n
\n

next_steps [required]

\n
\n

string

\n

Guidance on the next steps to remediate detections for the control.

\n
\n \n
\n
\n
\n
\n
\n

notification_frequency [required]

\n
\n

string

\n

The configured notification frequency for the control. Empty when not configured.

\n
\n \n
\n
\n
\n
\n
\n

notification_parameters [required]

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

notification_type [required]

\n
\n

string

\n

The configured notification type for the control. Empty when not configured.

\n
\n \n
\n
\n
\n
\n
\n

priority [required]

\n
\n

string

\n

The priority of the control, such as High.

\n
\n \n
\n
\n
\n
\n
\n

product [required]

\n
\n

string

\n

The product the control belongs to.

\n
\n \n
\n
\n
\n
\n
\n

release_status [required]

\n
\n

string

\n

The release status of the control, such as prod or beta.

\n
\n \n
\n
\n
\n
\n
\n

resource_type [required]

\n
\n

string

\n

The type of resource the control evaluates.

\n
\n \n
\n
\n
\n
\n
\n

resource_type_display_name [required]

\n
\n

string

\n

The human-readable name of the resource type.

\n
\n \n
\n
\n
\n
\n
\n

supported_detection_parameters [required]

\n
\n

[object]

\n

An array of parameter definitions.

\n
\n
\n
\n
\n
\n

default_value [required]

\n
\n

\n

The default value of the parameter. The JSON type depends on the parameter's type.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

display_name [required]

\n
\n

string

\n

The human-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

hidden [required]

\n
\n

boolean

\n

Whether the parameter is hidden from the UI.

\n
\n \n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

The machine-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

required [required]

\n
\n

boolean

\n

Whether the parameter must be provided.

\n
\n \n
\n
\n
\n
\n
\n

supported_values [required]

\n
\n

[object]

\n

The supported values for an enumerated parameter.

\n
\n
\n
\n
\n
\n

label [required]

\n
\n

string

\n

The human-readable label for the value.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

The machine-readable value.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the parameter, such as integer, string, boolean, enum, or pattern_list.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

supported_notification_parameters [required]

\n
\n

[object]

\n

An array of parameter definitions.

\n
\n
\n
\n
\n
\n

default_value [required]

\n
\n

\n

The default value of the parameter. The JSON type depends on the parameter's type.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

display_name [required]

\n
\n

string

\n

The human-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

hidden [required]

\n
\n

boolean

\n

Whether the parameter is hidden from the UI.

\n
\n \n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

The machine-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

required [required]

\n
\n

boolean

\n

Whether the parameter must be provided.

\n
\n \n
\n
\n
\n
\n
\n

supported_values [required]

\n
\n

[object]

\n

The supported values for an enumerated parameter.

\n
\n
\n
\n
\n
\n

label [required]

\n
\n

string

\n

The human-readable label for the value.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

The machine-readable value.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the parameter, such as integer, string, boolean, enum, or pattern_list.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

task [required]

\n
\n

string

\n

A short description of the remediation task for the control.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The control type, such as Proactive or Detection.

\n
\n \n
\n
\n
\n
\n
\n

usage_concern [required]

\n
\n

string

\n

The usage concern the control addresses, such as Security or Cost Optimization.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id [required]

\n
\n

string

\n

The unique identifier of the control.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

enum

\n

JSON:API resource type for a governance control. \nAllowed enum values: governance_control

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

\n
\n \n
\n
\n
\n
" + }, + "429": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" + } + }, + "request": { + "json_curl": {}, + "json": {}, + "html": "" + } + }, + "GetGovernanceControl": { + "responses": { + "200": { + "json": { + "data": { + "attributes": { + "active_detections_count": 12, + "category": "security", + "created_at": "2024-01-15T09:30:00Z", + "created_by": "11111111-2222-3333-4444-555555555555", + "description": "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials.", + "detection_frequency": "daily", + "detection_parameters": {}, + "detection_type": "unused_api_keys", + "feature_flags": [ + [] + ], + "insights": [ + [] + ], + "last_detection_at": "2024-03-01T12:00:00Z", + "mitigated_detections_count": 3, + "mitigation_parameters": {}, + "mitigation_type": "revoke_api_key", + "mitigations": [ + { + "action_verb": "revoke", + "description": "Automatically identifies and revokes inactive API keys to improve security and reduce potential attack surface.", + "execution_modes": [ + "manual", + "automatic" + ], + "feature_flags": [ + [] + ], + "id": "revoke_api_key", + "manual_mitigation_warning": "These API keys will be revoked immediately upon confirmation. To revoke future API keys, you must go through this flow again.", + "permissions": [ + "api_keys_write", + "api_keys_delete" + ], + "requires_ai": false, + "supported_parameters": [ + { + "default_value": 30, + "description": "Number of days of inactivity before an API key is considered unused.", + "display_name": "Unused API Key Threshold", + "hidden": false, + "name": "api_key_threshold", + "required": false, + "supported_values": [ + { + "label": "30 days", + "value": "thirty" + } + ], + "type": "integer" + } + ], + "title": "Revoke Unused API Keys" + } + ], + "name": "Unused API Keys", + "next_steps": "Review and revoke API keys that are no longer in use to maintain a secure authentication posture.", + "notification_frequency": "", + "notification_parameters": {}, + "notification_type": "", + "priority": "High", + "product": "api_keys", + "release_status": "prod", + "resource_type": "api_key", + "resource_type_display_name": "API Key", + "supported_detection_parameters": [ + { + "default_value": 30, + "description": "Number of days of inactivity before an API key is considered unused.", + "display_name": "Unused API Key Threshold", + "hidden": false, + "name": "api_key_threshold", + "required": false, + "supported_values": [ + { + "label": "30 days", + "value": "thirty" + } + ], + "type": "integer" + } + ], + "supported_notification_parameters": [ + { + "default_value": 30, + "description": "Number of days of inactivity before an API key is considered unused.", + "display_name": "Unused API Key Threshold", + "hidden": false, + "name": "api_key_threshold", + "required": false, + "supported_values": [ + { + "label": "30 days", + "value": "thirty" + } + ], + "type": "integer" + } + ], + "task": "Review and revoke unused API keys.", + "type": "Proactive", + "usage_concern": "Security" + }, + "id": "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a", + "type": "governance_control" + } + }, + "html": "
\n
\n
\n
\n

data [required]

\n
\n

object

\n

A governance control resource.

\n
\n
\n
\n
\n
\n

attributes [required]

\n
\n

object

\n

The attributes of a governance control.

\n
\n
\n
\n
\n
\n

active_detections_count [required]

\n
\n

int64

\n

The number of active detections for the control.

\n
\n \n
\n
\n
\n
\n
\n

category [required]

\n
\n

string

\n

The value driver the control is grouped under, such as security or cost.

\n
\n \n
\n
\n
\n
\n
\n

created_at [required]

\n
\n

date-time

\n

The time the control configuration was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by [required]

\n
\n

string

\n

The UUID of the user who created the control configuration.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of what the control detects.

\n
\n \n
\n
\n
\n
\n
\n

detection_frequency [required]

\n
\n

string

\n

How often detections are evaluated for the control.

\n
\n \n
\n
\n
\n
\n
\n

detection_parameters [required]

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

detection_type [required]

\n
\n

string

\n

The detection type that uniquely identifies the control.

\n
\n \n
\n
\n
\n
\n
\n

feature_flags [required]

\n
\n

[string]

\n

The feature flags that gate the control.

\n
\n \n
\n
\n
\n
\n
\n

insights [required]

\n
\n

[string]

\n

The insight slugs associated with the control.

\n
\n \n
\n
\n
\n
\n
\n

last_detection_at [required]

\n
\n

date-time

\n

The time of the most recent detection for the control. null when there are no detections.

\n
\n \n
\n
\n
\n
\n
\n

mitigated_detections_count [required]

\n
\n

int64

\n

The number of mitigated detections for the control.

\n
\n \n
\n
\n
\n
\n
\n

mitigation_parameters [required]

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

mitigation_type [required]

\n
\n

string

\n

The configured mitigation type for the control. Empty when not configured.

\n
\n \n
\n
\n
\n
\n
\n

mitigations [required]

\n
\n

[object]

\n

The mitigations available for a control.

\n
\n
\n
\n
\n
\n

action_verb [required]

\n
\n

string

\n

The verb describing the mitigation action, such as revoke or delete.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

execution_modes

\n
\n

[string]

\n

The execution modes the mitigation supports, such as manual or automatic.

\n
\n \n
\n
\n
\n
\n
\n

feature_flags [required]

\n
\n

[string]

\n

The feature flags that gate the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

id [required]

\n
\n

string

\n

The unique identifier of the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

manual_mitigation_warning [required]

\n
\n

string

\n

A warning shown to the user before applying the mitigation manually.

\n
\n \n
\n
\n
\n
\n
\n

permissions [required]

\n
\n

[string]

\n

The permissions required to apply the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

requires_ai [required]

\n
\n

boolean

\n

Whether the mitigation requires AI to be enabled.

\n
\n \n
\n
\n
\n
\n
\n

supported_parameters [required]

\n
\n

[object]

\n

An array of parameter definitions.

\n
\n
\n
\n
\n
\n

default_value [required]

\n
\n

\n

The default value of the parameter. The JSON type depends on the parameter's type.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

display_name [required]

\n
\n

string

\n

The human-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

hidden [required]

\n
\n

boolean

\n

Whether the parameter is hidden from the UI.

\n
\n \n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

The machine-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

required [required]

\n
\n

boolean

\n

Whether the parameter must be provided.

\n
\n \n
\n
\n
\n
\n
\n

supported_values [required]

\n
\n

[object]

\n

The supported values for an enumerated parameter.

\n
\n
\n
\n
\n
\n

label [required]

\n
\n

string

\n

The human-readable label for the value.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

The machine-readable value.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the parameter, such as integer, string, boolean, enum, or pattern_list.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

title [required]

\n
\n

string

\n

A short, human-readable name for the mitigation.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

Human-readable name of the control.

\n
\n \n
\n
\n
\n
\n
\n

next_steps [required]

\n
\n

string

\n

Guidance on the next steps to remediate detections for the control.

\n
\n \n
\n
\n
\n
\n
\n

notification_frequency [required]

\n
\n

string

\n

The configured notification frequency for the control. Empty when not configured.

\n
\n \n
\n
\n
\n
\n
\n

notification_parameters [required]

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

notification_type [required]

\n
\n

string

\n

The configured notification type for the control. Empty when not configured.

\n
\n \n
\n
\n
\n
\n
\n

priority [required]

\n
\n

string

\n

The priority of the control, such as High.

\n
\n \n
\n
\n
\n
\n
\n

product [required]

\n
\n

string

\n

The product the control belongs to.

\n
\n \n
\n
\n
\n
\n
\n

release_status [required]

\n
\n

string

\n

The release status of the control, such as prod or beta.

\n
\n \n
\n
\n
\n
\n
\n

resource_type [required]

\n
\n

string

\n

The type of resource the control evaluates.

\n
\n \n
\n
\n
\n
\n
\n

resource_type_display_name [required]

\n
\n

string

\n

The human-readable name of the resource type.

\n
\n \n
\n
\n
\n
\n
\n

supported_detection_parameters [required]

\n
\n

[object]

\n

An array of parameter definitions.

\n
\n
\n
\n
\n
\n

default_value [required]

\n
\n

\n

The default value of the parameter. The JSON type depends on the parameter's type.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

display_name [required]

\n
\n

string

\n

The human-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

hidden [required]

\n
\n

boolean

\n

Whether the parameter is hidden from the UI.

\n
\n \n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

The machine-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

required [required]

\n
\n

boolean

\n

Whether the parameter must be provided.

\n
\n \n
\n
\n
\n
\n
\n

supported_values [required]

\n
\n

[object]

\n

The supported values for an enumerated parameter.

\n
\n
\n
\n
\n
\n

label [required]

\n
\n

string

\n

The human-readable label for the value.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

The machine-readable value.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the parameter, such as integer, string, boolean, enum, or pattern_list.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

supported_notification_parameters [required]

\n
\n

[object]

\n

An array of parameter definitions.

\n
\n
\n
\n
\n
\n

default_value [required]

\n
\n

\n

The default value of the parameter. The JSON type depends on the parameter's type.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

display_name [required]

\n
\n

string

\n

The human-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

hidden [required]

\n
\n

boolean

\n

Whether the parameter is hidden from the UI.

\n
\n \n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

The machine-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

required [required]

\n
\n

boolean

\n

Whether the parameter must be provided.

\n
\n \n
\n
\n
\n
\n
\n

supported_values [required]

\n
\n

[object]

\n

The supported values for an enumerated parameter.

\n
\n
\n
\n
\n
\n

label [required]

\n
\n

string

\n

The human-readable label for the value.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

The machine-readable value.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the parameter, such as integer, string, boolean, enum, or pattern_list.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

task [required]

\n
\n

string

\n

A short description of the remediation task for the control.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The control type, such as Proactive or Detection.

\n
\n \n
\n
\n
\n
\n
\n

usage_concern [required]

\n
\n

string

\n

The usage concern the control addresses, such as Security or Cost Optimization.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id [required]

\n
\n

string

\n

The unique identifier of the control.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

enum

\n

JSON:API resource type for a governance control. \nAllowed enum values: governance_control

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

\n
\n \n
\n
\n
\n
" + }, + "429": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" + } + }, + "request": { + "json_curl": {}, + "json": {}, + "html": "" + } + }, + "UpdateGovernanceControl": { + "responses": { + "200": { + "json": { + "data": { + "attributes": { + "active_detections_count": 12, + "category": "security", + "created_at": "2024-01-15T09:30:00Z", + "created_by": "11111111-2222-3333-4444-555555555555", + "description": "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials.", + "detection_frequency": "daily", + "detection_parameters": {}, + "detection_type": "unused_api_keys", + "feature_flags": [ + [] + ], + "insights": [ + [] + ], + "last_detection_at": "2024-03-01T12:00:00Z", + "mitigated_detections_count": 3, + "mitigation_parameters": {}, + "mitigation_type": "revoke_api_key", + "mitigations": [ + { + "action_verb": "revoke", + "description": "Automatically identifies and revokes inactive API keys to improve security and reduce potential attack surface.", + "execution_modes": [ + "manual", + "automatic" + ], + "feature_flags": [ + [] + ], + "id": "revoke_api_key", + "manual_mitigation_warning": "These API keys will be revoked immediately upon confirmation. To revoke future API keys, you must go through this flow again.", + "permissions": [ + "api_keys_write", + "api_keys_delete" + ], + "requires_ai": false, + "supported_parameters": [ + { + "default_value": 30, + "description": "Number of days of inactivity before an API key is considered unused.", + "display_name": "Unused API Key Threshold", + "hidden": false, + "name": "api_key_threshold", + "required": false, + "supported_values": [ + { + "label": "30 days", + "value": "thirty" + } + ], + "type": "integer" + } + ], + "title": "Revoke Unused API Keys" + } + ], + "name": "Unused API Keys", + "next_steps": "Review and revoke API keys that are no longer in use to maintain a secure authentication posture.", + "notification_frequency": "", + "notification_parameters": {}, + "notification_type": "", + "priority": "High", + "product": "api_keys", + "release_status": "prod", + "resource_type": "api_key", + "resource_type_display_name": "API Key", + "supported_detection_parameters": [ + { + "default_value": 30, + "description": "Number of days of inactivity before an API key is considered unused.", + "display_name": "Unused API Key Threshold", + "hidden": false, + "name": "api_key_threshold", + "required": false, + "supported_values": [ + { + "label": "30 days", + "value": "thirty" + } + ], + "type": "integer" + } + ], + "supported_notification_parameters": [ + { + "default_value": 30, + "description": "Number of days of inactivity before an API key is considered unused.", + "display_name": "Unused API Key Threshold", + "hidden": false, + "name": "api_key_threshold", + "required": false, + "supported_values": [ + { + "label": "30 days", + "value": "thirty" + } + ], + "type": "integer" + } + ], + "task": "Review and revoke unused API keys.", + "type": "Proactive", + "usage_concern": "Security" + }, + "id": "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a", + "type": "governance_control" + } + }, + "html": "
\n
\n
\n
\n

data [required]

\n
\n

object

\n

A governance control resource.

\n
\n
\n
\n
\n
\n

attributes [required]

\n
\n

object

\n

The attributes of a governance control.

\n
\n
\n
\n
\n
\n

active_detections_count [required]

\n
\n

int64

\n

The number of active detections for the control.

\n
\n \n
\n
\n
\n
\n
\n

category [required]

\n
\n

string

\n

The value driver the control is grouped under, such as security or cost.

\n
\n \n
\n
\n
\n
\n
\n

created_at [required]

\n
\n

date-time

\n

The time the control configuration was created.

\n
\n \n
\n
\n
\n
\n
\n

created_by [required]

\n
\n

string

\n

The UUID of the user who created the control configuration.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of what the control detects.

\n
\n \n
\n
\n
\n
\n
\n

detection_frequency [required]

\n
\n

string

\n

How often detections are evaluated for the control.

\n
\n \n
\n
\n
\n
\n
\n

detection_parameters [required]

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

detection_type [required]

\n
\n

string

\n

The detection type that uniquely identifies the control.

\n
\n \n
\n
\n
\n
\n
\n

feature_flags [required]

\n
\n

[string]

\n

The feature flags that gate the control.

\n
\n \n
\n
\n
\n
\n
\n

insights [required]

\n
\n

[string]

\n

The insight slugs associated with the control.

\n
\n \n
\n
\n
\n
\n
\n

last_detection_at [required]

\n
\n

date-time

\n

The time of the most recent detection for the control. null when there are no detections.

\n
\n \n
\n
\n
\n
\n
\n

mitigated_detections_count [required]

\n
\n

int64

\n

The number of mitigated detections for the control.

\n
\n \n
\n
\n
\n
\n
\n

mitigation_parameters [required]

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

mitigation_type [required]

\n
\n

string

\n

The configured mitigation type for the control. Empty when not configured.

\n
\n \n
\n
\n
\n
\n
\n

mitigations [required]

\n
\n

[object]

\n

The mitigations available for a control.

\n
\n
\n
\n
\n
\n

action_verb [required]

\n
\n

string

\n

The verb describing the mitigation action, such as revoke or delete.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

execution_modes

\n
\n

[string]

\n

The execution modes the mitigation supports, such as manual or automatic.

\n
\n \n
\n
\n
\n
\n
\n

feature_flags [required]

\n
\n

[string]

\n

The feature flags that gate the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

id [required]

\n
\n

string

\n

The unique identifier of the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

manual_mitigation_warning [required]

\n
\n

string

\n

A warning shown to the user before applying the mitigation manually.

\n
\n \n
\n
\n
\n
\n
\n

permissions [required]

\n
\n

[string]

\n

The permissions required to apply the mitigation.

\n
\n \n
\n
\n
\n
\n
\n

requires_ai [required]

\n
\n

boolean

\n

Whether the mitigation requires AI to be enabled.

\n
\n \n
\n
\n
\n
\n
\n

supported_parameters [required]

\n
\n

[object]

\n

An array of parameter definitions.

\n
\n
\n
\n
\n
\n

default_value [required]

\n
\n

\n

The default value of the parameter. The JSON type depends on the parameter's type.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

display_name [required]

\n
\n

string

\n

The human-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

hidden [required]

\n
\n

boolean

\n

Whether the parameter is hidden from the UI.

\n
\n \n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

The machine-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

required [required]

\n
\n

boolean

\n

Whether the parameter must be provided.

\n
\n \n
\n
\n
\n
\n
\n

supported_values [required]

\n
\n

[object]

\n

The supported values for an enumerated parameter.

\n
\n
\n
\n
\n
\n

label [required]

\n
\n

string

\n

The human-readable label for the value.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

The machine-readable value.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the parameter, such as integer, string, boolean, enum, or pattern_list.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

title [required]

\n
\n

string

\n

A short, human-readable name for the mitigation.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

Human-readable name of the control.

\n
\n \n
\n
\n
\n
\n
\n

next_steps [required]

\n
\n

string

\n

Guidance on the next steps to remediate detections for the control.

\n
\n \n
\n
\n
\n
\n
\n

notification_frequency [required]

\n
\n

string

\n

The configured notification frequency for the control. Empty when not configured.

\n
\n \n
\n
\n
\n
\n
\n

notification_parameters [required]

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

notification_type [required]

\n
\n

string

\n

The configured notification type for the control. Empty when not configured.

\n
\n \n
\n
\n
\n
\n
\n

priority [required]

\n
\n

string

\n

The priority of the control, such as High.

\n
\n \n
\n
\n
\n
\n
\n

product [required]

\n
\n

string

\n

The product the control belongs to.

\n
\n \n
\n
\n
\n
\n
\n

release_status [required]

\n
\n

string

\n

The release status of the control, such as prod or beta.

\n
\n \n
\n
\n
\n
\n
\n

resource_type [required]

\n
\n

string

\n

The type of resource the control evaluates.

\n
\n \n
\n
\n
\n
\n
\n

resource_type_display_name [required]

\n
\n

string

\n

The human-readable name of the resource type.

\n
\n \n
\n
\n
\n
\n
\n

supported_detection_parameters [required]

\n
\n

[object]

\n

An array of parameter definitions.

\n
\n
\n
\n
\n
\n

default_value [required]

\n
\n

\n

The default value of the parameter. The JSON type depends on the parameter's type.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

display_name [required]

\n
\n

string

\n

The human-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

hidden [required]

\n
\n

boolean

\n

Whether the parameter is hidden from the UI.

\n
\n \n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

The machine-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

required [required]

\n
\n

boolean

\n

Whether the parameter must be provided.

\n
\n \n
\n
\n
\n
\n
\n

supported_values [required]

\n
\n

[object]

\n

The supported values for an enumerated parameter.

\n
\n
\n
\n
\n
\n

label [required]

\n
\n

string

\n

The human-readable label for the value.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

The machine-readable value.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the parameter, such as integer, string, boolean, enum, or pattern_list.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

supported_notification_parameters [required]

\n
\n

[object]

\n

An array of parameter definitions.

\n
\n
\n
\n
\n
\n

default_value [required]

\n
\n

\n

The default value of the parameter. The JSON type depends on the parameter's type.

\n
\n \n
\n
\n
\n
\n
\n

description [required]

\n
\n

string

\n

A human-readable description of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

display_name [required]

\n
\n

string

\n

The human-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

hidden [required]

\n
\n

boolean

\n

Whether the parameter is hidden from the UI.

\n
\n \n
\n
\n
\n
\n
\n

name [required]

\n
\n

string

\n

The machine-readable name of the parameter.

\n
\n \n
\n
\n
\n
\n
\n

required [required]

\n
\n

boolean

\n

Whether the parameter must be provided.

\n
\n \n
\n
\n
\n
\n
\n

supported_values [required]

\n
\n

[object]

\n

The supported values for an enumerated parameter.

\n
\n
\n
\n
\n
\n

label [required]

\n
\n

string

\n

The human-readable label for the value.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

The machine-readable value.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The type of the parameter, such as integer, string, boolean, enum, or pattern_list.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

task [required]

\n
\n

string

\n

A short description of the remediation task for the control.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

string

\n

The control type, such as Proactive or Detection.

\n
\n \n
\n
\n
\n
\n
\n

usage_concern [required]

\n
\n

string

\n

The usage concern the control addresses, such as Security or Cost Optimization.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id [required]

\n
\n

string

\n

The unique identifier of the control.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

enum

\n

JSON:API resource type for a governance control. \nAllowed enum values: governance_control

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

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

errors [required]

\n
\n

[object]

\n

A list of errors.

\n
\n
\n
\n
\n
\n

detail

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Non-standard meta-information about the error

\n
\n \n
\n
\n
\n
\n
\n

source

\n
\n

object

\n

References to the source of the error.

\n
\n
\n
\n
\n
\n

header

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n

parameter

\n
\n

string

\n

A string indicating which URI query parameter caused the error.

\n
\n \n
\n
\n
\n
\n
\n

pointer

\n
\n

string

\n

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

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

status

\n
\n

string

\n

Status code of the response.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

Short human-readable summary of the error.

\n
\n \n
\n
\n
\n
" + }, + "429": { + "json": { + "errors": [ + "Bad Request" + ] + }, + "html": "
\n
\n
\n
\n

errors [required]

\n
\n

[string]

\n

A list of errors.

\n
\n \n
\n
" + } + }, + "request": { + "json_curl": { + "data": { + "type": "governance_control" + } + }, + "json": { + "data": { + "attributes": { + "detection_frequency": "daily", + "detection_parameters": {}, + "mitigation_parameters": {}, + "mitigation_type": "revoke_api_key", + "name": "Unused API Keys", + "notification_frequency": "daily", + "notification_parameters": {}, + "notification_type": "slack" + }, + "id": "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a", + "type": "governance_control" + } + }, + "html": "
\n
\n
\n
\n

data [required]

\n
\n

object

\n

The data of a governance control update request.

\n
\n
\n
\n
\n
\n

attributes

\n
\n

object

\n

The attributes of a governance control that can be updated. Only the attributes present in the request are modified.

\n
\n
\n
\n
\n
\n

detection_frequency

\n
\n

string

\n

How often detections should be evaluated for the control.

\n
\n \n
\n
\n
\n
\n
\n

detection_parameters

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

mitigation_parameters

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

mitigation_type

\n
\n

string

\n

The mitigation type to configure for the control.

\n
\n \n
\n
\n
\n
\n
\n

name

\n
\n

string

\n

A new human-readable name for the control.

\n
\n \n
\n
\n
\n
\n
\n

notification_frequency

\n
\n

string

\n

The notification frequency to configure for the control.

\n
\n \n
\n
\n
\n
\n
\n

notification_parameters

\n
\n

object

\n

A free-form map of parameter names to their configured values.

\n
\n \n
\n
\n
\n
\n
\n

notification_type

\n
\n

string

\n

The notification type to configure for the control.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The unique identifier of the control.

\n
\n \n
\n
\n
\n
\n
\n

type [required]

\n
\n

enum

\n

JSON:API resource type for a governance control. \nAllowed enum values: governance_control

\n
\n \n
\n
\n
\n
" + } + } +} \ No newline at end of file diff --git a/content/en/api/v2/scim/examples.json b/content/en/api/v2/scim/examples.json index 5a12ef9064c..ab7eb43bfde 100644 --- a/content/en/api/v2/scim/examples.json +++ b/content/en/api/v2/scim/examples.json @@ -666,6 +666,12 @@ "name": { "formatted": "John Doe" }, + "roles": [ + { + "display": "Datadog Read Only Role", + "value": "00000000-0000-0000-0000-000000000001" + } + ], "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], @@ -691,6 +697,12 @@ "name": { "formatted": "Jane Doe" }, + "roles": [ + { + "display": "Datadog Standard Role", + "value": "00000000-0000-0000-0000-000000000002" + } + ], "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], @@ -705,7 +717,7 @@ "startIndex": 1, "totalResults": 2 }, - "html": "
\n
\n
\n
\n

Resources

\n
\n

[object]

\n

List of users matching the request criteria.

\n
\n
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

itemsPerPage

\n
\n

int64

\n

Number of users returned per page.

\n
\n \n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

List response JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

startIndex

\n
\n

int64

\n

Starting index of the users for this page (1-indexed).

\n
\n \n
\n
\n
\n
\n
\n

totalResults

\n
\n

int64

\n

Total number of users matching the request criteria.

\n
\n \n
\n
" + "html": "
\n
\n
\n
\n

Resources

\n
\n

[object]

\n

List of users matching the request criteria.

\n
\n
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

roles

\n
\n

[object]

\n

Datadog roles assigned to the user. Provide the role UUID in value when provisioning or updating roles through SCIM.

\n
\n
\n
\n
\n
\n

display

\n
\n

string

\n

Human-readable Datadog role name returned in responses.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

Datadog role UUID.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

itemsPerPage

\n
\n

int64

\n

Number of users returned per page.

\n
\n \n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

List response JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

startIndex

\n
\n

int64

\n

Starting index of the users for this page (1-indexed).

\n
\n \n
\n
\n
\n
\n
\n

totalResults

\n
\n

int64

\n

Total number of users matching the request criteria.

\n
\n \n
\n
" }, "400": { "json": { @@ -752,13 +764,19 @@ "name": { "formatted": "string" }, + "roles": [ + { + "display": "Datadog Read Only Role", + "value": "00000000-0000-0000-0000-000000000001" + } + ], "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "title": "string", "userName": "string" }, - "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" + "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

roles

\n
\n

[object]

\n

Datadog roles assigned to the user. Provide the role UUID in value when provisioning or updating roles through SCIM.

\n
\n
\n
\n
\n
\n

display

\n
\n

string

\n

Human-readable Datadog role name returned in responses.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

Datadog role UUID.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" }, "400": { "json": { @@ -778,7 +796,13 @@ } }, "request": { - "json_curl": {}, + "json_curl": { + "roles": [ + { + "value": "00000000-0000-0000-0000-000000000001" + } + ] + }, "json": { "active": false, "emails": [ @@ -798,13 +822,18 @@ "name": { "formatted": "string" }, + "roles": [ + { + "value": "00000000-0000-0000-0000-000000000001" + } + ], "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "title": "string", "userName": "string" }, - "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" + "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

roles

\n
\n

[object]

\n

Datadog roles assigned to the user. Provide the role UUID in value when provisioning or updating roles through SCIM.

\n
\n
\n
\n
\n
\n

display

\n
\n

string

\n

Human-readable Datadog role name returned in responses.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

Datadog role UUID.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" } }, "DeleteSCIMUser": { @@ -862,13 +891,19 @@ "name": { "formatted": "string" }, + "roles": [ + { + "display": "Datadog Read Only Role", + "value": "00000000-0000-0000-0000-000000000001" + } + ], "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "title": "string", "userName": "string" }, - "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" + "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

roles

\n
\n

[object]

\n

Datadog roles assigned to the user. Provide the role UUID in value when provisioning or updating roles through SCIM.

\n
\n
\n
\n
\n
\n

display

\n
\n

string

\n

Human-readable Datadog role name returned in responses.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

Datadog role UUID.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" }, "404": { "json": { @@ -915,13 +950,19 @@ "name": { "formatted": "string" }, + "roles": [ + { + "display": "Datadog Read Only Role", + "value": "00000000-0000-0000-0000-000000000001" + } + ], "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "title": "string", "userName": "string" }, - "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" + "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

roles

\n
\n

[object]

\n

Datadog roles assigned to the user. Provide the role UUID in value when provisioning or updating roles through SCIM.

\n
\n
\n
\n
\n
\n

display

\n
\n

string

\n

Human-readable Datadog role name returned in responses.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

Datadog role UUID.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" }, "400": { "json": { @@ -962,15 +1003,17 @@ "Operations": [ { "op": "string", - "path": "title", - "value": "undefined" + "path": "roles", + "value": [ + "00000000-0000-0000-0000-000000000001" + ] } ], "schemas": [ "urn:ietf:params:scim:api:messages:2.0:PatchOp" ] }, - "html": "
\n
\n
\n
\n

Operations

\n
\n

[object]

\n

A list of update operations to be performed on a user.

\n
\n
\n
\n
\n
\n

op

\n
\n

enum

\n

The operation to be performed. \nAllowed enum values: add,replace

\n
\n \n
\n
\n
\n
\n
\n

path

\n
\n

string

\n

An attribute path describing the target of the operation.

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

\n

New value to use for the patch operation.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

Input JSON Schemas

\n
\n \n
\n
" + "html": "
\n
\n
\n
\n

Operations

\n
\n

[object]

\n

A list of update operations to be performed on a user.

\n
\n
\n
\n
\n
\n

op

\n
\n

enum

\n

The operation to be performed. \nAllowed enum values: add,replace

\n
\n \n
\n
\n
\n
\n
\n

path

\n
\n

string

\n

An attribute path describing the target of the operation.

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

\n

New value to use for the patch operation. When path is roles, use an array of role objects with each role UUID in value.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

Input JSON Schemas

\n
\n \n
\n
" } }, "UpdateSCIMUser": { @@ -995,13 +1038,19 @@ "name": { "formatted": "string" }, + "roles": [ + { + "display": "Datadog Read Only Role", + "value": "00000000-0000-0000-0000-000000000001" + } + ], "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "title": "string", "userName": "string" }, - "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" + "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

roles

\n
\n

[object]

\n

Datadog roles assigned to the user. Provide the role UUID in value when provisioning or updating roles through SCIM.

\n
\n
\n
\n
\n
\n

display

\n
\n

string

\n

Human-readable Datadog role name returned in responses.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

Datadog role UUID.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" }, "400": { "json": { @@ -1029,7 +1078,13 @@ } }, "request": { - "json_curl": {}, + "json_curl": { + "roles": [ + { + "value": "00000000-0000-0000-0000-000000000001" + } + ] + }, "json": { "active": false, "emails": [ @@ -1049,13 +1104,18 @@ "name": { "formatted": "string" }, + "roles": [ + { + "value": "00000000-0000-0000-0000-000000000001" + } + ], "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "title": "string", "userName": "string" }, - "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" + "html": "
\n
\n
\n
\n

active

\n
\n

boolean

\n

A Boolean value indicating the User's administrative status.

\n
\n \n
\n
\n
\n
\n
\n

emails

\n
\n

[object]

\n

Email addresses for the user.

\n
\n
\n
\n
\n
\n

primary

\n
\n

boolean

\n

Boolean indicating if this email is the primary email address.

\n
\n \n
\n
\n
\n
\n
\n

type

\n
\n

enum

\n

The type of email. \nAllowed enum values: work

\n
\n \n
\n
\n
\n
\n
\n

value

\n
\n

string

\n

Email addresses for the user.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

id

\n
\n

string

\n

The identifier of the resource. Not required when creating a user.

\n
\n \n
\n
\n
\n
\n
\n

meta

\n
\n

object

\n

Metadata associated with a user.

\n
\n
\n
\n
\n
\n

created

\n
\n

date-time

\n

The date and time the user was created.

\n
\n \n
\n
\n
\n
\n
\n

lastModified

\n
\n

date-time

\n

The date and time the user was last changed.

\n
\n \n
\n
\n
\n
\n
\n

location

\n
\n

string

\n

URL identifying the resource.

\n
\n \n
\n
\n
\n
\n
\n

resourceType

\n
\n

string

\n

Type of resource.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

name

\n
\n

object

\n

The components of user's real name

\n
\n
\n
\n
\n
\n

formatted

\n
\n

string

\n

The full name, including all middle names, titles, and suffixes as appropriate, formatted for display.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

roles

\n
\n

[object]

\n

Datadog roles assigned to the user. Provide the role UUID in value when provisioning or updating roles through SCIM.

\n
\n
\n
\n
\n
\n

display

\n
\n

string

\n

Human-readable Datadog role name returned in responses.

\n
\n \n
\n
\n
\n
\n
\n

value [required]

\n
\n

string

\n

Datadog role UUID.

\n
\n \n
\n
\n
\n
\n
\n
\n
\n

schemas

\n
\n

[string]

\n

User JSON Schemas.

\n
\n \n
\n
\n
\n
\n
\n

title

\n
\n

string

\n

The user's title.

\n
\n \n
\n
\n
\n
\n
\n

userName

\n
\n

string

\n

Unique identifier for the User.

\n
\n \n
\n
" } } } \ No newline at end of file diff --git a/content/en/api/v2/workflow-automation/request.CreateWorkflow.json b/content/en/api/v2/workflow-automation/request.CreateWorkflow.json index 8f6be56b293..1beb33fd969 100644 --- a/content/en/api/v2/workflow-automation/request.CreateWorkflow.json +++ b/content/en/api/v2/workflow-automation/request.CreateWorkflow.json @@ -9,7 +9,7 @@ { "connections": [ { - "connectionId": "11111111-1111-1111-1111-111111111111", + "connectionId": "e1e64943-c7c5-4487-aece-25aaec7d3aad", "label": "INTEGRATION_DATADOG" } ], diff --git a/content/en/api/v2/workflow-automation/request.UpdateWorkflow.json b/content/en/api/v2/workflow-automation/request.UpdateWorkflow.json index 52fe9d3f3d5..cad50eafc64 100644 --- a/content/en/api/v2/workflow-automation/request.UpdateWorkflow.json +++ b/content/en/api/v2/workflow-automation/request.UpdateWorkflow.json @@ -9,7 +9,7 @@ { "connections": [ { - "connectionId": "11111111-1111-1111-1111-111111111111", + "connectionId": "e1e64943-c7c5-4487-aece-25aaec7d3aad", "label": "INTEGRATION_DATADOG" } ], diff --git a/content/en/data_streams/setup/language/go.md b/content/en/data_streams/setup/language/go.md index bed6cde3bfa..a760b11c3b8 100644 --- a/content/en/data_streams/setup/language/go.md +++ b/content/en/data_streams/setup/language/go.md @@ -92,7 +92,7 @@ producer, err := ddkafka.NewProducer(&kafka.ConfigMap{ }, ddkafka.WithDataStreams()) ``` -If a service consumes data from one point and produces to another point, propagate context between the two places using the Go context structure: +If a service consumes data from one point and produces to another point, propagate context between the two places using the Go context structure. The `ctx` returned by `ExtractFromBase64Carrier` carries the upstream DSM pathway. Pass it to `SetDataStreamsCheckpointWithParams` when you produce, then inject it into the outbound message with `InjectToBase64Carrier`. Passing `context.Background()` at the produce site creates a new pathway root and breaks end-to-end visibility. This happens, for example, in a worker goroutine that has lost the consume `ctx`. 3. Extract the context from headers @@ -105,6 +105,41 @@ If a service consumes data from one point and produces to another point, propaga datastreams.InjectToBase64Carrier(ctx, ddsarama.NewProducerMessageCarrier(message)) ``` +##### Goroutines and channels + +Go channels and goroutines do not carry `context.Context` automatically. If your service fans consumed messages out to worker goroutines before producing, pass the consume `ctx` to the produce site by including it in the work item you send over the channel: + +```go +type job struct { + ctx context.Context + payload []byte +} + +// consume side +ctx, _ = tracer.SetDataStreamsCheckpointWithParams( + datastreams.ExtractFromBase64Carrier(context.Background(), ddsarama.NewConsumerMessageCarrier(msg)), + options.CheckpointParams{PayloadSize: int64(len(msg.Value))}, + "direction:in", "type:kafka", "topic:"+inTopic, "group:"+group, +) +// context.WithoutCancel preserves the pathway if the handler's ctx is canceled before the worker runs (Go 1.21+) +jobs <- job{ctx: context.WithoutCancel(ctx), payload: msg.Value} + +// worker goroutine +for j := range jobs { + out := &sarama.ProducerMessage{Topic: outTopic, Value: sarama.ByteEncoder(j.payload)} + ctx, ok := tracer.SetDataStreamsCheckpointWithParams(j.ctx, + options.CheckpointParams{PayloadSize: int64(out.Value.Length())}, + "direction:out", "type:kafka", "topic:"+outTopic) + if ok { + datastreams.InjectToBase64Carrier(ctx, ddsarama.NewProducerMessageCarrier(out)) + } + producer.SendMessage(out) +} +``` + +- **Fan-out**: When one consumed message fans out to multiple produce calls, pass the same consume `ctx` to each produce checkpoint. Each call creates its own child node in the pathway. +- **Fan-in**: When many consumed messages merge into one produce call, combine the inbound contexts with `datastreams.MergeContexts(ctxs...)` before producing. + #### Other queuing technologies or protocols You can also use manual instrumentation. For example, you can propagate context through Kinesis. diff --git a/content/en/incident_response/status_pages/_index.md b/content/en/incident_response/status_pages/_index.md index 11b27baf95a..c6123f1b434 100644 --- a/content/en/incident_response/status_pages/_index.md +++ b/content/en/incident_response/status_pages/_index.md @@ -181,6 +181,22 @@ From a status page, select the dropdown next to **Publish Notice**, select **Pub {{< img src="incident_response/status_pages/publish_status_page_backfill_degradation.png" alt="Example publish backfilled notice modal for degradations" style="width:60%;" >}} +### Edit a degradation update + +After publishing a degradation update, you can edit its status and message to correct typos, fix an inaccurate status selection, or clarify the description. To edit an update, open the degradation notice on the status page, hover over the update you want to modify, and click the edit icon that appears. Make your changes in the **Edit Update** modal. + +{{< img src="incident_response/status_pages/edit_degradation_update.png" alt="Edit Update modal showing Notice Status options and a Message field" style="width:60%;" >}} + +Only the **Notice Status** and **Message** fields can be edited. To resolve the notice or update affected components, add a new update instead. Click **Save Changes** to apply the edits. + +### Delete a degradation update + +To delete an update posted by mistake, open the degradation notice on the status page, hover over the update you want to delete, and click the delete icon that appears. Confirm in the **Delete Update** modal. + +{{< img src="incident_response/status_pages/delete_degradation_update.png" alt="Delete Update confirmation modal" style="width:60%;" >}} + +Deleting an update replaces it on the timeline with a note indicating it was deleted by the page administrator. This action cannot be undone. + ### Schedule a maintenance window {{< img src="incident_response/status_pages/shopist_maintenance_example.png" alt="Example status page showing service components undergoing maintenance" style="width:100%;" >}} diff --git a/content/en/integrations/guide/aws-integration-troubleshooting.md b/content/en/integrations/guide/aws-integration-troubleshooting.md index 10b2d54b73a..f7b6909092a 100644 --- a/content/en/integrations/guide/aws-integration-troubleshooting.md +++ b/content/en/integrations/guide/aws-integration-troubleshooting.md @@ -117,6 +117,7 @@ If you are not seeing expected AWS metrics in Datadog, work through the followin 4. **Check whether the service requires additional enablement.** Some AWS services do not emit metrics to CloudWatch by default and require extra configuration in the AWS console. See [Which AWS services require additional setup beyond the core integration?][26] for a full list. 5. **Wait for the polling interval.** Allow at least one collection cycle before investigating further. See [Expected metric delays](#expected-metric-delays) for timing by collection method. 6. **Check for Service Control Policies (SCPs).** If your account is part of an AWS Organization, SCPs applied at the organization or organizational unit (OU) level can override IAM permissions and block API calls. Verify that no SCP denies the required permissions. +7. **Check for permissions boundaries.** A [permissions boundary][30] sets the maximum permissions a role can have. If the boundary does not include an action required by the Datadog integration, AWS returns `AccessDenied` for that action even when the integration role policy appears to grant it. In the AWS IAM console, open the integration role and check the **Permissions boundary** tab to see whether a boundary is attached. ### Wrong count of aws.elb.healthy_host_count @@ -221,3 +222,4 @@ By default, host-level tags remain permanently attached to AWS hosts. If you wan [27]: /integrations/amazon_elb/ [28]: https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/overview.html [29]: https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/supported-services.html +[30]: https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html diff --git a/content/en/integrations/guide/aws-manual-setup.md b/content/en/integrations/guide/aws-manual-setup.md index 3b5de585a90..b269e04311c 100644 --- a/content/en/integrations/guide/aws-manual-setup.md +++ b/content/en/integrations/guide/aws-manual-setup.md @@ -142,6 +142,21 @@ After configuring the role, return to the [AWS integration page][1] and save the If your AWS account is part of an AWS Organization, [Service Control Policies][10] can block the integration even when the IAM role and trust policy are correct. See [Missing metrics][11] in the troubleshooting guide for details. +**Permissions boundaries:** + +A [permissions boundary][12] sets the maximum permissions a role can have. Effective permissions are the intersection of the role's identity-based policies and the boundary policy. If the boundary does not include an action required by the Datadog integration, AWS returns `AccessDenied` for that action, and the integration tile may show `Datadog is not authorized to monitor some of your services` even when the integration role policy appears to grant the action. + +To check whether a permissions boundary is attached to your integration role: + +- **Console**: In the AWS IAM console, open the role, and check the **Permissions boundary** tab. +- **CLI**: Run the following command: + ``` + aws iam get-role --role-name \ + --query 'Role.{PermissionsBoundary:PermissionsBoundary,RoleName:RoleName}' + ``` + +To resolve the issue, coordinate with your IAM or security team to ensure the boundary policy includes the required Datadog integration actions. +
If there is a Datadog is not authorized to perform sts:AssumeRole error, follow the troubleshooting steps recommended in the UI, or read the troubleshooting guide.
\*{{% mainland-china-disclaimer %}} @@ -157,6 +172,7 @@ If your AWS account is part of an AWS Organization, [Service Control Policies][1 [9]: /integrations/guide/error-datadog-not-authorized-sts-assume-role/ [10]: https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html [11]: /integrations/guide/aws-integration-troubleshooting/#missing-metrics +[12]: https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html {{% /tab %}} {{% tab "Access keys" %}} diff --git a/content/en/logs/guide/best-practices-for-log-management.md b/content/en/logs/guide/best-practices-for-log-management.md index 6395e2d76e6..d3f82712336 100644 --- a/content/en/logs/guide/best-practices-for-log-management.md +++ b/content/en/logs/guide/best-practices-for-log-management.md @@ -19,6 +19,9 @@ further_reading: - link: "https://www.youtube.com/watch?v=2OEzAE7c2c0&list=PLdh-RwQzDsaM9Sq_fi-yXuzhmE7nOlqLE&index=1&pp=iAQB" tag: "Video" text: "Datadog Tips & Tricks: Improve log utilization with Datadog log exclusion filters" + - link: "https://learn.datadoghq.com/courses/debugging-log-pipelines" + tag: "Learning Center" + text: "Debugging Log Pipelines" algolia: tags: ["log usage", "grok", "grok parser", "logs parsing", "Extracting Attributes", "Remapping attributes", "parsing"] --- diff --git a/content/en/logs/log_configuration/_index.md b/content/en/logs/log_configuration/_index.md index ba08bf2d57b..2ab76b6900f 100644 --- a/content/en/logs/log_configuration/_index.md +++ b/content/en/logs/log_configuration/_index.md @@ -4,6 +4,9 @@ description: "Process, enrich, control, and manage your logs from the Logs Confi aliases: - /logs/processing further_reading: +- link: "https://learn.datadoghq.com/courses/debugging-log-pipelines" + tag: "Learning Center" + text: "Debugging Log Pipelines" - link: "/data_security/pci_compliance/" tag: "Documentation" text: "PCI DSS Compliance" diff --git a/content/en/logs/log_configuration/archives.md b/content/en/logs/log_configuration/archives.md index 95883bcdd0a..cdc3dfd2615 100644 --- a/content/en/logs/log_configuration/archives.md +++ b/content/en/logs/log_configuration/archives.md @@ -236,9 +236,11 @@ Use this optional configuration step to: #### Define maximum scan size -Use this optional configuration step to define the maximum volume of log data (in GB) that can be scanned for Rehydration on your Log Archives. +Use this optional configuration step to define the maximum volume of log data (in GB) that can be scanned for Archive Search or Rehydration on your Log Archives. -For Archives with a maximum scan size defined, all users need to estimate the scan size before they are allowed to start a Rehydration. If the estimated scan size is greater than what is permitted for that Archive, users must reduce the time range over which they are requesting the Rehydration. Reducing the time range will reduce the scan size and allow the user to start a Rehydration. +For Archives with a maximum scan size defined, all users need to estimate the scan size before they are allowed to start an Archive Search or Rehydration. If the estimated scan size is greater than what is permitted for that Archive, users must reduce the time range of their request. Reducing the time range will reduce the scan size and allow the user to start the Archive Search or Rehydration. + +**Note**: To reduce the volume of data scanned during [Archive Search][16], consider configuring [Partition Attributes](#archive-search-partition-attribute) and [Lookup Attributes](#archive-lookup-attribute-preview) on your archive. Partition attributes narrow the search scope by skipping irrelevant data segments, while lookup attributes accelerate pinpointing specific log entries. #### Archive Partition Attribute (Preview) {#archive-search-partition-attribute} diff --git a/content/en/logs/log_configuration/parsing.md b/content/en/logs/log_configuration/parsing.md index 6e80aa6958f..68527ad6130 100644 --- a/content/en/logs/log_configuration/parsing.md +++ b/content/en/logs/log_configuration/parsing.md @@ -8,6 +8,9 @@ further_reading: - link: "https://learn.datadoghq.com/courses/log-pipelines" tag: "Learning Center" text: "Learn how to build and modify log pipelines" +- link: "https://learn.datadoghq.com/courses/debugging-log-pipelines" + tag: "Learning Center" + text: "Debugging Log Pipelines" - link: "/logs/log_configuration/processors" tag: "Documentation" text: "Learn how to process your logs" @@ -23,9 +26,6 @@ further_reading: - link: "/logs/logging_without_limits/" tag: "Documentation" text: "Control the volume of logs indexed by Datadog" -- link: "https://learn.datadoghq.com/courses/debugging-log-pipelines" - tag: "Learning Center" - text: "Debugging Logs Pipelines" algolia: tags: ["grok", "grok parser", "logs parsing", "Extracting Attributes", "Remapping attributes", "parsing"] --- diff --git a/content/en/logs/log_configuration/pipelines.md b/content/en/logs/log_configuration/pipelines.md index fe42ac095c7..a75967ab517 100644 --- a/content/en/logs/log_configuration/pipelines.md +++ b/content/en/logs/log_configuration/pipelines.md @@ -4,6 +4,9 @@ description: "Parse, enrich, and manage your logs with Datadog pipelines and pro aliases: - /logs/processing/pipelines/ further_reading: +- link: "https://learn.datadoghq.com/courses/log-pipelines" + tag: "Learning Center" + text: "Build and Manage Log Pipelines" - link: "/logs/log_configuration/processors" tag: "Documentation" text: "Consult the full list of available Processors" @@ -16,12 +19,12 @@ further_reading: - link: "/logs/troubleshooting/" tag: "Documentation" text: "Logs troubleshooting" +- link: "https://learn.datadoghq.com/courses/debugging-log-pipelines" + tag: "Learning Center" + text: "Debugging Log Pipelines" - link: "https://learn.datadoghq.com/courses/integration-pipelines" tag: "Learning Center" text: "Process Logs Out of the Box with Integration Pipelines" -- link: "https://learn.datadoghq.com/courses/log-pipelines" - tag: "Learning Center" - text: "Build and Manage Log Pipelines" - link: "https://www.datadoghq.com/blog/monitor-cloudflare-zero-trust/" tag: "Blog" text: "Monitor Cloudflare Zero Trust with Datadog Cloud SIEM" diff --git a/content/en/logs/log_configuration/processors/_index.md b/content/en/logs/log_configuration/processors/_index.md index 8b1dffffd1c..eb719416964 100644 --- a/content/en/logs/log_configuration/processors/_index.md +++ b/content/en/logs/log_configuration/processors/_index.md @@ -22,6 +22,9 @@ further_reading: - link: "https://learn.datadoghq.com/courses/integration-pipelines" tag: "Learning Center" text: "Process Logs Out of the Box with Integration Pipelines" +- link: "https://learn.datadoghq.com/courses/debugging-log-pipelines" + tag: "Learning Center" + text: "Debugging Log Pipelines" algolia: tags: ["logs processors", "logs parsing", "Extracting Attributes", "Remapping attributes"] --- diff --git a/content/en/logs/troubleshooting/_index.md b/content/en/logs/troubleshooting/_index.md index 00fa1137476..9666f99f1a6 100644 --- a/content/en/logs/troubleshooting/_index.md +++ b/content/en/logs/troubleshooting/_index.md @@ -1,6 +1,10 @@ --- title: Logs Troubleshooting description: "Troubleshooting common log ingestion and processing issues in Datadog Logs, including missing logs, data access problems, and timestamp misalignment." +further_reading: +- link: "https://learn.datadoghq.com/courses/debugging-log-pipelines" + tag: "Learning Center" + text: "Debugging Log Pipelines" --- If you experience unexpected behavior with Datadog Logs, there are a few common issues you can investigate and this guide may help resolve issues quickly. If you continue to have trouble, reach out to [Datadog support][1] for further assistance. @@ -146,3 +150,7 @@ If the above troubleshooting steps do not resolve your issues with missing logs [21]: /tracing/trace_pipeline/ingestion_controls/ [22]: /logs/log_configuration/indexes/#exclusion-filters [23]: /tracing/other_telemetry/connect_logs_and_traces/ + +## Further Reading + +{{< partial name="whats-next/whats-next.html" >}} diff --git a/content/en/network_monitoring/cloud_network_monitoring/guide/detecting_a_network_outage.md b/content/en/network_monitoring/cloud_network_monitoring/guide/detecting_a_network_outage.md index b39f745574b..40e4a3efa50 100644 --- a/content/en/network_monitoring/cloud_network_monitoring/guide/detecting_a_network_outage.md +++ b/content/en/network_monitoring/cloud_network_monitoring/guide/detecting_a_network_outage.md @@ -20,13 +20,13 @@ Use CNM metrics to see whether your source endpoint may be sending an enormous a ## CPU overconsumption of the underlying infrastructure -On the other hand, resource overconsumption of either the client or server endpoint could be the culprit of poor communication between the two. In the side panel **Processes** tab, scope your view to processes running on either the source or destination endpoints to spot any heavy software that may be degrading the performance of their underlying hosts or containers, thus reducing their ability to respond to network calls. In this case, in addition to knowing _whether_ an underlying host is running hot and causing application latency, you will want to know _why_ it is running hot. Grouping your process metrics by command gives you this granularity, since you can identify the particular workload that is consuming your CPU and memory resources. +On the other hand, resource overconsumption of either the client or server endpoint could be the culprit of poor communication between the two. In the side panel {{< ui >}}Processes{{< /ui >}} tab, scope your view to processes running on either the source or destination endpoints to spot any heavy software that may be degrading the performance of their underlying hosts or containers, thus reducing their ability to respond to network calls. In this case, in addition to knowing _whether_ an underlying host is running hot and causing application latency, you will want to know _why_ it is running hot. Grouping your process metrics by command gives you this granularity, since you can identify the particular workload that is consuming your CPU and memory resources. {{< img src="network_performance_monitoring/guide/detecting_a_network_outage/cnm_processes_tab.png" alt="CPU overconsumption of the underlying infrastructure">}} ## Application errors in code -Network errors and latency can also be caused by client-side application errors. For instance, if your application is generating connections on loop unnecessarily, it could be overwhelming the endpoints that rely on it, leading to downstream application and network issues. To determine whether this is the case, look for application request errors in the **Traces** tab of a specific service in [CNM > DNS][1], or the **Network** tab of a specific trace in APM Traces. +Network errors and latency can also be caused by client-side application errors. For instance, if your application is generating connections on loop unnecessarily, it could be overwhelming the endpoints that rely on it, leading to downstream application and network issues. To determine whether this is the case, look for application request errors in the {{< ui >}}Traces{{< /ui >}} tab of a specific service in [CNM > DNS][1], or the {{< ui >}}Network{{< /ui >}} tab of a specific trace in APM Traces. {{< img src="network_performance_monitoring/guide/detecting_a_network_outage/traces_2.png" alt="Application errors in code">}} diff --git a/content/en/network_monitoring/cloud_network_monitoring/guide/detecting_application_availability.md b/content/en/network_monitoring/cloud_network_monitoring/guide/detecting_application_availability.md index 9ccd5a70531..6a1e10351b8 100644 --- a/content/en/network_monitoring/cloud_network_monitoring/guide/detecting_application_availability.md +++ b/content/en/network_monitoring/cloud_network_monitoring/guide/detecting_application_availability.md @@ -23,7 +23,7 @@ CNM is designed to track traffic between entities, determine which resources are To examine the a basic traffic flow between entities, take the following steps: -1. On the [Network Analytics page][1], set your **View clients as** and **View servers as** dropdown filters to group by `service` tags to examine a service-to-service flow. Here you can observe the basic traffic unit: a source IP communicating over a port to a destination IP on a port. +1. On the [Network Analytics page][1], set your {{< ui >}}View clients as{{< /ui >}} and {{< ui >}}View servers as{{< /ui >}} dropdown filters to group by `service` tags to examine a service-to-service flow. Here you can observe the basic traffic unit: a source IP communicating over a port to a destination IP on a port. {{< img src="network_performance_monitoring/guide/detecting_network_insights/cnm_service_service.png" alt="CNM analytics page, grouping by service to service with Client and Server IP highlighted">}} @@ -51,7 +51,7 @@ To analyze the cause of service latency, take the following steps: 3. Click one of the traffic paths on this page to open the side panel. The side panel provides more detailed telemetry to help you further debug your network dependencies. -4. While on the side panel view, check the **Flows** tab to determine if the communication protocol is TCP or UDP, and review metrics like RTT, Jitter, and packets sent and received. If you're investigating a high retransmit count, this information can help you identify the cause. +4. While on the side panel view, check the {{< ui >}}Flows{{< /ui >}} tab to determine if the communication protocol is TCP or UDP, and review metrics like RTT, Jitter, and packets sent and received. If you're investigating a high retransmit count, this information can help you identify the cause. {{< img src="network_performance_monitoring/guide/detecting_network_insights/cnm_sidepanel_flows.png" alt="Side panel of a traffic flow, highlighting the Flows tab">}} @@ -59,29 +59,29 @@ To analyze the cause of service latency, take the following steps: Datadog CNM consolidates relevant distributed traces, logs, and infrastructure data into a single view, allowing you to identify and trace issues back to the originating request from an application. -In the example below, check the **Traces** tab under Network Analytics to view distributed traces of requests between source and destination endpoints, which can help you pinpoint where application-level errors occur. +In the example below, check the {{< ui >}}Traces{{< /ui >}} tab under Network Analytics to view distributed traces of requests between source and destination endpoints, which can help you pinpoint where application-level errors occur. To identify if an issue is an application or network issue, take can use the following steps: -1. Navigate to [**Infrastructure** > **Cloud Network** > **Analytics**][1]. -2. In the **Summary** graphs, click a line of communication that has a lot of volume and high RTT time: +1. Navigate to [{{< ui >}}Infrastructure{{< /ui >}} > {{< ui >}}Cloud Network{{< /ui >}} > {{< ui >}}Analytics{{< /ui >}}][1]. +2. In the {{< ui >}}Summary{{< /ui >}} graphs, click a line of communication that has a lot of volume and high RTT time: {{< img src="network_performance_monitoring/guide/detecting_network_insights/cnm_isolate_series.png" alt="CNM analytics page, clicking on a path with high RTT Time">}} -3. Click **Isolate this series**. This opens a page that allows you to observe the network traffic only on this line of communication. -4. While on this page, click into one of the network communications paths, then click the **Flows** tab to observe RTT time: +3. Click {{< ui >}}Isolate this series{{< /ui >}}. This opens a page that allows you to observe the network traffic only on this line of communication. +4. While on this page, click into one of the network communications paths, then click the {{< ui >}}Flows{{< /ui >}} tab to observe RTT time: {{< img src="network_performance_monitoring/guide/detecting_network_insights/cnm_sidepanel_rtt.png" alt="CNM sidepanel, highlighting the RTT time column">}} On this page, CNM correlates network metric round-trip time (RTT) with application request latency, to help identify if the issue is a network or application issue. In this particular example, observe that the RTT time is slightly high but has come down over time and needs to be investigated further. -5. On this same page, click the **Traces** tab and investigate the **Duration** column: +5. On this same page, click the {{< ui >}}Traces{{< /ui >}} tab and investigate the {{< ui >}}Duration{{< /ui >}} column: {{< img src="network_performance_monitoring/guide/detecting_network_insights/cnm_traces_duration.png" alt="CNM sidepanel, highlighting the Traces tab and duration column">}} Observe that although network latency (RTT) is high, the application request latency (Duration) is normal, so in this case, the issue is likely network-related, and there's no need to investigate the app code. - Conversely, *if network latency is stable but application latency (Duration) is high*, the problem likely stems from the app, and you can explore code-level traces by clicking on one of the service paths in the **Traces** tab to find the root cause, which takes you to the APM flame graph relative to this service: + Conversely, *if network latency is stable but application latency (Duration) is high*, the problem likely stems from the app, and you can explore code-level traces by clicking on one of the service paths in the {{< ui >}}Traces{{< /ui >}} tab to find the root cause, which takes you to the APM flame graph relative to this service: {{< img src="network_performance_monitoring/guide/detecting_network_insights/cnm_apm_traces.png" alt="APM flame graph screenshot after clicking on a service from the CNM sidepanel traces tab">}} @@ -93,7 +93,7 @@ For complex networks in large containerized environments, Datadog's Network Map To identify if there might be a communication problem with your Kubernetes pods and their underlying services, perform the following steps: -1. On the [Network Map][2], set the **View** dropdown to `pod_name`, the **By** dropdown to "Client Availability Zone", and set the **Metric** dropdown to "Volume Sent" (this is the [metric][6] you want your edges to represent): +1. On the [Network Map][2], set the {{< ui >}}View{{< /ui >}} dropdown to `pod_name`, the {{< ui >}}By{{< /ui >}} dropdown to {{< ui >}}Client Availability Zone{{< /ui >}}, and set the {{< ui >}}Metric{{< /ui >}} dropdown to {{< ui >}}Volume Sent{{< /ui >}} (this is the [metric][6] you want your edges to represent): {{< img src="network_performance_monitoring/guide/detecting_network_insights/cnm_network_map.png" alt="CNM Network Map page showing a clustering example">}} diff --git a/content/en/network_monitoring/cloud_network_monitoring/guide/manage_traffic_costs_with_cnm.md b/content/en/network_monitoring/cloud_network_monitoring/guide/manage_traffic_costs_with_cnm.md index 817b7a0e08e..8aeb07ed00b 100644 --- a/content/en/network_monitoring/cloud_network_monitoring/guide/manage_traffic_costs_with_cnm.md +++ b/content/en/network_monitoring/cloud_network_monitoring/guide/manage_traffic_costs_with_cnm.md @@ -36,7 +36,7 @@ When Datadog migrated to Kubernetes, the process of moving stateless services wa {{< img src="network_performance_monitoring/guide/manage_traffic_costs_with_cnm/team_region_2.png" alt="Use the team tag to isolate traffic.">}} -4. To monitor costs from external traffic, scope your destination endpoints to public IPs using the **IP Type** facet. +4. To monitor costs from external traffic, scope your destination endpoints to public IPs using the {{< ui >}}IP Type{{< /ui >}} facet. {{< img src="network_performance_monitoring/guide/manage_traffic_costs_with_cnm/scope_destination_points_2.png" alt="Use the IP type facet." style="width: 40%;">}} Then group your destination by `domain` to break down external traffic volume by where it is going. Although you cannot install a Datadog Agent on public servers, Datadog can resolve IPs representing external and cloud endpoints to human-readable domain names. @@ -51,13 +51,13 @@ Cross-AZ traffic: Inter-AZ service-to-service traffic: {{< img src="network_performance_monitoring/guide/manage_traffic_costs_with_cnm/inter-az-service-to-service-traffic.png" alt="Inter-AZ service-to-service traffic">}} -You can edit your preferences using the **Filter traffic** button. In larger environments, Datadog recommends scoping to just the most significant traffic sources by moving the sliders to include only the highest-volume dependencies. +You can edit your preferences using the {{< ui >}}Filter traffic{{< /ui >}} button. In larger environments, Datadog recommends scoping to just the most significant traffic sources by moving the sliders to include only the highest-volume dependencies. {{< img src="network_performance_monitoring/guide/manage_traffic_costs_with_cnm/filter-traffic_2.png" alt="Filter your traffic" style="width: 50%;">}} ## Graphing traffic costs -Datadog recommends tracking traffic volume metrics over time in dashboards and notebooks. You can graph traffic between any two endpoints using the same queries you would make on the [Cloud Network][3] page. To do this, create a **Timeseries Widget** and select the **Network** source from the dropdown menu. +Datadog recommends tracking traffic volume metrics over time in dashboards and notebooks. You can graph traffic between any two endpoints using the same queries you would make on the [Cloud Network][3] page. To do this, create a {{< ui >}}Timeseries Widget{{< /ui >}} and select the {{< ui >}}Network{{< /ui >}} source from the dropdown menu. {{< img src="network_performance_monitoring/guide/manage_traffic_costs_with_cnm/timeseries_2.png" alt="Create a Timeseries Widget with Network metrics">}} diff --git a/content/en/network_monitoring/cloud_network_monitoring/network_analytics.md b/content/en/network_monitoring/cloud_network_monitoring/network_analytics.md index acc91b99cf9..24999949c48 100644 --- a/content/en/network_monitoring/cloud_network_monitoring/network_analytics.md +++ b/content/en/network_monitoring/cloud_network_monitoring/network_analytics.md @@ -35,11 +35,11 @@ Additionally, Datadog provides a list of default [out-of-the-box](#default-tags) {{< img src="network_performance_monitoring/network_analytics/network_diagram_with_tags.png" alt="network diagram showing how requests are seen when grouping by tags" style="width:100%;">}} -For example, if you want to see network traffic between your ordering service called `orders-app` and all of your availability zones, use `client_service:orders-app` in the search bar, and add the `client_service` and `server_availability-zone` tags in the **Group By** drop-down to visualize the traffic flow between these two sets of tags: +For example, if you want to see network traffic between your ordering service called `orders-app` and all of your availability zones, use `client_service:orders-app` in the search bar, and add the `client_service` and `server_availability-zone` tags in the {{< ui >}}Group By{{< /ui >}} drop-down to visualize the traffic flow between these two sets of tags: {{< img src="network_performance_monitoring/network_analytics/network_analytics_with_client_and_server_tag_2.png" alt="Network Analytics page showing how requests are seen when filtering on service and grouping by availability zone" style="width:90%;">}} -The default view aggregates the client and server by the `service` tag. Accordingly, each row in the table represents service-to-service aggregate connections when aggregated over a one hour time period. Select **Auto-grouped traffic** to see traffic bucketed into several commonly used tags such as `service`, `kube_service`, `short_image`, and `container_name`. +The default view aggregates the client and server by the `service` tag. Accordingly, each row in the table represents service-to-service aggregate connections when aggregated over a one hour time period. Select {{< ui >}}Auto-grouped traffic{{< /ui >}} to see traffic bucketed into several commonly used tags such as `service`, `kube_service`, `short_image`, and `container_name`. **Note**: For information on `NA/Untagged` traffic paths, see [Unresolved traffic](#unresolved-traffic). @@ -72,17 +72,17 @@ To run a recommended query, click on the tile. Hovering over the tile displays a ### Facet panels -Use the facet panels to browse all available tags on your flows or filter traffic without needing to remember exact tag names. Facet panels mirror the tags in your search bar query. Use the **Client** and **Server** tabs to switch between facet panels. +Use the facet panels to browse all available tags on your flows or filter traffic without needing to remember exact tag names. Facet panels mirror the tags in your search bar query. Use the {{< ui >}}Client{{< /ui >}} and {{< ui >}}Server{{< /ui >}} tabs to switch between facet panels. #### Custom facets -Aggregate and filter your traffic data by any tags on the network analytics page. A list of included tags is located on the left side of the screen under the **Client** and **Server** tabs, and in the **Group By** dropdown menu. +Aggregate and filter your traffic data by any tags on the network analytics page. A list of included tags is located on the left side of the screen under the {{< ui >}}Client{{< /ui >}} and {{< ui >}}Server{{< /ui >}} tabs, and in the {{< ui >}}Group By{{< /ui >}} dropdown menu. Include listed tags are `service`, `availability zone`, `env`, `environment`, `pod`, `host`, `ip`, and `port`, among others. If you want to aggregate or filter traffic by a tag that is not already in the menu, add it as a custom Facet: -1. Select the **+ Add** button on the top right of the facet panels. +1. Select the {{< ui >}}+ Add{{< /ui >}} button on the top right of the facet panels. 2. Enter the relevant tag you want to create a custom facet upon. -3. Click **Add**. +3. Click {{< ui >}}Add{{< /ui >}}. After the custom facet is created, use this tag to filter and aggregate traffic on the network analytics page and network map. All custom facets can be viewed in the bottom `Custom` section of the facet panels. @@ -107,13 +107,13 @@ For a complete list of neutral tags and their descriptions, see [Neutral tags][1 ### Group by -Groups allow you to group your data by a given tag's value. For example, if you select a grouping such as **host**, results are grouped by individual hosts. Additionally, you may have large chunks of data that are not tagged by the grouping you're interested in. In these situations, you can use **Auto-grouped traffic** to group data by whichever tags are available. +Groups allow you to group your data by a given tag's value. For example, if you select a grouping such as **host**, results are grouped by individual hosts. Additionally, you may have large chunks of data that are not tagged by the grouping you're interested in. In these situations, you can use {{< ui >}}Auto-grouped traffic{{< /ui >}} to group data by whichever tags are available. -If you want to investigate connections from all of your hosts in a single grouping, add the `client_host` and `Auto-Grouped-Servers` tags in the **Group By** dropdown. +If you want to investigate connections from all of your hosts in a single grouping, add the `client_host` and `Auto-Grouped-Servers` tags in the {{< ui >}}Group By{{< /ui >}} dropdown. {{< img src="network_performance_monitoring/network_analytics/cnm_auto-grouped_client.png" alt="NPM analytics page sorting by host and grouped by Auto-grouped traffic" style="width:90%;">}} -The **Auto-grouped traffic** option can help you identify the source of your tags. For example, hover over the individual icons to display a tooltip that indicates the tag's origin: +The {{< ui >}}Auto-grouped traffic{{< /ui >}} option can help you identify the source of your tags. For example, hover over the individual icons to display a tooltip that indicates the tag's origin: {{< img src="network_performance_monitoring/network_analytics/npm_icon_tooltip.png" alt="Hovering over the icon tooltip to display the tag source" style="width:90%;">}} @@ -127,7 +127,7 @@ To change the visualization type, click on the pencil icon in the top right corn {{< img src="network_performance_monitoring/network_analytics/summary_graph_visualization_options.png" alt="The summary graph visualization options, displaying options to adjust Y-Axis Scale with Linear, Log, Pow, and Sqrt, and to adjust Graph Type with Area, Line, Bars, Toplist, Change, and Piechart" style="width:60%;">}} -To hide a specific graph, click on the **hide graph** icon next to the pencil icon. You can display as little as one graph or as many as three graphs. To add graphs, click on the plus icon `+` on the right side of the summary graph and select the graph to add. You can also reset the graphs to the default graphs when adding a new graph. +To hide a specific graph, click on the {{< ui >}}hide graph{{< /ui >}} icon next to the pencil icon. You can display as little as one graph or as many as three graphs. To add graphs, click on the plus icon `+` on the right side of the summary graph and select the graph to add. You can also reset the graphs to the default graphs when adding a new graph. ## Table @@ -135,13 +135,13 @@ The network table breaks down the Volume, Throughput, TCP Retransmits, Round-tri {{< img src="network_performance_monitoring/network_analytics/network_table_3.png" alt="Network data table showing auto-grouped traffic and throughput columns." >}} -You can configure the columns in your table using the **Customize** gear icon (⚙️) at the top right of the table. +You can configure the columns in your table using the {{< ui >}}Customize{{< /ui >}} gear icon (⚙️) at the top right of the table. -Configure the traffic shown with the `Filter Traffic` button at the top right of the page. +Configure the traffic shown with the {{< ui >}}Filter Traffic{{< /ui >}} button at the top right of the page. {{< img src="network_performance_monitoring/network_analytics/filter_traffic_toggle.png" alt="Flow Details" style="width:50%;">}} -External traffic (to public IPs) and Datadog Agent traffic is shown by default. To narrow down your view, you can choose to toggle off the `Show Datadog Traffic` and `Show External Traffic` toggles. +External traffic (to public IPs) and Datadog Agent traffic is shown by default. To narrow down your view, you can choose to toggle off the {{< ui >}}Show Datadog Traffic{{< /ui >}} and {{< ui >}}Show External Traffic{{< /ui >}} toggles. ### Unresolved traffic @@ -154,7 +154,7 @@ Unresolved client and server tags are marked as `N/A`. A traffic client or serve Monitoring unresolved traffic is essential for identifying blind spots in network visibility and ensuring all relevant traffic is accounted for in performance and security analysis. -Use the **Show N/A (Unresolved Traffic)** toggle in the upper right corner of the data table to filter out aggregate connections with unresolved (`N/A`) clients or servers. +Use the {{< ui >}}Show N/A (Unresolved Traffic){{< /ui >}} toggle in the upper right corner of the data table to filter out aggregate connections with unresolved (`N/A`) clients or servers. ### Pivot to network path @@ -166,16 +166,16 @@ Click the three dots menu in the analytics table to pivot to [network path][11] Organize and share views of traffic data. Saved Views make debugging faster and empower collaboration. For instance, you can create a view, save it for the future for common queries, and copy its link to share network data with your teammates. -- To save a view: click the **+ Save** button and name the view to record your current query, table configuration, and graph metric selections. -- To load a view: click **Views** at the top left to see your Saved Views and select a view from the list. -- To rename a view: hover over a view in the Saved Views list and click the gear icon to **Edit name**. -- To share a view: hover over a view in the Saved Views list and click the link icon to **Copy permalink**. +- To save a view: click the {{< ui >}}+ Save{{< /ui >}} button and name the view to record your current query, table configuration, and graph metric selections. +- To load a view: click {{< ui >}}Views{{< /ui >}} at the top left to see your Saved Views and select a view from the list. +- To rename a view: hover over a view in the Saved Views list and click the gear icon to {{< ui >}}Edit name{{< /ui >}}. +- To share a view: hover over a view in the Saved Views list and click the link icon to {{< ui >}}Copy permalink{{< /ui >}}. To learn more, see the [Saved Views][5] documentation. ## Sidepanel -The sidepanel provides contextual telemetry to help you debug network dependencies. Use the Flows, Logs, Traces, and Processes tabs to determine whether a high retransmit count or latency in traffic between two endpoints is due to: +The sidepanel provides contextual telemetry to help you debug network dependencies. Use the {{< ui >}}Flows{{< /ui >}}, {{< ui >}}Logs{{< /ui >}}, {{< ui >}}Traces{{< /ui >}}, and {{< ui >}}Processes{{< /ui >}} tabs to determine whether a high retransmit count or latency in traffic between two endpoints is due to: - A spike in traffic volume from a particular port or IP. - Heavy processes consuming the CPU or memory of the destination endpoint. @@ -191,13 +191,13 @@ The top of the sidepanel displays common client and server tags shared by the in ### Traces -The **Traces** tab shows APM traces associated with the selected network flow. Use this tab to pivot from a network-level issue—such as high latency or elevated retransmit counts—to the application traces for the services involved. +The {{< ui >}}Traces{{< /ui >}} tab shows APM traces associated with the selected network flow. Use this tab to pivot from a network-level issue—such as high latency or elevated retransmit counts—to the application traces for the services involved. For more information, see [APM][17]. ### Security -The **Security** tab highlights potential network threats and findings detected by [Workload Protection][6] and [Cloud Security Misconfigurations][7]. These signals are generated when Datadog detects network activity that matches a [detection or compliance rule][8], or if there are other threats and misconfigurations related to the selected network flow. +The {{< ui >}}Security{{< /ui >}} tab highlights potential network threats and findings detected by [Workload Protection][6] and [Cloud Security Misconfigurations][7]. These signals are generated when Datadog detects network activity that matches a [detection or compliance rule][8], or if there are other threats and misconfigurations related to the selected network flow. For a complete reference of default tags available for querying and filtering network traffic, see [Tags Reference][16]. @@ -341,7 +341,7 @@ Starting with Agent 7.17+, the Agent resolves IPs to human-readable domain names NAT is a tool used by Kubernetes and other systems to route traffic between containers. When investigating a specific dependency (for example, service to service), you can use the presence or absence of pre-NAT IPs to distinguish between Kubernetes-native services, which do their own routing, and services that rely on external clients for routing. This feature does not include resolution of NAT gateways. -To view pre-NAT and post-NAT IPs, use the **Show pre-NAT IPs** toggle in the table settings. When this setting is toggled off, IPs shown in the **Client IP** and **Server IP** columns are by default post-NAT IPs. In cases where you have multiple pre-NAT IPs for one post-NAT IP, the top 5 most common pre-NAT IPs are displayed. `pre_nat.ip` is a tag like any other in the product, so you can use it to aggregate and filter traffic. +To view pre-NAT and post-NAT IPs, use the {{< ui >}}Show pre-NAT IPs{{< /ui >}} toggle in the table settings. When this setting is toggled off, IPs shown in the {{< ui >}}Client IP{{< /ui >}} and {{< ui >}}Server IP{{< /ui >}} columns are by default post-NAT IPs. In cases where you have multiple pre-NAT IPs for one post-NAT IP, the top 5 most common pre-NAT IPs are displayed. `pre_nat.ip` is a tag like any other in the product, so you can use it to aggregate and filter traffic. {{< img src="network_performance_monitoring/network_analytics/prenat_ip2.png" alt="pre-NAT IPs" >}} diff --git a/content/en/network_monitoring/cloud_network_monitoring/network_health.md b/content/en/network_monitoring/cloud_network_monitoring/network_health.md index 8b05379b534..eec33bf8451 100644 --- a/content/en/network_monitoring/cloud_network_monitoring/network_health.md +++ b/content/en/network_monitoring/cloud_network_monitoring/network_health.md @@ -32,7 +32,7 @@ This page describes the sections of the Network Health page and the issues and i ## Recommended Actions -The **Recommended Actions** section highlights the most critical issues detected in your network. These are prioritized based on: +The {{< ui >}}Recommended Actions{{< /ui >}} section highlights the most critical issues detected in your network. These are prioritized based on: 1. **Severity**: Whether the issue is actively blocking traffic 2. **Impact**: How critical the affected services are to your infrastructure @@ -43,13 +43,13 @@ Each recommended action displays: - The impacted client service (the service making requests) - The impacted server service (the service receiving requests) -Hover over a service name to pivot to APM, or click **Remediate** to view remediation steps along with options to create a [New Workflow][2], [Create a Case][3], or [Declare an Incident][4]. +Hover over a service name to pivot to APM, or click {{< ui >}}Remediate{{< /ui >}} to view remediation steps along with options to create a [{{< ui >}}New Workflow{{< /ui >}}][2], [{{< ui >}}Create a Case{{< /ui >}}][3], or [{{< ui >}}Declare an Incident{{< /ui >}}][4]. {{< img src="network_performance_monitoring/network_health/recommended_actions_side_panel.png" alt="Recommended actions side panel of an affected service, showing remediation steps." style="width:100%;">}} ## Watchdog Insights -The **Watchdog Insights** section displays anomalous network behavior detected by Watchdog, focusing on spikes in TCP retransmits. An increase in retransmits compared to your baseline (typically the previous week) often indicates an underlying network issue. See the [Watchdog Insights][5] documentation for more information. +The {{< ui >}}Watchdog Insights{{< /ui >}} section displays anomalous network behavior detected by Watchdog, focusing on spikes in TCP retransmits. An increase in retransmits compared to your baseline (typically the previous week) often indicates an underlying network issue. See the [Watchdog Insights][5] documentation for more information. Use Watchdog Insights to: - Detect potential problems early @@ -58,23 +58,23 @@ Use Watchdog Insights to: ## TLS certificates -Expired or expiring TLS certificates can block secure connections between services, resulting in dropped traffic. The **TLS Certificates** section lists: +Expired or expiring TLS certificates can block secure connections between services, resulting in dropped traffic. The {{< ui >}}TLS Certificates{{< /ui >}} section lists: -- **Expired certificates**: Certificates that are invalid and blocking traffic -- **Expiring certificates**: Certificates about to expire -- **Impacted services**: The client and server services affected by each certificate issue (note that the client "service" may be an AWS load balancer, such as an Application Load Balancer) +- {{< ui >}}Expired certificates{{< /ui >}}: Certificates that are invalid and blocking traffic +- {{< ui >}}Expiring certificates{{< /ui >}}: Certificates about to expire +- {{< ui >}}Impacted services{{< /ui >}}: The client and server services affected by each certificate issue (note that the client "service" may be an AWS load balancer, such as an Application Load Balancer) -Click an expired certificate to view steps for renewing it in AWS, or to create a [New Workflow][2], [Create a Case][3], or [Declare an Incident][4]. +Click an expired certificate to view steps for renewing it in AWS, or to create a [{{< ui >}}New Workflow{{< /ui >}}][2], [{{< ui >}}Create a Case{{< /ui >}}][3], or [{{< ui >}}Declare an Incident{{< /ui >}}][4]. ## DNS failures DNS misconfigurations can route traffic to incorrect destinations, preventing services from communicating. These failures typically result from changes made to DNS routing configurations. -The **DNS Failures** section shows: +The {{< ui >}}DNS Failures{{< /ui >}} section shows: -- **Failure reason**: The cause of the DNS failure -- **Impacted DNS server**: The DNS server experiencing elevated failure rates -- **Impacted services**: The client and server services affected by the DNS failure +- {{< ui >}}Failure reason{{< /ui >}}: The cause of the DNS failure +- {{< ui >}}Impacted DNS server{{< /ui >}}: The DNS server experiencing elevated failure rates +- {{< ui >}}Impacted services{{< /ui >}}: The client and server services affected by the DNS failure **Failure reasons**: @@ -87,7 +87,7 @@ TIMEOUT SERVFAIL : The DNS server failed to process a query, often due to a server-side problem. -Hover over a service name to pivot to APM, or click on a recommended action to view remediation steps along with options to create a [New workflow][2], [Create a Case][3], or [Declare an Incident][4]. +Hover over a service name to pivot to APM, or click on a recommended action to view remediation steps along with options to create a [{{< ui >}}New workflow{{< /ui >}}][2], [{{< ui >}}Create a Case{{< /ui >}}][3], or [{{< ui >}}Declare an Incident{{< /ui >}}][4]. ## Security groups @@ -95,23 +95,23 @@ Security groups control traffic flow in cloud environments through allow and den **Note**: Security group monitoring is available only for AWS and requires [EC2 resource collection][6] to be enabled in your AWS integration. -The **Security Groups** section identifies: +The {{< ui >}}Security Groups{{< /ui >}} section identifies: - Security group misconfigurations blocking traffic - The specific services unable to communicate - Recent changes to security group rules **Resolution**: 1. Click on a security group issue to open the side panel. -2. Select **View in AWS** to navigate to the AWS console. +2. Select {{< ui >}}View in AWS{{< /ui >}} to navigate to the AWS console. 3. Review and modify the inbound and outbound rules. -4. Use the **Infrastructure Change Tracking** data in the side panel to identify when the change occurred and revert it if necessary. +4. Use the {{< ui >}}Infrastructure Change Tracking{{< /ui >}} data in the side panel to identify when the change occurred and revert it if necessary. ## Filtering Use the filters at the top of the page to narrow the scope of displayed issues. Available filters include: -- **Service**: View issues affecting a particular service -- **Team**: View issues owned by a specific team +- {{< ui >}}Service{{< /ui >}}: View issues affecting a particular service +- {{< ui >}}Team{{< /ui >}}: View issues owned by a specific team ## Further Reading diff --git a/content/en/network_monitoring/cloud_network_monitoring/network_map.md b/content/en/network_monitoring/cloud_network_monitoring/network_map.md index 7c8c6c53de7..87b20d9d861 100644 --- a/content/en/network_monitoring/cloud_network_monitoring/network_map.md +++ b/content/en/network_monitoring/cloud_network_monitoring/network_map.md @@ -31,16 +31,16 @@ The network map visualizes data collected by the Datadog Agent automatically. On ## Usage -Select the **Map** tab to configure your network map: +Select the {{< ui >}}Map{{< /ui >}} tab to configure your network map: {{< img src="network_performance_monitoring/network_map/network_map_search.png" alt="Network map page search bar" >}} -1. Choose the tag you want your **Nodes** to represent with the first selector at the top of the page. Available tags are the same as those offered in the network page. +1. Choose the tag you want your {{< ui >}}Nodes{{< /ui >}} to represent with the first selector at the top of the page. Available tags are the same as those offered in the network page. {{< img src="network_performance_monitoring/network_map/network_map_search_additional_filter.png" alt="Network map page search bar" >}} - - If there are too many nodes, a second tag is automatically added to the grouping. You can change the tag in the **By** dropdown menu. See [Clustering](#map-clusters) more information. -2. Select the metric you want your **Edges** to represent: + - If there are too many nodes, a second tag is automatically added to the grouping. You can change the tag in the {{< ui >}}By{{< /ui >}} dropdown menu. See [Clustering](#map-clusters) more information. +2. Select the metric you want your {{< ui >}}Edges{{< /ui >}} to represent: - Throughput sent - Throughput received @@ -56,7 +56,7 @@ Select the **Map** tab to configure your network map: - Filter your tags based on a fuzzy string match. {{< img src="network_performance_monitoring/network_map/filtering_npm_map_search.mp4" alt="Filtering network map with search" video="true" >}} - - **Show unresolved traffic**. + - {{< ui >}}Show unresolved traffic{{< /ui >}}. - Hide network traffic outside a specified percentile range of the active network metric. {{< img src="network_performance_monitoring/network_map/filtering_network_map.mp4" alt="Filtering network map flows" video="true" width="50%" >}} @@ -66,7 +66,7 @@ Hovering over a node highlights it and animates the directionality of the networ {{< img src="network_performance_monitoring/network_map/network_map_highlight.mp4" alt="Network Map" video="true" width="70%" >}} -Click on a node and select _Inspect_ from the menu to contextualize it within the larger network: +Click on a node and select {{< ui >}}Inspect{{< /ui >}} from the menu to contextualize it within the larger network: {{< img src="network_performance_monitoring/network_map/network_entity_zoom.mp4" alt="Network entity zoom" video="true" width="70%">}} diff --git a/content/en/network_monitoring/cloud_network_monitoring/setup.md b/content/en/network_monitoring/cloud_network_monitoring/setup.md index 7b965d7c07f..2fea22f1a14 100644 --- a/content/en/network_monitoring/cloud_network_monitoring/setup.md +++ b/content/en/network_monitoring/cloud_network_monitoring/setup.md @@ -621,7 +621,7 @@ For additional information around these capabilities, see [Cloud service enhance ### Failed connections -Failed Connections allows collection and reporting of TCP failures including [resets, refusals, and timeouts][14]. This feature is enabled by default in Agent version `7.59+`, and it is accessible on the [CNM Analytics][15] page in the **Customize** menu by turning on the **Failures** toggle. +Failed Connections allows collection and reporting of TCP failures including [resets, refusals, and timeouts][14]. This feature is enabled by default in Agent version `7.59+`, and it is accessible on the [CNM Analytics][15] page in the {{< ui >}}Customize{{< /ui >}} menu by turning on the {{< ui >}}Failures{{< /ui >}} toggle. **Note**: If some Agents in your infrastructure are running a version earlier than `7.59`, you might encounter failures being under-reported. CNM advises maintaining the same Agent version across _all_ hosts. diff --git a/content/en/network_monitoring/devices/config_management.md b/content/en/network_monitoring/devices/config_management.md index 75f3cd83302..a1000219913 100644 --- a/content/en/network_monitoring/devices/config_management.md +++ b/content/en/network_monitoring/devices/config_management.md @@ -89,14 +89,14 @@ Network Configuration Management is accessible from the NDM device view in Netwo 1. Navigate to [Network Device Monitoring][3]. 2. Select a device from the device list or from any NDM visualization such as [Device Geomap][4] or the [Device Topology][5] map. -3. Open the **Configuration** tab in the NDM device view. +3. Open the {{< ui >}}Configuration{{< /ui >}} tab in the NDM device view. {{< img src="/network_device_monitoring/config_mgmt/config_tab.png" alt="The NDM device view, highlighting the Configuration tab." style="width:100%;" >}} On the Configuration tab, you can filter what the configuration list displays: - - **All**: Shows both running and startup configurations - - **Running**: The active, live configuration running on the device - - **Startup**: The saved configuration that loads when the device boots + - {{< ui >}}All{{< /ui >}}: Shows both running and startup configurations + - {{< ui >}}Running{{< /ui >}}: The active, live configuration running on the device + - {{< ui >}}Startup{{< /ui >}}: The saved configuration that loads when the device boots ### Time picker and retention @@ -122,7 +122,7 @@ You can scroll through the configuration to investigate the device state during To see what changed between configuration versions: 1. Select two configurations from the history list or timeline using the checkboxes. -2. Click **Compare Two Configs** to open the comparison view. +2. Click {{< ui >}}Compare Two Configs{{< /ui >}} to open the comparison view. {{< img src="/network_device_monitoring/config_mgmt/compare_two_configs_3.png" alt="Network Device Management configuration tab, highlighting the Compare Two Configs option." style="width:100%;" >}} diff --git a/content/en/network_monitoring/devices/geomap.md b/content/en/network_monitoring/devices/geomap.md index ca08c9823b0..c883b261592 100644 --- a/content/en/network_monitoring/devices/geomap.md +++ b/content/en/network_monitoring/devices/geomap.md @@ -45,20 +45,20 @@ Configure device locations using the following steps: {{< img src="network_device_monitoring/geomap/device_geomap_geolocation_tag.png" alt="The NDM device view of a device, highlighting the `geolocation:paris-office` tag." style="width:100%;" >}} -2. From the Device Geomap page, click **Add locations** in the top right corner. This opens the [Geomap locations settings][3] page, which provides multiple tabs to manage device locations: +2. From the Device Geomap page, click {{< ui >}}Add locations{{< /ui >}} in the top right corner. This opens the [Geomap locations settings][3] page, which provides multiple tabs to manage device locations: - - **All**: Displays all devices with `geolocation` tags, regardless of their mapping status. - - **Needs Coordinates**: Shows devices tagged with `geolocation` values that don't have corresponding location coordinates configured. - - **On Map**: Lists tagged devices with configured coordinates that are displayed on the Geomap. - - **Unused**: Shows location mappings (coordinates) that have been configured but are not associated with any tagged devices. + - {{< ui >}}All{{< /ui >}}: Displays all devices with `geolocation` tags, regardless of their mapping status. + - {{< ui >}}Needs Coordinates{{< /ui >}}: Shows devices tagged with `geolocation` values that don't have corresponding location coordinates configured. + - {{< ui >}}On Map{{< /ui >}}: Lists tagged devices with configured coordinates that are displayed on the Geomap. + - {{< ui >}}Unused{{< /ui >}}: Shows location mappings (coordinates) that have been configured but are not associated with any tagged devices. {{< img src="network_device_monitoring/geomap/settings_on_map.png" alt="Settings page of Device Geomap, highlighting the All tab." style="width:100%;" >}} -3. On the settings page, click **+ Add mapping** and enter the location value along with its latitude and longitude coordinates in [decimal degrees][10] notation. +3. On the settings page, click {{< ui >}}+ Add mapping{{< /ui >}} and enter the location value along with its latitude and longitude coordinates in [decimal degrees][10] notation. {{< img src="network_device_monitoring/geomap/add_mapping.png" alt="Settings page of Device Geomap, displaying the Add Mapping screen with fields for location, latitude, and longitude." style="width:80%;" >}} -4. To bulk import locations, select **Import from CSV** from the **+ Add mapping** dropdown. The CSV form provides a template you can download and use. +4. To bulk import locations, select {{< ui >}}Import from CSV{{< /ui >}} from the {{< ui >}}+ Add mapping{{< /ui >}} dropdown. The CSV form provides a template you can download and use. {{< img src="network_device_monitoring/geomap/mapping_csv.png" alt="Settings page of Device Geomap, displaying the Import from CSV option." style="width:90%;" >}} @@ -82,7 +82,7 @@ If your CSV file fails to upload despite appearing correct, verify the following - No missing commas between fields - No extra spaces or special characters -- Proper formatting according to the CSV template (available for download in the **+ Add mapping > Import from CSV** form) +- Proper formatting according to the CSV template (available for download in the {{< ui >}}+ Add mapping{{< /ui >}} > {{< ui >}}Import from CSV{{< /ui >}} form) ### Tagged device does not appear on map diff --git a/content/en/network_monitoring/devices/ping.md b/content/en/network_monitoring/devices/ping.md index a9d927ad624..1b81e2cad52 100644 --- a/content/en/network_monitoring/devices/ping.md +++ b/content/en/network_monitoring/devices/ping.md @@ -114,11 +114,11 @@ ping: {{% /tab %}} {{< /tabs >}} -After ping is enabled on your network devices, the **Ping State** column appears in [Network Device Monitoring][6], displaying the ping status for each device. +After ping is enabled on your network devices, the {{< ui >}}Ping State{{< /ui >}} column appears in [Network Device Monitoring][6], displaying the ping status for each device. {{< img src="/network_device_monitoring/snmp/ping_state_status_2.png" alt="The status column in the NDM UI showing the Ping state toggle enabled with the ping state status column highlighted" style="width:100%;">}} -The following are the status names in the **Ping State** column and their descriptions: +The following are the status names in the {{< ui >}}Ping State{{< /ui >}} column and their descriptions: | Status name | Description | |--------------|------------------------------------------------------| diff --git a/content/en/network_monitoring/devices/profiles/device_profiles.md b/content/en/network_monitoring/devices/profiles/device_profiles.md index 95711fb70d5..03d987837ec 100644 --- a/content/en/network_monitoring/devices/profiles/device_profiles.md +++ b/content/en/network_monitoring/devices/profiles/device_profiles.md @@ -66,43 +66,43 @@ For advanced profile configuration, see [Build an NDM Profile][3]. The recommended entry point for the SNMP Profile Manager is from a single device in NDM. Every device matches to a profile, either a custom profile or a generic Datadog-provided one. Editing a profile from a device automatically creates a custom version of that profile on your behalf, so you never need to create a profile from scratch. -1. Navigate to [**Infrastructure > Network Devices**][15]. +1. Navigate to [{{< ui >}}Infrastructure{{< /ui >}} > {{< ui >}}Network Devices{{< /ui >}}][15]. 2. Click on a device to open the device side panel. -3. Click the **View all metrics** to view the list of metrics being automatically collected for the device. +3. Click {{< ui >}}View all metrics{{< /ui >}} to view the list of metrics being automatically collected for the device. {{< img src="/network_device_monitoring/profile_onboarding/ndm_view_all_metrics.png" alt="The NDM device side panel showing the Metrics section with the View all metrics button highlighted" style="width:90%;">}} -4. The **Metrics** tab opens, showing all metrics collected for the device. Use the left sidebar to browse by category: **Alerting Metrics**, **Starred Metrics**, **Key Metrics**, and **Additional Metrics**. +4. The {{< ui >}}Metrics{{< /ui >}} tab opens, showing all metrics collected for the device. Use the left sidebar to browse by category: {{< ui >}}Alerting Metrics{{< /ui >}}, {{< ui >}}Starred Metrics{{< /ui >}}, {{< ui >}}Key Metrics{{< /ui >}}, and {{< ui >}}Additional Metrics{{< /ui >}}. {{< img src="/network_device_monitoring/profile_onboarding/profile_manager_metrics_tab.png" alt="The NDM device Metrics tab showing metric graphs and a left sidebar with categories including Alerting Metrics, Starred Metrics, Key Metrics, Additional Metrics, and SNMP Profile" style="width:90%;">}} -5. To open the profile editor and manage which metrics are collected, click **SNMP Profile** in the sidebar. +5. To open the profile editor and manage which metrics are collected, click {{< ui >}}SNMP Profile{{< /ui >}} in the sidebar. {{< img src="/network_device_monitoring/profile_onboarding/ndm_metrics_tab.png" alt="The NDM device Metrics tab with the SNMP Profile option highlighted in the left sidebar" style="width:90%;">}} - This opens the profile editor in the **Metrics** tab, containing the list of all available metrics for the devices covered by the profile, organized by name, MIB, OID, category, and compatibility. This is the primary view for controlling what data Datadog collects from your devices. You can filter the metric list by category or use the search bar to find specific metrics by name or OID. + This opens the profile editor in the {{< ui >}}Metrics{{< /ui >}} tab, containing the list of all available metrics for the devices covered by the profile, organized by name, MIB, OID, category, and compatibility. This is the primary view for controlling what data Datadog collects from your devices. You can filter the metric list by category or use the search bar to find specific metrics by name or OID. -6. To enable a metric, click the **Enable** toggle next to the metric name. To disable a metric, click the toggle again. Changes are not applied until you save and deploy the profile. +6. To enable a metric, click the {{< ui >}}Enable{{< /ui >}} toggle next to the metric name. To disable a metric, click the toggle again. Changes are not applied until you save and deploy the profile. {{< img src="/network_device_monitoring/profile_onboarding/ndm_profile_editor.png" alt="The SNMP Profile Manager profile editor showing the Metrics tab with all available metrics listed by name, MIB, OID, category, and compatibility" style="width:90%;">}} ### Device coverage -The **Device Coverage** tab shows which network devices are associated with a profile and how the profile is applied. Use this view to verify device associations, filter devices by attributes, and identify SNMP collection issues. +The {{< ui >}}Device Coverage{{< /ui >}} tab shows which network devices are associated with a profile and how the profile is applied. Use this view to verify device associations, filter devices by attributes, and identify SNMP collection issues. {{< img src="/network_device_monitoring/profile_onboarding/ndm_device_coverage.png" alt="The Device Coverage tab showing a list of devices with their IP addresses, SysObjectIDs, tags, and last SNMP walk status" style="width:90%;">}} Use the filters at the top of the table to narrow results by SysObjectID, SysType, vendor, model, device type, or device name. -To update which devices are associated with the profile, click **Manage Devices**. From there you can: +To update which devices are associated with the profile, click {{< ui >}}Manage Devices{{< /ui >}}. From there you can: - Search for devices to add or select object IDs to remove. Removing an object ID removes all matching devices from the profile's coverage. - Filter the device list by device type, name, or other attributes. #### SNMP walk status -The **Last SNMP walk** column indicates whether Datadog was able to successfully query the device: +The {{< ui >}}Last SNMP walk{{< /ui >}} column indicates whether Datadog was able to successfully query the device: - **Failed**: The SNMP walk did not complete successfully. Metrics may be missing or incomplete. - **Timestamp**: Indicates the date and time of the last successful SNMP walk. @@ -115,11 +115,11 @@ If SNMP walks are failing, verify that: ### Advanced options -Click **Advanced Options** to access device metadata and global tag configuration. These settings are not required for most use cases. +Click {{< ui >}}Advanced Options{{< /ui >}} to access device metadata and global tag configuration. These settings are not required for most use cases. #### Device metadata -The **Device metadata** section defines how Datadog maps SNMP OIDs to device attributes. Each metadata field corresponds to a standard device property, such as: +The {{< ui >}}Device metadata{{< /ui >}} section defines how Datadog maps SNMP OIDs to device attributes. Each metadata field corresponds to a standard device property, such as: - Device name - Vendor @@ -141,54 +141,54 @@ Click the pencil icon to edit a metadata field. Metadata is displayed on the [Ne The following table describes the different modification options for a metadata field: | Modification | Description | |-----------------|-----------------------------------------------------------------------------------------------------| -| No Modification | The device's returned value is used directly as the tag value. | -| Format | This can be [mac_address][5] or [ip_address][6]. | -| Extract Value | A regular expression used to [extract][7] the tag value from the SNMP value provided by the device. | -| Mapping | See the [profile format reference][8]. | +| {{< ui >}}No Modification{{< /ui >}} | The device's returned value is used directly as the tag value. | +| {{< ui >}}Format{{< /ui >}} | This can be [mac_address][5] or [ip_address][6]. | +| {{< ui >}}Extract Value{{< /ui >}} | A regular expression used to [extract][7] the tag value from the SNMP value provided by the device. | +| {{< ui >}}Mapping{{< /ui >}} | See the [profile format reference][8]. | #### Global tags -Use **Global tags** to apply tags to all metrics and device-level metadata for devices associated with the profile. Global tags help standardize tagging across similar devices and add context such as environment, location, or ownership. +Use {{< ui >}}Global tags{{< /ui >}} to apply tags to all metrics and device-level metadata for devices associated with the profile. Global tags help standardize tagging across similar devices and add context such as environment, location, or ownership. {{< img src="/network_device_monitoring/profile_onboarding/ndm_global_tags.png" alt="The Advanced Options tab with Global tags selected, showing a table of tag names and their OID values with an Add global tag button" style="width:90%;">}} ### Explore metric packs -Metric packs are curated sets of metrics you can enable in bulk. They are accessible from the **Metrics** tab and provide AI-guided recommendations based on your devices. +Metric packs are curated sets of metrics you can enable in bulk. They are accessible from the {{< ui >}}Metrics{{< /ui >}} tab and provide AI-guided recommendations based on your devices. {{< img src="/network_device_monitoring/profile_onboarding/ndm_metric_packs.png" alt="The Metrics tab showing the Start with metric packs banner at the top and the Metric packs button highlighted in the top right corner" style="width:90%;">}} To add a metric pack: -1. From the **Metrics** tab, click **Metric packs** in the top right corner, or click **View All** in the **Start with metric packs** banner. -2. In the **Add metric pack** modal, browse all available packs or click **Suggested packs** to view AI-guided recommendations. +1. From the {{< ui >}}Metrics{{< /ui >}} tab, click {{< ui >}}Metric packs{{< /ui >}} in the top right corner, or click {{< ui >}}View All{{< /ui >}} in the {{< ui >}}Start with metric packs{{< /ui >}} banner. +2. In the {{< ui >}}Add metric pack{{< /ui >}} modal, browse all available packs or click {{< ui >}}Suggested packs{{< /ui >}} to view AI-guided recommendations. 3. Click a pack to preview its included metrics, global tags, and metadata. -4. Click **Add metric pack** to enable all metrics in the pack at once. +4. Click {{< ui >}}Add metric pack{{< /ui >}} to enable all metrics in the pack at once. {{< img src="/network_device_monitoring/profile_onboarding/ndm_add_metric_pack.png" alt="The Add metric pack modal showing the pack list on the left and a preview of the selected pack's metrics, global tags, and metadata on the right" style="width:90%;">}} ## Inventory page -To view all profiles in one place, navigate to [**Infrastructure > Network Devices > Settings**][1] and click **SNMP Profile Manager** in the left sidebar. This page lists all profiles, both Datadog out-of-the-box profiles and any custom profiles you have created. +To view all profiles in one place, navigate to [{{< ui >}}Infrastructure{{< /ui >}} > {{< ui >}}Network Devices{{< /ui >}} > {{< ui >}}Settings{{< /ui >}}][1] and click {{< ui >}}SNMP Profile Manager{{< /ui >}} in the left sidebar. This page lists all profiles, both Datadog out-of-the-box profiles and any custom profiles you have created. {{< img src="/network_device_monitoring/profile_onboarding/snmp_profile_manager.png" alt="The SNMP Profile Manager page showing a list of profiles with their name, vendor, device coverage, and last update columns" style="width:90%;">}} -Use the **Device vendor** filter or the search bar to narrow the list by profile name, vendor, or device name. Toggle **Show only profiles with matching devices** to hide profiles with no associated devices. +Use the {{< ui >}}Device vendor{{< /ui >}} filter or the search bar to narrow the list by profile name, vendor, or device name. Toggle **Show only profiles with matching devices** to hide profiles with no associated devices. -If Agents are misconfigured for Remote Config, a warning banner appears at the top of the page. Click **Fix Agents** to resolve the issue. +If Agents are misconfigured for Remote Config, a warning banner appears at the top of the page. Click {{< ui >}}Fix Agents{{< /ui >}} to resolve the issue. To open the profile editor, click on any profile. For Datadog-provided profiles, editing creates a custom version on your behalf. Click the three-dot menu to the right of a profile row to: -- **Edit profile**: Open the profile editor for that profile. -- **Delete profile**: Permanently remove a custom profile. -- **Review related devices**: Navigate to NDM filtered to the devices matched to that profile. +- {{< ui >}}Edit profile{{< /ui >}}: Open the profile editor for that profile. +- {{< ui >}}Delete profile{{< /ui >}}: Permanently remove a custom profile. +- {{< ui >}}Review related devices{{< /ui >}}: Navigate to NDM filtered to the devices matched to that profile. ### Download profiles -To download profiles as YAML files, click **Download Profiles** in the top right corner of the page. This generates a `.zip` bundle containing the `yaml` files for your custom profiles. To apply profiles manually to Agents: +To download profiles as YAML files, click {{< ui >}}Download Profiles{{< /ui >}} in the top right corner of the page. This generates a `.zip` bundle containing the `yaml` files for your custom profiles. To apply profiles manually to Agents: 1. Place the `yaml` files in the [profile directory][13] on each relevant installed Agent. 2. Restart the Datadog Agent. @@ -198,13 +198,13 @@ To download profiles as YAML files, click **Download Profiles** in the top right To upload existing SNMP profiles to the Profile Manager: -1. Navigate to [**Infrastructure > Network Devices > Settings**][1] and click **SNMP Profile Manager** in the left sidebar. -2. Click **Upload Profiles** in the top right corner of the page. -3. In the upload modal, drag and drop a `.zip` file or click **browse files** to select one. The `.zip` file must contain one or more SNMP profiles in `.yaml` format. +1. Navigate to [{{< ui >}}Infrastructure{{< /ui >}} > {{< ui >}}Network Devices{{< /ui >}} > {{< ui >}}Settings{{< /ui >}}][1] and click {{< ui >}}SNMP Profile Manager{{< /ui >}} in the left sidebar. +2. Click {{< ui >}}Upload Profiles{{< /ui >}} in the top right corner of the page. +3. In the upload modal, drag and drop a `.zip` file or click {{< ui >}}browse files{{< /ui >}} to select one. The `.zip` file must contain one or more SNMP profiles in `.yaml` format. {{< img src="/network_device_monitoring/profile_onboarding/upload_custom_profile_2.png" alt="The Upload custom SNMP profile modal with a drag-and-drop area for uploading a .zip file containing SNMP profiles in .yaml format" style="width:60%;">}} -4. Click **Upload profiles**. +4. Click {{< ui >}}Upload profiles{{< /ui >}}. After the upload completes, the profiles are available in the profile editor. You can then manage metrics, device coverage, and advanced options for the uploaded profiles the same way as any other custom profile. diff --git a/content/en/network_monitoring/devices/snmp_traps.md b/content/en/network_monitoring/devices/snmp_traps.md index f5eb26ab6d1..f22b44d8675 100644 --- a/content/en/network_monitoring/devices/snmp_traps.md +++ b/content/en/network_monitoring/devices/snmp_traps.md @@ -63,7 +63,7 @@ After configuration, SNMP traps are forwarded as logs to Datadog. You can find t
Even though SNMP traps are forwarded as logs, logs_enabled does not need to be set to true.
-You can also view SNMP traps directly from the NDM device view. Select a device in [**Infrastructure > Network Devices**][8] and click the **Events** tab. Syslog messages and SNMP traps are combined in a single view. Use the filters to narrow results by event type. +You can also view SNMP traps directly from the NDM device view. Select a device in [{{< ui >}}Infrastructure{{< /ui >}} > {{< ui >}}Network Devices{{< /ui >}}][8] and click the {{< ui >}}Events{{< /ui >}} tab. Syslog messages and SNMP traps are combined in a single view. Use the filters to narrow results by event type. {{< img src="network_device_monitoring/network_topology_map/events.png" alt="The NDM device view with the Events tab open, showing Syslog messages and SNMP traps." style="width:100%;" >}} diff --git a/content/en/network_monitoring/devices/summary.md b/content/en/network_monitoring/devices/summary.md index fcf515c5f5e..a0080d3113b 100644 --- a/content/en/network_monitoring/devices/summary.md +++ b/content/en/network_monitoring/devices/summary.md @@ -35,31 +35,31 @@ The Summary Page is organized into sections that each cover a different aspect o | Poor | Critical thresholds have been crossed on multiple devices or interfaces. | | Unknown | Not enough data is available to assess health. | -To customize your view, use the filter bar to scope the page by device tag (for example, `device_namespace`, `device_vendor`, `device_type`, or `geolocation`). The default time range is **Past 2 Hours**. +To customize your view, use the filter bar to scope the page by device tag (for example, `device_namespace`, `device_vendor`, `device_type`, or `geolocation`). The default time range is {{< ui >}}Past 2 Hours{{< /ui >}}. ### Network health -The **Network health** section summarizes your overall network state. +The {{< ui >}}Network health{{< /ui >}} section summarizes your overall network state. {{< img src="network_device_monitoring/summary/network_health.png" alt="The Network health section showing a Bits AI summary on the left and a topology view with health-coded nodes on the right." style="width:100%;" >}} -A Bits AI summary explains the current state of your network. It highlights affected devices, interfaces, and any recent configuration changes that may correlate with the observed behavior. Click **Chat with Bits Assistant** to ask follow-up questions. +A Bits AI summary explains the current state of your network. It highlights affected devices, interfaces, and any recent configuration changes that may correlate with the observed behavior. Click {{< ui >}}Chat with Bits Assistant{{< /ui >}} to ask follow-up questions. -Below the summary, a status panel shows the total device count broken down by status, the number of active monitor alerts and warnings, and the number of active issues. Click **View Health** to open the [Device Health][5] view. +Below the summary, a status panel shows the total device count broken down by status, the number of active monitor alerts and warnings, and the number of active issues. Click {{< ui >}}View Health{{< /ui >}} to open the [Device Health][5] view. ### Interface health -The **Interface health** section ranks the top interfaces operating outside healthy thresholds. For each interface, the page reports error rate, discard rate, and inbound and outbound bandwidth utilization as a percentage of the configured interface speed. +The {{< ui >}}Interface health{{< /ui >}} section ranks the top interfaces operating outside healthy thresholds. For each interface, the page reports error rate, discard rate, and inbound and outbound bandwidth utilization as a percentage of the configured interface speed. {{< img src="network_device_monitoring/summary/interface-performance.png" alt="The Interface health section showing a Bits AI summary, a table of top interfaces with error, discard, and bandwidth columns, and aggregate health cards for bandwidth utilization, errors, and discards." style="width:100%;" >}} A Bits AI summary highlights patterns across the affected interfaces, such as multiple interfaces saturating at the same site or correlated error spikes after a configuration change. -Three cards below the list show aggregate health for the fleet: [Bandwidth utilization][6], [Errors][7], and [Discards][8]. Click a card to see the full list of affected interfaces with average, minimum, and maximum values. The Errors and Discards detail views also include an **Ask Bits** button for AI-assisted investigation. +Three cards below the list show aggregate health for the fleet: [{{< ui >}}Bandwidth utilization{{< /ui >}}][6], [{{< ui >}}Errors{{< /ui >}}][7], and [{{< ui >}}Discards{{< /ui >}}][8]. Click a card to see the full list of affected interfaces with average, minimum, and maximum values. The Errors and Discards detail views also include an {{< ui >}}Ask Bits{{< /ui >}} button for AI-assisted investigation. {{< img src="network_device_monitoring/summary/errors-detail.png" alt="The Errors detail view showing inbound and outbound error rate charts, a Bits AI summary, and a table of interfaces with error rate and packet counts." style="width:100%;" >}} -Click any interface to open the device side panel, which includes details such as interface status, metrics, configuration, and recent events. From the side panel, click **Open Device Page** in the top-right corner to open the device page, where you can investigate the device in more depth. +Click any interface to open the device side panel, which includes details such as interface status, metrics, configuration, and recent events. From the side panel, click {{< ui >}}Open Device Page{{< /ui >}} in the top-right corner to open the device page, where you can investigate the device in more depth. {{< img src="network_device_monitoring/summary/interface-side-panel.png" alt="The device side panel open on the Interfaces tab, showing interface status, bandwidth, and monitor data." style="width:100%;" >}} @@ -75,15 +75,15 @@ The following thresholds determine an interface's health state: ### Device health -The **Device health** section ranks the top devices operating outside healthy thresholds. For each device, the page reports CPU, memory, and fan health, along with any configuration changes recorded in the selected time range. By default, devices are sorted by **CPU**. Sort by **Memory** to surface devices under memory pressure. +The {{< ui >}}Device health{{< /ui >}} section ranks the top devices operating outside healthy thresholds. For each device, the page reports CPU, memory, and fan health, along with any configuration changes recorded in the selected time range. By default, devices are sorted by {{< ui >}}CPU{{< /ui >}}. Sort by {{< ui >}}Memory{{< /ui >}} to surface devices under memory pressure. {{< img src="network_device_monitoring/summary/device-perf.png" alt="The Device health section showing a Bits AI summary, a table of top devices with CPU and memory columns, and aggregate health cards at the bottom." style="width:100%;" >}} A Bits AI summary explains the current device health state and points to recent changes or anomalies that may have contributed. -Two cards below the list show aggregate health: [CPU][9] and [Memory][10]. Click a card to see the full list of affected devices with minimum, maximum, and past 24-hour trend data. +Two cards below the list show aggregate health: [{{< ui >}}CPU{{< /ui >}}][9] and [{{< ui >}}Memory{{< /ui >}}][10]. Click a card to see the full list of affected devices with minimum, maximum, and past 24-hour trend data. -Click any device to open the device side panel, which includes details such as device status, metrics, configuration, and recent events. From the side panel, click **Open Device Page** in the top-right corner to investigate the device in more depth. +Click any device to open the device side panel, which includes details such as device status, metrics, configuration, and recent events. From the side panel, click {{< ui >}}Open Device Page{{< /ui >}} in the top-right corner to investigate the device in more depth. {{< img src="network_device_monitoring/summary/device-side-panel.png" alt="The device side panel open on the Device Summary tab, showing triggered monitors, device tags, and interface status." style="width:100%;" >}} @@ -98,17 +98,17 @@ The following thresholds determine a device's health state: ### Traffic -The **Traffic** section uses [NetFlow][3] data to visualize traffic volume between sources and destinations as a Sankey diagram, scoped to your current filter and time range. Click **View NetFlow** to explore flow data in detail. +The {{< ui >}}Traffic{{< /ui >}} section uses [NetFlow][3] data to visualize traffic volume between sources and destinations as a Sankey diagram, scoped to your current filter and time range. Click {{< ui >}}View NetFlow{{< /ui >}} to explore flow data in detail. {{< img src="network_device_monitoring/summary/traffic-panel.png" alt="The Traffic section showing a Sankey diagram of the top 25 flows by volume, with source IPs, interface names, device names, and destination IPs." style="width:100%;" >}} ### Changes -The **Changes** section lists recent network device configuration changes from [Configuration Management][4]. Each entry shows the affected device, a summary of what changed, and a timestamp. +The {{< ui >}}Changes{{< /ui >}} section lists recent network device configuration changes from [Configuration Management][4]. Each entry shows the affected device, a summary of what changed, and a timestamp. {{< img src="network_device_monitoring/summary/changes-panel.png" alt="The Changes section listing recent configuration changes per device with a summary and timestamp for each." style="width:100%;" >}} -Click **[View all changes][11]** to open the full Changes view. Filters and the time range are shared between the two views. Click any row to open the device side panel with details about the change. +Click [{{< ui >}}View all changes{{< /ui >}}][11] to open the full Changes view. Filters and the time range are shared between the two views. Click any row to open the device side panel with details about the change. ## Further reading diff --git a/content/en/network_monitoring/devices/syslog.md b/content/en/network_monitoring/devices/syslog.md index b8b7cc5ac5f..9134b09811f 100644 --- a/content/en/network_monitoring/devices/syslog.md +++ b/content/en/network_monitoring/devices/syslog.md @@ -140,9 +140,9 @@ When network devices send Syslog messages directly to the Datadog Agent, the Age To create the `syslog_ip` tag, remap the `source_host` tag using a Log Processing Pipeline: -1. In Datadog, navigate to **[Logs > Log Configuration > Pipelines][3]**. +1. In Datadog, navigate to [{{< ui >}}Logs{{< /ui >}} > {{< ui >}}Log Configuration{{< /ui >}} > {{< ui >}}Pipelines{{< /ui >}}][3]. 2. Create a pipeline or select an existing one. -3. Add a **Log Remapper** processor with the following configuration: +3. Add a {{< ui >}}Log Remapper{{< /ui >}} processor with the following configuration: * Source of the tag: `source_host` * Target tag: `syslog_ip` @@ -158,13 +158,13 @@ To create the `syslog_ip` tag: 1. **Configure the proxy** to include the original source IP in the Syslog message payload. * **rsyslog example:** Use a template like `$template CustomFormat,"%fromhost-ip% %msg%\n"` to prepend the source IP to each message. 2. **Create a Log Processing Pipeline** to extract and map the IP address: - 1. In Datadog, navigate to [**Logs > Log Configuration > Pipelines**][3]. + 1. In Datadog, navigate to [{{< ui >}}Logs{{< /ui >}} > {{< ui >}}Log Configuration{{< /ui >}} > {{< ui >}}Pipelines{{< /ui >}}][3]. 2. Create a pipeline or select an existing one. - 3. Add a **Grok Parser** processor to extract the IP address from the message into a temporary attribute (for example, `@temp_ip`). - 4. Add a **Log Remapper** processor with the following configuration: + 3. Add a {{< ui >}}Grok Parser{{< /ui >}} processor to extract the IP address from the message into a temporary attribute (for example, `@temp_ip`). + 4. Add a {{< ui >}}Log Remapper{{< /ui >}} processor with the following configuration: * Source of the attribute: `@temp_ip` (or your chosen attribute name) * Target tag: `syslog_ip` - * Preserve source attribute: Uncheck this option to remove the temporary attribute + * {{< ui >}}Preserve source attribute{{< /ui >}}: Uncheck this option to remove the temporary attribute [3]: https://app.datadoghq.com/logs/pipelines @@ -177,16 +177,16 @@ For more information, see the [Datadog Log Pipelines documentation][2]. After your network devices are configured and the Datadog Agent is running, you can verify that Syslog data is being collected and sent to Datadog: -1. Navigate to the **[Log Explorer][4]** in your Datadog account. +1. Navigate to the [{{< ui >}}Log Explorer{{< /ui >}}][4] in your Datadog account. 2. In the search bar, filter by `source:syslog` (or whatever source you specified in your `conf.yaml` file). You should see your network device Syslog messages appearing in the Log Explorer. 3. Verify `syslog_ip`: Ensure that the `syslog_ip` tag is present and correctly populated with the network device's IP address for each relevant log entry. {{< img src="network_device_monitoring/syslog/log_explorer_syslog.png" alt="Log explorer, filtering by `source:syslog`, highlighting the `syslog_ip` tag on the side panel." style="width:100%;" >}} -4. Optionally, to observe Syslog messages in NDM, navigate to [**Infrastructure > Network Devices**][5]. +4. Optionally, to observe Syslog messages in NDM, navigate to [{{< ui >}}Infrastructure{{< /ui >}} > {{< ui >}}Network Devices{{< /ui >}}][5]. - Select a device that is configured to send Syslog messages. - - In the NDM device view, click the **Events** tab. Syslog messages and SNMP traps are combined in a single view. Use the filters to narrow results by event type. + - In the NDM device view, click the {{< ui >}}Events{{< /ui >}} tab. Syslog messages and SNMP traps are combined in a single view. Use the filters to narrow results by event type. {{< img src="network_device_monitoring/network_topology_map/events.png" alt="The NDM device view with the Events tab open, showing Syslog messages and SNMP traps." style="width:100%;" >}} diff --git a/content/en/network_monitoring/devices/topology.md b/content/en/network_monitoring/devices/topology.md index 303b2edac96..2115f3bfa95 100644 --- a/content/en/network_monitoring/devices/topology.md +++ b/content/en/network_monitoring/devices/topology.md @@ -40,71 +40,71 @@ In the Network Topology Map, the following navigation options are available: ### Group by -Under Group By, use **tags** such as `location` and `vendor` to select how you want to visualize your devices: +Under {{< ui >}}Group By{{< /ui >}}, use tags such as `location` and `vendor` to select how you want to visualize your devices: {{< img src="/network_device_monitoring/network_topology_map/device-topology-group_by_2.png" alt="A Group by control showing tags for location and vendor." style="width:90%;" >}} ### Filter devices -Select the **+ Filter** dropdown to refine which devices are displayed on the Device Topology Map. +Select the {{< ui >}}+ Filter{{< /ui >}} dropdown to refine which devices are displayed on the Device Topology Map. {{< img src="/network_device_monitoring/network_topology_map/device_topology_filter_3.png" alt="The Device Topology Map with the filter dropdown open." style="width:90%;" >}} -**Note:** The **Filter Devices** setting determines which devices appear on the Device Topology Map for all queries, including those that filter by a device facet in the search bar. +**Note:** The {{< ui >}}Filter Devices{{< /ui >}} setting determines which devices appear on the Device Topology Map for all queries, including those that filter by a device facet in the search bar. ### Resources -Use the **Resource** dropdown to filter the diagram by specific device types, such as Firewalls, Access Points, and Routers. +Use the {{< ui >}}Resource{{< /ui >}} dropdown to filter the diagram by specific device types, such as Firewalls, Access Points, and Routers. {{< img src="/network_device_monitoring/network_topology_map/resources_dropdown.png" alt="The Device Topology Map with the Resources drop-down open, and Unmonitored Device un-checked." style="width:30%;" >}} -By default, the **Unmonitored Device** option is unchecked, which hides devices that are not directly monitored by Network Device Monitoring but are discovered through LLDP/CDP from adjacent monitored devices. Check this option to display these unmonitored devices on the diagram. +By default, the {{< ui >}}Unmonitored Device{{< /ui >}} option is unchecked, which hides devices that are not directly monitored by Network Device Monitoring but are discovered through LLDP/CDP from adjacent monitored devices. Check this option to display these unmonitored devices on the diagram. ## Investigating devices In addition to showing an overview of your network's physical connections, the Device Topology Map lets you investigate individual devices to understand their connections, flows, and overall status. Hover over a device to see its status and key metrics, or click a device to open the NDM device view with details such as its IP address, tags, throughput, CPU, and memory. -While investigating a device, click the **Open Device Page** dropdown in the top right of the device view to navigate to [NetFlow Monitoring][1] or other related pages for deeper investigation. +While investigating a device, click the {{< ui >}}Open Device Page{{< /ui >}} dropdown in the top right of the device view to navigate to [NetFlow Monitoring][1] or other related pages for deeper investigation. {{< img src="/network_device_monitoring/network_topology_map/network_topology_map_device_inspect_view_7.png" alt="The Network Device Topology Map with a device selected, displaying information in the NDM device view." style="width:100%;" >}} ### Dependencies -The **Dependencies** section in the NDM device view shows the number of physically connected devices and VPN tunnels at a glance, along with a visual graph of neighboring devices. +The {{< ui >}}Dependencies{{< /ui >}} section in the NDM device view shows the number of physically connected devices and VPN tunnels at a glance, along with a visual graph of neighboring devices. {{< img src="/network_device_monitoring/network_topology_map/topology_dependencies.png" alt="The NDM device view showing the Dependencies section with a graph of connected devices." style="width:100%;" >}} -Click **View dependencies** to open the full device page. On the **Dependencies** tab, use the **Physical** or **VPN** filters to switch between physical connections and VPN tunnels (VPN dependencies require [VPN Monitoring][12] to be configured). The physical view displays a topology graph alongside a table of connected devices showing their status, device name, IP address, monitors, local interface, and remote interface. +Click {{< ui >}}View dependencies{{< /ui >}} to open the full device page. On the {{< ui >}}Dependencies{{< /ui >}} tab, use the {{< ui >}}Physical{{< /ui >}} or {{< ui >}}VPN{{< /ui >}} filters to switch between physical connections and VPN tunnels (VPN dependencies require [VPN Monitoring][12] to be configured). The physical view displays a topology graph alongside a table of connected devices showing their status, device name, IP address, monitors, local interface, and remote interface. {{< img src="/network_device_monitoring/network_topology_map/ndm_summary_dependencies.png" alt="The Dependencies tab on the NDM device page with the Physical filter selected, showing a topology graph and a table of connected devices with status, IP address, and interface details." style="width:100%;" >}} ### Metrics -Click the **Metrics** tab in the NDM device view to see key metrics for the device, including CPU usage, memory usage, and throughput. Summary stats are displayed at the top, and each metric is shown as a graph over time. Click **View all metrics** to explore the full list of collected metrics. +Click the {{< ui >}}Metrics{{< /ui >}} tab in the NDM device view to see key metrics for the device, including CPU usage, memory usage, and throughput. Summary stats are displayed at the top, and each metric is shown as a graph over time. Click {{< ui >}}View all metrics{{< /ui >}} to explore the full list of collected metrics. {{< img src="/network_device_monitoring/network_topology_map/metrics_3.png" alt="The NDM device view with the Metrics tab open, showing CPU, memory, and throughput graphs." style="width:100%;" >}} ### Traffic -Click the **Traffic** tab to view total, inbound, and outbound throughput for the device. A traffic graph shows activity over time, and the **Top Conversations** table lists the highest-volume source-to-destination flows with bit rate, packet rate, and total bytes. Click **View traffic** to investigate further on the device summary page, and in [NetFlow Monitoring][1]. +Click the {{< ui >}}Traffic{{< /ui >}} tab to view total, inbound, and outbound throughput for the device. A traffic graph shows activity over time, and the {{< ui >}}Top Conversations{{< /ui >}} table lists the highest-volume source-to-destination flows with bit rate, packet rate, and total bytes. Click {{< ui >}}View traffic{{< /ui >}} to investigate further on the device summary page, and in [NetFlow Monitoring][1]. {{< img src="/network_device_monitoring/network_topology_map/traffic_2.png" alt="The NDM device view with the Traffic tab open, showing throughput stats, a traffic graph, and a Top Conversations table." style="width:100%;" >}} ### Events -Click the **Events** tab to view Syslog messages and SNMP traps in a single, combined view. Use filters to narrow results by event type. Spikes in event volume are visually highlighted, helping you identify and investigate errors. +Click the {{< ui >}}Events{{< /ui >}} tab to view Syslog messages and SNMP traps in a single, combined view. Use filters to narrow results by event type. Spikes in event volume are visually highlighted, helping you identify and investigate errors. {{< img src="/network_device_monitoring/network_topology_map/events.png" alt="The NDM device view with the Events tab open, showing Syslog messages and SNMP traps." style="width:100%;" >}} ### View flow details -To explore a device's traffic sources, destinations, and volume, click the **Open Device Page** dropdown and select **NetFlow Monitoring**. The data is automatically filtered by the device's `@device.ip`. For more information, see [NetFlow Monitoring][1]. +To explore a device's traffic sources, destinations, and volume, click the {{< ui >}}Open Device Page{{< /ui >}} dropdown and select {{< ui >}}NetFlow Monitoring{{< /ui >}}. The data is automatically filtered by the device's `@device.ip`. For more information, see [NetFlow Monitoring][1]. {{< img src="/network_device_monitoring/network_topology_map/netflow_tab_4.png" alt="The NDM device view with the Open Device Page dropdown showing the NetFlow Monitoring option." style="width:100%;" >}} ### Device settings -Click the **Device Settings** icon in the NDM device view to open the Device Settings panel. The **Information** tab displays general details (name, namespace, and description), network details (IP address, subnet, and geolocation), and hardware details (model, vendor, OS, and version). The **Tags** tab lets you view and manage tags associated with the device. +Click the {{< ui >}}Device Settings{{< /ui >}} icon in the NDM device view to open the Device Settings panel. The {{< ui >}}Information{{< /ui >}} tab displays general details (name, namespace, and description), network details (IP address, subnet, and geolocation), and hardware details (model, vendor, OS, and version). The {{< ui >}}Tags{{< /ui >}} tab lets you view and manage tags associated with the device. {{< img src="/network_device_monitoring/network_topology_map/device_settings.png" alt="The Device Settings panel for an NDM device, showing the Information tab with general, network, and hardware details." style="width:90%;" >}} @@ -167,7 +167,7 @@ There are no devices because NDM is not configured. {{< img src="/network_device_monitoring/network_topology_map/no_connections_found.png" alt="The no devices found message that is displayed when NDM is either not configured or because of filtering." style="width:80%;" >}} -- Turn the **Unmonitored Device** selection on to show the unmonitored devices. +- Turn the {{< ui >}}Unmonitored Device{{< /ui >}} selection on to show the unmonitored devices. - Use categorization tag to help understand your map view with information hierarchy. ### Missing devices/connections @@ -191,17 +191,17 @@ sudo -u dd-agent datadog-agent snmp walk 1.3.6.1.4.1.9.9.23 ### Missing connections or links -If your device is exposing topology data with LLDP or CDP but some of the connections are missing, verify that the **Unmonitored Device** selection is off. +If your device is exposing topology data with LLDP or CDP but some of the connections are missing, verify that the {{< ui >}}Unmonitored Device{{< /ui >}} selection is off. ### Unmonitored devices showing on map The Device Topology Map shows all devices discovered with LLDP or CDP. These can be new devices that are not already monitored with SNMP or existing devices that were not [resolved](#device-resolution) to the equivalent monitored device. -You can use the **Unmonitored Device** selection to hide these nodes. +You can use the {{< ui >}}Unmonitored Device{{< /ui >}} selection to hide these nodes. ### Device duplicated on map The Device Topology Map shows all devices discovered with LLDP and/or CDP. In some cases, these devices are already monitored with SNMP but can not be [resolved](#device-resolution) to the equivalent monitored device. In this case, the device is shown twice: one node representing the monitored device and one node representing the LLDP/CDP discovered device. -Use the **Unmonitored Device** selection to hide the unmonitored nodes. +Use the {{< ui >}}Unmonitored Device{{< /ui >}} selection to hide the unmonitored nodes. ### Borderless or black nodes on the map diff --git a/content/en/network_monitoring/devices/troubleshooting.md b/content/en/network_monitoring/devices/troubleshooting.md index f6b83d382a9..6dbac7dee77 100644 --- a/content/en/network_monitoring/devices/troubleshooting.md +++ b/content/en/network_monitoring/devices/troubleshooting.md @@ -256,7 +256,7 @@ Check for any rules blocking UDP traffic on your configured ports. For example:` {{< img src="/network_device_monitoring/troubleshooting/ndm_troubleshooting_dashboard.png" alt="The Network Device Monitoring page showing the Dashboard dropdown with the NDM Troubleshooting dashboard highlighed." style="width:80%;" >}} -2. Scroll down to the Traps widget and observe the **Traps incorrectly formatted** graph. If this is non-zero it likely means that the authentication on the NDM collector and the device do not match. +2. Scroll down to the Traps widget and observe the {{< ui >}}Traps incorrectly formatted{{< /ui >}} graph. If this is non-zero it likely means that the authentication on the NDM collector and the device do not match. {{< img src="/network_device_monitoring/troubleshooting/ndm_traps_dashboard.png" alt="The NDM troubleshooting dashboard showing the Traps widget section." style="width:100%;" >}} diff --git a/content/en/network_monitoring/devices/vpn_monitoring.md b/content/en/network_monitoring/devices/vpn_monitoring.md index 841e1b79cdf..d3841fe3210 100644 --- a/content/en/network_monitoring/devices/vpn_monitoring.md +++ b/content/en/network_monitoring/devices/vpn_monitoring.md @@ -92,11 +92,11 @@ network_devices: ## Viewing VPN tunnels -To view VPN tunnels for a device, click the device in the [NDM device list][8] or the [Device Topology Map][7] to open the NDM device view. The **Dependencies** section shows the number of connected devices and VPN tunnels at a glance. +To view VPN tunnels for a device, click the device in the [NDM device list][8] or the [Device Topology Map][7] to open the NDM device view. The {{< ui >}}Dependencies{{< /ui >}} section shows the number of connected devices and VPN tunnels at a glance. {{< img src="/network_device_monitoring/vpn_monitoring/dependency_tab.png" alt="The NDM device view showing the Dependencies section with connected devices and a VPN tunnel count." style="width:100%;" >}} -Click **View dependencies** to open the full device page. On the **Dependencies** tab, select the **VPN** filter to see all VPN tunnels for the device. The table displays the local outside IP, remote peer IP, protocol, tunnel interface, destination subnets, bytes in, bytes out, and active time for each tunnel. +Click {{< ui >}}View dependencies{{< /ui >}} to open the full device page. On the {{< ui >}}Dependencies{{< /ui >}} tab, select the {{< ui >}}VPN{{< /ui >}} filter to see all VPN tunnels for the device. The table displays the local outside IP, remote peer IP, protocol, tunnel interface, destination subnets, bytes in, bytes out, and active time for each tunnel. {{< img src="/network_device_monitoring/vpn_monitoring/vpn_dependency.png" alt="The Dependencies tab on the NDM device page with the VPN filter selected, showing a table of VPN tunnels with connection details." style="width:100%;" >}} diff --git a/content/en/network_monitoring/dns/_index.md b/content/en/network_monitoring/dns/_index.md index 49a7daa8e16..ceca07ec74b 100644 --- a/content/en/network_monitoring/dns/_index.md +++ b/content/en/network_monitoring/dns/_index.md @@ -44,13 +44,13 @@ DNS Monitoring provides visibility into DNS server performance to help you ident ## Queries -On the **DNS** toggle in [**CNM > Analytics**][5], use the search bar to query for dependencies between a client (which makes the DNS request) and a DNS server (which responds to the DNS request). The destination port is automatically scoped to DNS port `53` so that all resulting dependencies match this **client → DNS server** format. +On the {{< ui >}}DNS{{< /ui >}} toggle in [{{< ui >}}CNM{{< /ui >}} > {{< ui >}}Analytics{{< /ui >}}][5], use the search bar to query for dependencies between a client (which makes the DNS request) and a DNS server (which responds to the DNS request). The destination port is automatically scoped to DNS port `53` so that all resulting dependencies match this **client → DNS server** format. To narrow your search to a specific client, use client tags in the search bar to filter DNS traffic. By default, clients are grouped by the most common tags, with each row representing a service making DNS requests to a DNS server. {{< img src="network_performance_monitoring/dns_monitoring/dns_client_search_2.png" alt="The DNS monitoring page with client_service:web-store entered into the search bar and `network.dns_query` entered for View servers as" style="width:100%;">}} -To refine your search to a particular DNS server, filter the search bar by using server tags. Configure your server display with one of the following options from the **Group by** dropdown menu: +To refine your search to a particular DNS server, filter the search bar by using server tags. Configure your server display with one of the following options from the {{< ui >}}Group by{{< /ui >}} dropdown menu: * `dns_server`: The server receiving DNS requests. This tag has the same value as `pod_name` or `task_name`. If those tags are not available, `host_name` is used. * `host`: The host name of the DNS server. @@ -64,7 +64,7 @@ To refine your search to a particular DNS server, filter the search bar by using There are three recommended queries at the top of the DNS page, similar to the [Network Analytics][4] page. These are static queries commonly used to investigate DNS health and view high-level DNS metrics. Use the recommended queries as a starting point to gain further insights into your DNS configuration and troubleshoot DNS issues. -You can hover over a recommended query to see a short description of what the results of the query mean. Click on the query to run the query, and click **Clear query** to remove the query. Each recommended query has its own set of recommended graphs as well; clearing the recommended query resets the graphs to their default settings. +You can hover over a recommended query to see a short description of what the results of the query mean. Click on the query to run the query, and click {{< ui >}}Clear query{{< /ui >}} to remove the query. Each recommended query has its own set of recommended graphs as well; clearing the recommended query resets the graphs to their default settings. ## Metrics @@ -86,15 +86,15 @@ The following DNS metrics are available: ## Table -The network table breaks down the above metrics by each _client_ and _server_ dependency defined by your query. You can configure the columns in your table using the Customize gear icon (⚙️) at the top right of the table. +The network table breaks down the above metrics by each _client_ and _server_ dependency defined by your query. You can configure the columns in your table using the {{< ui >}}Customize{{< /ui >}} gear icon (⚙️) at the top right of the table. -Narrow down the traffic in your view with the **Filter Traffic** [options][3]. +Narrow down the traffic in your view with the {{< ui >}}Filter Traffic{{< /ui >}} [options][3]. {{< img src="network_performance_monitoring/dns_monitoring/dns_table_view.png" alt="The CNM Analytics page showing the table view of DNS network traffic." >}} ## Sidepanel -The sidepanel provides contextual telemetry to help you quickly debug DNS server dependencies. Use the Flows, Logs, Traces, and Processes tabs to determine whether a DNS server's high number of incoming requests, response time, or failure rate is due to: +The sidepanel provides contextual telemetry to help you quickly debug DNS server dependencies. Use the {{< ui >}}Flows{{< /ui >}}, {{< ui >}}Logs{{< /ui >}}, {{< ui >}}Traces{{< /ui >}}, and {{< ui >}}Processes{{< /ui >}} tabs to determine whether a DNS server's high number of incoming requests, response time, or failure rate is due to: * Heavy processes consuming the resources of the underlying infrastructure * Application errors in the code on the client side diff --git a/content/en/network_monitoring/netflow/_index.md b/content/en/network_monitoring/netflow/_index.md index 36483aaa31c..9cdeb904be0 100644 --- a/content/en/network_monitoring/netflow/_index.md +++ b/content/en/network_monitoring/netflow/_index.md @@ -26,13 +26,13 @@ The NetFlow view displays traffic metrics aggregated by device and interface. Us Use the left-hand navigation to explore additional NetFlow views: -- **Traffic Volume**: Overall flow metrics by device and interface. -- **Device Health**: Status and utilization of monitored devices. -- **Flows**: Detailed individual flow records. -- **Conversations**: Aggregated source–destination pairs. -- **Autonomous Systems**: Flow data grouped by Autonomous System Numbers (ASNs). -- **Geo IP**: Flow data grouped by geographic origin/destination. -- **Source Ports / Destination Ports / Protocols / Flags**: Traffic breakdown by packet metadata. +- {{< ui >}}Traffic Volume{{< /ui >}}: Overall flow metrics by device and interface. +- {{< ui >}}Device Health{{< /ui >}}: Status and utilization of monitored devices. +- {{< ui >}}Flows{{< /ui >}}: Detailed individual flow records. +- {{< ui >}}Conversations{{< /ui >}}: Aggregated source–destination pairs. +- {{< ui >}}Autonomous Systems{{< /ui >}}: Flow data grouped by Autonomous System Numbers (ASNs). +- {{< ui >}}Geo IP{{< /ui >}}: Flow data grouped by geographic origin/destination. +- {{< ui >}}Source Ports / Destination Ports / Protocols / Flags{{< /ui >}}: Traffic breakdown by packet metadata. ## Installation @@ -91,7 +91,7 @@ Datadog enriches ports in NetFlow with IANA (Internet Assigned Numbers Authority You can also add your own custom enrichments to map ports and protocols to specific applications (for example, if a custom service runs on a specific port). This makes it easier for network engineers and their teams to interpret and query NetFlow data with human-readable names. -From the **Configuration** tab in NetFlow, click **+ Add Enrichment** to upload the CSV file containing your custom enrichments. +From the {{< ui >}}Configuration{{< /ui >}} tab in NetFlow, click {{< ui >}}+ Add Enrichment{{< /ui >}} to upload the CSV file containing your custom enrichments. {{< img src="network_device_monitoring/netflow/new_enrichment_2.png" alt="The New Enrichment Mapping modal in the Netflow configuration tab" width="100%" >}} @@ -99,7 +99,7 @@ From the **Configuration** tab in NetFlow, click **+ Add Enrichment** to upload You can also add your own custom enrichments to map IPs and CIDRs to custom tags (for example, to categorize services running on specific IP addresses). This makes it easier for network engineers and their teams to interpret and query NetFlow data with human-readable names. -From the [**Enrichment** settings page][10], click **+ Add Enrichment** to add mappings manually or upload a CSV file to add mappings in bulk. +From the [{{< ui >}}Enrichment{{< /ui >}} settings page][10], click {{< ui >}}+ Add Enrichment{{< /ui >}} to add mappings manually or upload a CSV file to add mappings in bulk. ### Reverse DNS private IP enrichment @@ -107,7 +107,7 @@ Enable Reverse DNS private IP enrichment to perform DNS lookups for hostnames as By [default][7], the Reverse DNS IP enrichment in your `datadog.yaml` file is disabled. To enable, see the [Configuration](#configuration) section of this page. -Search for **DNS** in the **+ Filter** menu to locate flows associated with Reverse DNS IP enrichment: +Search for DNS in the {{< ui >}}+ Filter{{< /ui >}} menu to locate flows associated with Reverse DNS IP enrichment: {{< img src="network_device_monitoring/netflow/dns_ip_enrichmen_2.png" alt="Filter menu enhanced to show the reverse DNS destination and source facets" width="100%" >}} @@ -115,19 +115,19 @@ Search for **DNS** in the **+ Filter** menu to locate flows associated with Reve ## IP details -In the **Conversations** view, you can view the Public IP address of the Destination IP. Hover over the IP to display rich metadata about the IP and a link to **View Related Network Connections** where you can inspect the connectivity in more detail. +In the **Conversations** view, you can view the Public IP address of the Destination IP. Hover over the IP to display rich metadata about the IP and a link to {{< ui >}}View Related Network Connections{{< /ui >}} where you can inspect the connectivity in more detail. {{< img src="network_device_monitoring/netflow/NetFlow_IP_pill.png" alt="Hover over an IP address to display the IP details and View Related Network Connections" width="100%" >}} ## Flow diagram -You can visualize the flows in NetFlow Monitoring by clicking on the **Flows** menu and hovering over a flow from the list to view additional information about Source IP, Ingress Interface Name, Device name, and Destination IP across related network connections. +You can visualize the flows in NetFlow Monitoring by clicking on the {{< ui >}}Flows{{< /ui >}} menu and hovering over a flow from the list to view additional information about Source IP, Ingress Interface Name, Device name, and Destination IP across related network connections. {{< img src="network_device_monitoring/netflow/flows.png" alt="Hover over a flow aggregated from a device emitting netflow to access related network connections" width="100%" >}} ## NetFlow monitor -Click on the **Create Monitor** icon from any of the views to create a [NetFlow monitor][6]. When creating the monitor, consider the following fields with respect to the source IP or destination IP from the perspective of the device. These fields provide insights into network traffic patterns and help with optimizing performance and security. +Click on the {{< ui >}}Create Monitor{{< /ui >}} icon from any of the views to create a [NetFlow monitor][6]. When creating the monitor, consider the following fields with respect to the source IP or destination IP from the perspective of the device. These fields provide insights into network traffic patterns and help with optimizing performance and security. {{< img src="network_device_monitoring/netflow/create_monitor.png" alt="Flows view in NetFlow monitoring with the create monitor link highlighted." width="100%" >}} @@ -244,7 +244,7 @@ With conversation stitching, you can: - Identify true initiators and responders so that source and destination widgets reflect accurate roles - Remove noise where servers incorrectly appear as top sources -To toggle between stitched (bidirectional) and unstitched (unidirectional) views, navigate to any endpoint-based NetFlow view and use the **Bidirectional** toggle under the time picker. +To toggle between stitched (bidirectional) and unstitched (unidirectional) views, navigate to any endpoint-based NetFlow view and use the {{< ui >}}Bidirectional{{< /ui >}} toggle under the time picker. {{< img src="network_device_monitoring/netflow/conversation_stitching.png" alt="Conversation stitching toggle in the NetFlow view" width="100%" >}} diff --git a/content/en/network_monitoring/network_path/as_view.md b/content/en/network_monitoring/network_path/as_view.md index 56eca549aae..19efbde0a6e 100644 --- a/content/en/network_monitoring/network_path/as_view.md +++ b/content/en/network_monitoring/network_path/as_view.md @@ -22,7 +22,7 @@ The Autonomous Systems (AS) View provides visibility into the network providers BGP routing issues and provider-specific problems are difficult to diagnose because they sit outside your direct control. The AS View makes these invisible layers visible, giving you the data to answer questions like "Is this a peering issue?" or "Did our traffic shift to a different transit provider?" without manually tracing routes or parsing BGP tables. -To get started, go to the Network Path Explorer and click [**Autonomous Systems (AS)**][1]. +To get started, go to the Network Path Explorer and click [{{< ui >}}Autonomous Systems (AS){{< /ui >}}][1]. ## Dashboard @@ -70,15 +70,15 @@ Use the filter controls above the list to narrow the results by **AS Number**, * ## Autonomous System details -Click an Autonomous System in the list to open its details. The detail view includes a **Traffic** tab, a **Neighbors** tab, and a path list. +Click an Autonomous System in the list to open its details. The detail view includes a {{< ui >}}Traffic{{< /ui >}} tab, a {{< ui >}}Neighbors{{< /ui >}} tab, and a path list. ### Traffic -The **Traffic** tab shows a relational diagram of traffic flowing from **Upstream** sources through the selected AS to **Downstream** destinations. Hover over a traffic node to view its aggregate paths and number of occurrences, and click on any AS to filter to its paths in the [path list](#path-list). +The {{< ui >}}Traffic{{< /ui >}} tab shows a relational diagram of traffic flowing from {{< ui >}}Upstream{{< /ui >}} sources through the selected AS to {{< ui >}}Downstream{{< /ui >}} destinations. Hover over a traffic node to view its aggregate paths and number of occurrences, and click on any AS to filter to its paths in the [path list](#path-list). ### Neighbors -The **Neighbors** tab shows a full visualization of the upstream and downstream Autonomous Systems that neighbor the one you selected. Click on any AS in the graph to filter to its paths in the [path list](#path-list). +The {{< ui >}}Neighbors{{< /ui >}} tab shows a full visualization of the upstream and downstream Autonomous Systems that neighbor the one you selected. Click on any AS in the graph to filter to its paths in the [path list](#path-list). ### Path list diff --git a/content/en/network_monitoring/network_path/list_view.md b/content/en/network_monitoring/network_path/list_view.md index e317f8ed035..21623b183da 100644 --- a/content/en/network_monitoring/network_path/list_view.md +++ b/content/en/network_monitoring/network_path/list_view.md @@ -39,7 +39,7 @@ Reachable ## Multi-path map -Use the **Multi-path map** button to build a path map based on one or more selected paths: +Use the {{< ui >}}Multi-path map{{< /ui >}} button to build a path map based on one or more selected paths: {{< img src="network_performance_monitoring/network_path/multi_path_2.png" alt="Multi-path view showing 2 selected paths." >}} diff --git a/content/en/network_monitoring/network_path/path_view.md b/content/en/network_monitoring/network_path/path_view.md index b7860e5e589..d36cb053fa4 100644 --- a/content/en/network_monitoring/network_path/path_view.md +++ b/content/en/network_monitoring/network_path/path_view.md @@ -18,7 +18,7 @@ To access the path view page, click into a path from the [List view][2] or [AS v {{< img src="network_performance_monitoring/network_path/network_path_view_5.png" alt="Network Path view showing a reachable destination with 0% packet loss, 103ms latency, and latency and reachability history" >}} -Click any path from the hop between the source to the destination to observe additional details such as `Hop TTL`, `Hop Latency`, and `Traversed count`. Then, click **View Device Details** to navigate to the Device details in [NDM][4] for the selected device. +Click any path from the hop between the source to the destination to observe additional details such as `Hop TTL`, `Hop Latency`, and `Traversed count`. Then, click {{< ui >}}View Device Details{{< /ui >}} to navigate to the Device details in [NDM][4] for the selected device. {{< img src="network_performance_monitoring/network_path/path_details.png" alt="Path view in Network path highlighting path details." style="width:30%;" >}} @@ -66,15 +66,15 @@ The comparison view provides: ### Open the comparison view -To open the comparison view, click **Compare** near the time range controls on the Network Path view. By default, the view populates with your previously selected time range and compares it to the preceding equivalent time block. For example, a 3-hour range is compared to the previous 3-hour range. Use the top controls to adjust the compared time ranges. +To open the comparison view, click {{< ui >}}Compare{{< /ui >}} near the time range controls on the Network Path view. By default, the view populates with your previously selected time range and compares it to the preceding equivalent time block. For example, a 3-hour range is compared to the previous 3-hour range. Use the top controls to adjust the compared time ranges. ### Navigate the comparison Navigate the split paths independently using the zoom controls, the minimap, or by holding ⌘/Ctrl and scrolling with your mouse. -Click **Inspect** on a shared hop to open a sidebar detailing the metadata and confirming that the hop is present in both views. Unique hops are wrapped in a distinct color to indicate that they exist in only one view. +Click {{< ui >}}Inspect{{< /ui >}} on a shared hop to open a sidebar detailing the metadata and confirming that the hop is present in both views. Unique hops are wrapped in a distinct color to indicate that they exist in only one view. -The **Analysis** tab provides a side-by-side, hop-by-hop breakdown of packets and RTT latency for each time range. +The {{< ui >}}Analysis{{< /ui >}} tab provides a side-by-side, hop-by-hop breakdown of packets and RTT latency for each time range. {{< img src="network_performance_monitoring/network_path/network_path_analysis_comparison.png" alt="Analysis tab of the Visual Comparison view showing a side-by-side Hop RTT Latency table for paths A and B" style="width:100%;" >}} diff --git a/content/en/notebooks/_index.md b/content/en/notebooks/_index.md index 3088f75d79b..a62e463db2a 100644 --- a/content/en/notebooks/_index.md +++ b/content/en/notebooks/_index.md @@ -41,8 +41,8 @@ Notebooks are collaborative rich text documents that give you all the power of D You can create a notebook in two places: -- From the left-hand navigation bar, click **Dashboards > New Notebook**. -- On the upper-right-hand corner of the [Notebooks List page][1], click **New Notebook**. +- From the left-hand navigation bar, click {{< ui >}}Dashboards{{< /ui >}} > {{< ui >}}New Notebook{{< /ui >}}. +- On the upper-right-hand corner of the [Notebooks List page][1], click {{< ui >}}New Notebook{{< /ui >}}. ### Notebook templates @@ -76,11 +76,11 @@ Notebooks support all widget types. For the full list, see [Widgets][3]. Hover over the widget to display options for editing and configuring graphs. -To edit the query or configure the graph's display, use the **Quick Edit** feature to make most changes inline. For more advanced configuration, click the pencil icon or hold down the Cmd/Ctrl key and click on the graph to open the full graph editor. You can adjust the local timeframe or link the graph to the global notebook time by clicking the clock icon. +To edit the query or configure the graph's display, use the {{< ui >}}Quick Edit{{< /ui >}} feature to make most changes inline. For more advanced configuration, click the pencil icon or hold down the Cmd/Ctrl key and click on the graph to open the full graph editor. You can adjust the local timeframe or link the graph to the global notebook time by clicking the clock icon. Additional graph configuration options are accessible under the three-dot ellipsis menu, depending on the graph type: -- **Graph size**: Adjust the graph height by selecting XS, S, M (default), L, or XL. -- **Graph legend**: Uncheck the box to hide the legend. Legends are automatically disabled for XS and S graphs. +- {{< ui >}}Graph size{{< /ui >}}: Adjust the graph height by selecting XS, S, M (default), L, or XL. +- {{< ui >}}Graph legend{{< /ui >}}: Uncheck the box to hide the legend. Legends are automatically disabled for XS and S graphs. ### Rich text features @@ -93,7 +93,7 @@ Notebooks support commonly used rich text features like bold, italics, inline co | `Inline code` | For inline code, type ` at the beginning and at the end of the text. | | Codeblocks | Insert a codeblock by typing ``` and pressing Enter, or by using the slash command menu. | | Quotes | Insert a quote block by typing `>`, or by using the slash command menu. | -| Text tables | Insert a table by typing `/table` or using the **Add Cell** menu. | +| Text tables | Insert a table by typing `/table` or using the {{< ui >}}Add Cell{{< /ui >}} menu. | | Callouts | Insert a callout by typing `/table` or typing `!NOTE`, `!TIP`, `!WARNING`, `!IMPORTANT`, or `!CAUTION` and then pressing Space. | ### Smart chips @@ -110,7 +110,7 @@ Slash commands are an interface for creating graphs or inserting other content. {{< img src="/notebooks/notebooks_new/slash_command_menu.png" alt="Slash command menu that appears when you type / into a notebook" style="width:70%;" >}} -When you select a graph type, it opens the [graph editor][3]. After you click **Save**, the graph appears in your notebook. +When you select a graph type, it opens the [graph editor][3]. After you click {{< ui >}}Save{{< /ui >}}, the graph appears in your notebook. ### Keyboard shortcuts @@ -122,7 +122,7 @@ Additionally, you can use the following shortcuts to cut and paste widgets (}}Header{{< /ui >}} in the toolbar. ### Notebook tags @@ -131,20 +131,20 @@ Notebooks automatically generate a table of contents from any headers or graphs | Tag action | Description | |---------------------------|----------------------------------------------------------------------------------------------------------------------| | **Favorite a Notebook** | Favorite a notebook to pin it to the top of your results in the Notebook List page. To toggle a notebook as a favorite, click the star icon in the header of the notebook. | -| **Tag by Team** | Tagging a notebook with a team allows you to use it as a filter when searching for a notebook. You can tag a notebook with up to 5 teams. To tag a notebook, click on the **Team** option in the notebook header and select the desired teams. | -| **Tag by Type** | You can tag your notebooks with type tags for easier searching, such as: Postmortem, Runbook, Investigation, Documentation, Report. To tag a notebook, click **Type** and select a type. | +| **Tag by Team** | Tagging a notebook with a team allows you to use it as a filter when searching for a notebook. You can tag a notebook with up to 5 teams. To tag a notebook, click on the {{< ui >}}Team{{< /ui >}} option in the notebook header and select the desired teams. | +| **Tag by Type** | You can tag your notebooks with type tags for easier searching, such as: Postmortem, Runbook, Investigation, Documentation, Report. To tag a notebook, click {{< ui >}}Type{{< /ui >}} and select a type. | ### Add images to notebooks
Only PNG, JPG, JPEG, and GIF file types are supported. Uploads have a max file size of 4MB.
-You can add images to your notebook using `/image` or the **Add Cell** menu. This provides options for resizing, aligning, and captioning the image. Uploaded images are hosted by Datadog. +You can add images to your notebook using `/image` or the {{< ui >}}Add Cell{{< /ui >}} menu. This provides options for resizing, aligning, and captioning the image. Uploaded images are hosted by Datadog. You can use any of the following options to upload an image to be hosted by Datadog: - Drop an image file into the upload area -- Click **Choose File** and locate the image in your file directory +- Click {{< ui >}}Choose File{{< /ui >}} and locate the image in your file directory - Paste a publicly accessible URL for the image Click the icons on the image action tray to adjust the size, alignment, add a caption for the image, or view the image in full screen mode. @@ -161,10 +161,10 @@ To comment on a graph or an image, click on the comment icon to the right of the | Feature | Description | |--------------------------|----------------------------------------------------------------------------------------------------------------------| | **Navigating to Comments** | Saved comments appear in the right margin of the notebook. Click a comment highlight in the text to open it in the margin, or click a comment in the margin to scroll to its location. | -| **Responding to Comments** | Respond to comments by clicking on them in the right margin, which opens a comment box. You can write text, `@mention` a Datadog user, or resolve a comment by clicking **Resolve**. | +| **Responding to Comments** | Respond to comments by clicking on them in the right margin, which opens a comment box. You can write text, `@mention` a Datadog user, or resolve a comment by clicking {{< ui >}}Resolve{{< /ui >}}. | | **Linking to Comments** | Link to a specific comment by clicking the link icon in the top right corner of the comment to copy its link. | | **Editing or Deleting Comments** | Edit or delete your comments by clicking the three-dot ellipsis menu in the top right corner of the comment. | -| **Comment Notifications** | By default, email notifications are sent to the notebook author for new comments by others. Users in a comment thread receive notifications for each reply. To adjust notifications, in the cog menu, select **Notifications**. | +| **Comment Notifications** | By default, email notifications are sent to the notebook author for new comments by others. Users in a comment thread receive notifications for each reply. To adjust notifications, in the cog menu, select {{< ui >}}Notifications{{< /ui >}}. | ## Multiplayer experience in Notebooks @@ -202,24 +202,24 @@ To view a different time frame, select an option in the global time picker, or s -To save this time as the notebook's default, click **Set Default Time**. To reset your global time back to the previously saved default global time, click the reset button. +To save this time as the notebook's default, click {{< ui >}}Set Default Time{{< /ui >}}. To reset your global time back to the previously saved default global time, click the reset button. Individual graphs can be unlinked from the global time and set to an independent time frame. -To view a different time frame on a single graph, edit the graph and use the toggle to unlink it from Global Time. Change the time frame using the time picker or by scrubbing on the graph. Changes made in edit mode are saved automatically when you click **Done**. To discard your changes, click **Cancel** instead of **Done**. +To view a different time frame on a single graph, edit the graph and use the toggle to unlink it from Global Time. Change the time frame using the time picker or by scrubbing on the graph. Changes made in edit mode are saved automatically when you click {{< ui >}}Done{{< /ui >}}. To discard your changes, click {{< ui >}}Cancel{{< /ui >}} instead of {{< ui >}}Done{{< /ui >}}. ### Modes You can switch between modes from within the notebook by selecting the dropdown at the top right of your notebook. -- **Editing**: Make changes to the notebook. -- **Viewing**: Contents are Read Only, preventing users from making unwanted edits to existing configurations and information. +- {{< ui >}}Editing{{< /ui >}}: Make changes to the notebook. +- {{< ui >}}Viewing{{< /ui >}}: Contents are Read Only, preventing users from making unwanted edits to existing configurations and information. ### Version history -From a notebook, click the cog icon and click **Version history** to open the Version History side panel. You can preview, restore, or clone a previous version of your notebook. For more information, see the [Version History guide][6]. +From a notebook, click the cog icon and click {{< ui >}}Version history{{< /ui >}} to open the Version History side panel. You can preview, restore, or clone a previous version of your notebook. For more information, see the [Version History guide][6]. ### Graph snapshots @@ -240,25 +240,25 @@ When a notebook contains a graph with data that is past its data retention limit By default, all users have full access to notebooks. Use our access controls to restrict view and edit access to only yourself: -1. While viewing a notebook, click the **Share** button in the upper right. -1. Select **Private to me**. -1. Click **Save**. +1. While viewing a notebook, click the {{< ui >}}Share{{< /ui >}} button in the upper right. +1. Select {{< ui >}}Private to me{{< /ui >}}. +1. Click {{< ui >}}Save{{< /ui >}}. Use granular access controls to limit the [roles][7] that may edit a particular notebook: -1. While viewing a notebook, click the **Share** button in the upper right. -1. Select **Custom**. -1. Update the Organization access to **Viewer** to revoke edit access from the rest of the organization. +1. While viewing a notebook, click the {{< ui >}}Share{{< /ui >}} button in the upper right. +1. Select {{< ui >}}Custom{{< /ui >}}. +1. Update the Organization access to {{< ui >}}Viewer{{< /ui >}} to revoke edit access from the rest of the organization. 1. Use the dropdown to select one or more roles, teams, or users that may edit the notebook. -1. Click **Add**. -1. The dialog box updates to show that the role you selected has the **Editor** permission. -1. Click **Save**. +1. Click {{< ui >}}Add{{< /ui >}}. +1. The dialog box updates to show that the role you selected has the {{< ui >}}Editor{{< /ui >}} permission. +1. Click {{< ui >}}Save{{< /ui >}}. **Note:** To maintain your edit access to the notebook, the system requires you to include at least one role that you are a member of before saving. You must have edit access to restore general access to a restricted notebook. Complete the following steps: -1. While viewing a notebook, click the **Share** button in the upper right. -1. Select **My Org**. -1. Click **Save**. +1. While viewing a notebook, click the {{< ui >}}Share{{< /ui >}} button in the upper right. +1. Select {{< ui >}}My Org{{< /ui >}}. +1. Click {{< ui >}}Save{{< /ui >}}. ## Finding notebooks @@ -275,10 +275,10 @@ The search field supports full-text search. Type your query to display the relev You can filter notebooks with the following methods: | Filter Type | Description | |------------------|-----------------------------------------------------------------------------| -| **Author** | To filter by author, select the author dropdown and enter names to filter by. | -| **Team** | To filter by team, select the team dropdown and enter team names to filter by. | -| **Notebook Type**| Filter by investigation, postmortem, runbook, report, or documentation. | -| **Modified Date**| Filter based on how recently a notebook was edited using the modified date dropdown. | +| {{< ui >}}Author{{< /ui >}} | To filter by author, select the author dropdown and enter names to filter by. | +| {{< ui >}}Team{{< /ui >}} | To filter by team, select the team dropdown and enter team names to filter by. | +| {{< ui >}}Notebook Type{{< /ui >}}| Filter by investigation, postmortem, runbook, report, or documentation. | +| {{< ui >}}Modified Date{{< /ui >}}| Filter based on how recently a notebook was edited using the modified date dropdown. | There are also quick filters to access your notebooks and notebooks tagged with your teams. diff --git a/content/en/notebooks/advanced_analysis/_index.md b/content/en/notebooks/advanced_analysis/_index.md index 549357f36ca..30ed033c598 100644 --- a/content/en/notebooks/advanced_analysis/_index.md +++ b/content/en/notebooks/advanced_analysis/_index.md @@ -38,10 +38,10 @@ Notebooks are collaborative text editors that allow you to embed Datadog graphs ## Adding data to your notebook -To run complex queries in a notebook, first add a **Data Source** cell. There are two ways to do this: +To run complex queries in a notebook, first add a {{< ui >}}Data Source{{< /ui >}} cell. There are two ways to do this: **From a notebook**: -1. Type `/datasource` and press Enter, or click the **Data Source** tile at the bottom of the page. +1. Type `/datasource` and press Enter, or click the {{< ui >}}Data Source{{< /ui >}} tile at the bottom of the page. 2. Type or select your desired data source from the drop down menu and press Enter.
**Note**: if there is a data source you want that is not available, request it [here][5]. 3. Enter your query. Reserved attributes from the filtered logs are automatically added as columns. @@ -49,8 +49,8 @@ To run complex queries in a notebook, first add a **Data Source** cell. There ar **From the [Log Explorer][1]**: 1. Enter your query in the Log Explorer. -2. Click **Analyze in Notebooks**. -3. Check the **Use as a computational data source** box and select the notebook you want to use. +2. Click {{< ui >}}Analyze in Notebooks{{< /ui >}}. +3. Check the {{< ui >}}Use as a computational data source{{< /ui >}} box and select the notebook you want to use. 4. A data source cell is added to the selected notebook with the same query you entered in the Log Explorer. By default, the columns shown in the Log Explorer are included in the data source cell. ## Configuring a data source cell @@ -71,20 +71,20 @@ Regardless of how you create the data source cell, you can modify the query usin You can add or modify columns in your data source cell. There are two ways to adjust the columns: -- In the preview section, click **columns** to search through available attributes for your data source. +- In the preview section, click {{< ui >}}columns{{< /ui >}} to search through available attributes for your data source. - In the preview, click on a row to open the detail side panel. Click the attribute you want to add as a column, and from the pop up option, select Add "@your_column" to your "@your_datasource" dataset. {{< img src="/notebooks/analysis_features/add_column_to_dataset.png" alt="Opened detail side panel with the option to add an attribute column to the data source cell" style="width:100%;" >}} ### Calculated fields queries -You can take existing Log Explorer queries that include [Calculated Fields][4] and open them in Notebooks. To transfer these queries from the Log Explorer, click **More** and select **Analyze in Notebooks**. The Calculated Fields automatically convert into a Transformation cell. +You can take existing Log Explorer queries that include [Calculated Fields][4] and open them in Notebooks. To transfer these queries from the Log Explorer, click {{< ui >}}More{{< /ui >}} and select {{< ui >}}Analyze in Notebooks{{< /ui >}}. The Calculated Fields automatically convert into a Transformation cell. You can also create Calculated Fields directly within a notebook to define a computed field from existing data sources. These fields can be reused in subsequent analysis: 1. Open a Workspace with a data source. 1. Add a [Transformation cell](#transformation-cell). -1. Click **More operations**. -1. Select **Calculate**. +1. Click {{< ui >}}More operations{{< /ui >}}. +1. Select {{< ui >}}Calculate{{< /ui >}}. {{< img src="/logs/workspace/calculated_fields_transformation_cell.png" alt="Screenshot of an example Workspaces interface with the 'Calculate' option selected from the 'More' dropdown menu, demonstrating how to add Calculated Fields to a query." style="width:100%;" >}} @@ -115,10 +115,10 @@ After adding the transformation cell, you can add any number of transformation o You can also transform your data using SQL by adding an analysis cell to your notebook. -1. Type `/sql` or `/analysis` and press Enter, or click the **SQL Query** tile at the bottom of the page. +1. Type `/sql` or `/analysis` and press Enter, or click the {{< ui >}}SQL Query{{< /ui >}} tile at the bottom of the page. 2. In the source dataset dropdown, select the data source you want to transform. 3. Write your SQL query. For supported SQL syntax, see the [DDSQL Reference][4]. -4. Click **Run** in the top-right corner of the analysis cell to execute your query. +4. Click {{< ui >}}Run{{< /ui >}} in the top-right corner of the analysis cell to execute your query. {{< img src="/notebooks/analysis_features/analysis_cell_example.png" alt="Example of an analysis cell with SQL query transforming data in a notebook" style="width:100%;" >}} @@ -128,21 +128,21 @@ You can graph the data you've transformed using analysis cells inside a notebook To graph your data: -1. Type `/graph` and press Enter, or click the **graph dataset** tile at the bottom of the page. +1. Type `/graph` and press Enter, or click the {{< ui >}}graph dataset{{< /ui >}} tile at the bottom of the page. 2. Type or select your desired data source from the drop down menu and press Enter. 3. Select your visualization type from the graph menu and press Enter. ## Viewing and exporting data -For any analysis cell that includes a dataset preview, you can view the full 100-row preview by clicking the **View dataset** button. +For any analysis cell that includes a dataset preview, you can view the full 100-row preview by clicking the {{< ui >}}View dataset{{< /ui >}} button. ### Export your query to a dashboard -You can save the results of any analysis cell to a dashboard by clicking **Save to Dashboard** and selecting an existing dashboard, or create a new one. Although this creates a sync between your notebook cell and the exported dashboard graph, changes to the query in your notebook do not automatically update the dashboard. +You can save the results of any analysis cell to a dashboard by clicking {{< ui >}}Save to Dashboard{{< /ui >}} and selecting an existing dashboard, or create a new one. Although this creates a sync between your notebook cell and the exported dashboard graph, changes to the query in your notebook do not automatically update the dashboard. {{< img src="/notebooks/analysis_features/analysis_cell_save_to_dashboard.png" alt="Example of saving an analysis cell to a dashboard from a notebook" style="width:100%;" >}} -If you update the published cell or any upstream cells, a badge appears in the upper-right corner of the cell indicating **unpublished changes**. After you publish those changes, the updates sync to **all** dashboards where the query is used. +If you update the published cell or any upstream cells, a badge appears in the upper-right corner of the cell indicating {{< ui >}}unpublished changes{{< /ui >}}. After you publish those changes, the updates sync to **all** dashboards where the query is used. **Note**: By default, the dataset is tied to the global time frame of the **dashboard**, not to the time frame of the notebook. However, you have the ability to set a custom time frame on the dashboard widget. @@ -163,7 +163,7 @@ With scheduled reports, you can automatically receive query results from noteboo To schedule a report on an analysis cell: -1. Open the dropdown next to **Save to Dashboard** and select **Schedule report**. +1. Open the dropdown next to {{< ui >}}Save to Dashboard{{< /ui >}} and select {{< ui >}}Schedule report{{< /ui >}}. {{< img src="/notebooks/analysis_features/schedule_report_from_cell_v2.png" alt="Dropdown menu showing the Schedule report option highlighted" style="width:50%;" >}} @@ -177,7 +177,7 @@ To schedule a report on an analysis cell: 4. Add email recipients. - The email associated with your Datadog account is included automatically. To remove it, hover over your email and click the trash icon. - - To preview the report before saving the schedule, click **Send Test Email**. + - To preview the report before saving the schedule, click {{< ui >}}Send Test Email{{< /ui >}}. **Note**: Only Enterprise and Pro accounts can send reports to email addresses that aren't associated with registered Datadog users. @@ -185,26 +185,26 @@ To schedule a report on an analysis cell: {{< img src="/notebooks/analysis_features/report_email.png" alt="Example report email" style="width:90%;" >}} 5. Add Slack recipients. - - Click on the **Slack** tab, then choose a workspace and channel. + - Click on the {{< ui >}}Slack{{< /ui >}} tab, then choose a workspace and channel. - If no workspaces appear, verify that the Datadog [Slack Integration][6] is installed. - Public channels are listed automatically. To send to a private channel, invite the Datadog Slack bot to your channel. - - To preview the message, add a channel and click **Send Test Message.** + - To preview the message, add a channel and click {{< ui >}}Send Test Message{{< /ui >}}. {{< img src="/notebooks/analysis_features/add_slack_recipients.png" alt="Slack recipient selection in the report scheduling modal" style="width:100%;" >}} 6. Add Microsoft Teams recipients. - - Click on the **Microsoft Teams** tab, then choose a **Tenant**, **Team**, and **Channel**. + - Click on the {{< ui >}}Microsoft Teams{{< /ui >}} tab, then choose a {{< ui >}}Tenant{{< /ui >}}, {{< ui >}}Team{{< /ui >}}, and {{< ui >}}Channel{{< /ui >}}. - Ensure the [Microsoft Teams integration][7] is installed in your Datadog organization. - The Datadog app must be added to the target Team in Microsoft Teams. - - To preview the message, add a channel and click **Send Test Message.** + - To preview the message, add a channel and click {{< ui >}}Send Test Message{{< /ui >}}. 7. Save your schedule. -You can view, search, edit, and delete existing report schedules from the **Reports** tab: +You can view, search, edit, and delete existing report schedules from the {{< ui >}}Reports{{< /ui >}} tab: {{< img src="/notebooks/analysis_features/reports_page.png" alt="Filtered view of the Reports tab" style="width:90%;" >}} -**Note**: To schedule reports and view other users' schedules, users need the **CSV Report Schedules Write** permission. To edit other users' schedules, users need the **CSV Report Schedules Manage** permission. These permissions can be granted by a user with the **Org Management** permission. +**Note**: To schedule reports and view other users' schedules, users need the `CSV Report Schedules Write` permission. To edit other users' schedules, users need the `CSV Report Schedules Manage` permission. These permissions can be granted by a user with the `Org Management` permission. ## Further reading diff --git a/content/en/notebooks/guide/build_diagrams_with_mermaidjs.md b/content/en/notebooks/guide/build_diagrams_with_mermaidjs.md index e81b0703d9e..48b430b38ed 100644 --- a/content/en/notebooks/guide/build_diagrams_with_mermaidjs.md +++ b/content/en/notebooks/guide/build_diagrams_with_mermaidjs.md @@ -12,9 +12,9 @@ Mermaid is a JavaScript-based tool for creating diagrams and flowcharts in Markd ## Setup To create a new diagram in your notebook: -1. Add a new Markdown cell, with `/markdown` or the **Add Cell** menu. -1. Select **Code Block** from inside the Markdown editor. -1. Select **Mermaid-JS**. +1. Add a new Markdown cell, with `/markdown` or the {{< ui >}}Add Cell{{< /ui >}} menu. +1. Select {{< ui >}}Code Block{{< /ui >}} from inside the Markdown editor. +1. Select {{< ui >}}Mermaid-JS{{< /ui >}}. In the Datadog site, there is also a [Build Diagrams with Mermaid JS][3] template, which you can use to get started and to see diagram examples. @@ -34,7 +34,7 @@ graph TD; ``` {{< /code-block >}} -Copy the example flowchart syntax into the mermaid code block. After you click **Done** the cell will populate the diagram. +Copy the example flowchart syntax into the mermaid code block. After you click {{< ui >}}Done{{< /ui >}} the cell will populate the diagram. {{< img src="/notebooks/guide/build_diagrams_with_mermaidjs/build-diagram-mermaidjs.mp4" alt="Setup steps with example flowchart syntax" video=true style="width:100%;" >}} diff --git a/content/en/notebooks/guide/template_variables_analysis_notebooks.md b/content/en/notebooks/guide/template_variables_analysis_notebooks.md index 8ce9d06d915..f5d0ab6500f 100644 --- a/content/en/notebooks/guide/template_variables_analysis_notebooks.md +++ b/content/en/notebooks/guide/template_variables_analysis_notebooks.md @@ -36,7 +36,7 @@ For all supported widgets, results update dynamically when template variables ch * Template variables cannot be used in the name of the data source. ### Transformation -* Supported only in **Filter** operations. +* Supported only in {{< ui >}}Filter{{< /ui >}} operations. * Multiple filter operations can reference different template variables. * Template variables cannot be used in the name of a transformation. * Filter operations are used to calculate the usages of template variables in the template variable edit modal. Each filter operation counts towards the total number of potential usages. @@ -53,7 +53,7 @@ For all supported widgets, results update dynamically when template variables ch ### SQL analysis * **Not supported**. * Template variables cannot be used in SQL queries. -* Not included in template variable usage counts and unaffected by **Add all / Remove all** operations. +* Not included in template variable usage counts and unaffected by {{< ui >}}Add all / Remove all{{< /ui >}} operations. ### Published datasets diff --git a/content/en/notebooks/guide/version_history.md b/content/en/notebooks/guide/version_history.md index 5a95f674efa..5aef0db907b 100644 --- a/content/en/notebooks/guide/version_history.md +++ b/content/en/notebooks/guide/version_history.md @@ -23,7 +23,7 @@ All notebooks have a default 30 days retention of version history. In order to s With [Audit Trail][1] enabled, the version history is extended from 30 days to 90 days. After enabling Audit Trail, you are able to see any edits made between 30 to 90 days ago on all existing notebooks. ## View versions -From a notebook, click the **Configure** icon and click **Version History** to open the Version History side panel. If there are no edits within the retention period, the Version History option is disabled. +From a notebook, click the {{< ui >}}Configure{{< /ui >}} icon and click {{< ui >}}Version History{{< /ui >}} to open the Version History side panel. If there are no edits within the retention period, the Version History option is disabled. {{< img src="/notebooks/guide/version_history/disabled_version_history.png" alt="Disabled version history option in a notebook" style="width:100%;" >}} @@ -42,13 +42,13 @@ There are two ways you can restore your notebook to a previous version. {{< img src="/notebooks/guide/version_history/version_history_options.png" alt="Example notebooks showing version history options" style="width:100%;" >}} -- From the Version History side panel, after you choose the version to restore, click the kebab menu to the right of a user profile and select **Restore this version**. -- When the Version History side panel opens up, a button appears at the top of the page to **Restore this version**. +- From the Version History side panel, after you choose the version to restore, click the kebab menu to the right of a user profile and select {{< ui >}}Restore this version{{< /ui >}}. +- When the Version History side panel opens up, a button appears at the top of the page to {{< ui >}}Restore this version{{< /ui >}}. Restoring a version updates the notebook to that version for all users and a new entry is added to the version history showing the restore. This does not overwrite the history of your changes, so you are still able preview and restore to any versions within your retention period. ## Clone a version -If you do not want to change your current notebook but you'd like to create a copy of a previous version, you can create a clone from any version in your version history. From the Version History side panel after you choose the version you want to make a copy of, click the kebab menu to the right of a user profile and select **Clone**. +If you do not want to change your current notebook but you'd like to create a copy of a previous version, you can create a clone from any version in your version history. From the Version History side panel after you choose the version you want to make a copy of, click the kebab menu to the right of a user profile and select {{< ui >}}Clone{{< /ui >}}. ## Version History retention diff --git a/content/en/observability_pipelines/configuration/access_control.md b/content/en/observability_pipelines/configuration/access_control.md index 7ea8757a3fb..cca83a4a25c 100644 --- a/content/en/observability_pipelines/configuration/access_control.md +++ b/content/en/observability_pipelines/configuration/access_control.md @@ -17,7 +17,7 @@ See the [list of permissions][3] for Observability Pipelines' assets and what le ## Granular access control -[Granular access control][4] can only restrict access to resources and does **not** elevate permissions. For example, if a user has the **Datadog Read Only Role** and they are given the **Editor** access for a specific pipeline using granular access control, the user still only has read-only access to this pipeline and cannot edit it. You need to update their role to one that allows pipeline editing if you want them to be able to make changes to this pipeline and other pipelines. +[Granular access control][4] can only restrict access to resources and does **not** elevate permissions. For example, if a user has the **Datadog Read Only Role** and they are given the {{< ui >}}Editor{{< /ui >}} access for a specific pipeline using granular access control, the user still only has read-only access to this pipeline and cannot edit it. You need to update their role to one that allows pipeline editing if you want them to be able to make changes to this pipeline and other pipelines. {{< img src="observability_pipelines/access_control/menu.png" alt="The pipeline page showing the Access Control menu" style="width:40%;" >}} @@ -47,19 +47,19 @@ To use granular access controls to limit access to a specific pipeline: 1. Navigate to the [Pipelines][5] page. 1. Select the pipeline you want to restrict access to. 1. Click the cog on the upper right side of the page. -1. Click **Edit Access** > **Pipeline Access**. -1. Click **Restrict Access**. -1. The **Organization access** section shows that members of your organization have **Viewer** access by default. Use the dropdown menu to select what kind of access you want them to have. -1. Click the dropdown menu in the **Restricted** section to set access levels for Teams, roles, users, or service accounts. -1. Click **Copy Link** if you want to provide the pipeline link to users who are getting access to this pipeline. -1. Click **Save**. +1. Click {{< ui >}}Edit Access{{< /ui >}} > {{< ui >}}Pipeline Access{{< /ui >}}. +1. Click {{< ui >}}Restrict Access{{< /ui >}}. +1. The {{< ui >}}Organization access{{< /ui >}} section shows that members of your organization have {{< ui >}}Viewer{{< /ui >}} access by default. Use the dropdown menu to select what kind of access you want them to have. +1. Click the dropdown menu in the {{< ui >}}Restricted{{< /ui >}} section to set access levels for Teams, roles, users, or service accounts. +1. Click {{< ui >}}Copy Link{{< /ui >}} if you want to provide the pipeline link to users who are getting access to this pipeline. +1. Click {{< ui >}}Save{{< /ui >}}. To restore full access to a pipeline: 1. Click the cog on the upper right side of your pipeline's page. -1. Click **Edit Access** > **Pipeline Access**. -1. Click **Restore Full Access**. -1. Click **Save**. +1. Click {{< ui >}}Edit Access{{< /ui >}} > {{< ui >}}Pipeline Access{{< /ui >}}. +1. Click {{< ui >}}Restore Full Access{{< /ui >}}. +1. Click {{< ui >}}Save{{< /ui >}}. ### Restrict access to Live Capture for a pipeline @@ -79,7 +79,7 @@ You can restrict access to Live Capture **for a specific pipeline** with the fol **Notes**: -- You can't save granular access settings if there isn't at least one user with **Editor** access to Live Capture. +- You can't save granular access settings if there isn't at least one user with {{< ui >}}Editor{{< /ui >}} access to Live Capture. - You can lock yourself out of Live Capture for a specific pipeline even if you created the pipeline. When you edit granular access restrictions for Live Capture access and you want to have Editor access for Live Capture, make sure you are one of the users or part of a Team or role with Editor access. {{< img src="observability_pipelines/access_control/live_capture_modal.png" alt="The pipeline access control modal showing restriction options" style="width:60%;" >}} @@ -89,18 +89,18 @@ To use granular access controls to limit access to Live Capture for a specific p 1. Navigate to the [Pipelines][6] page. 1. Select the pipeline you want to restrict access to. 1. Click the cog on the upper right side of the page. -1. Click **Edit Access** > **Live Capture Access**. -1. Click **Restrict Access**. -1. The **Organization access** section shows that members of your organization have **Viewer** access by default. Use the dropdown menu to select what kind of access you want them to have. -1. Click the dropdown menu in the **Restricted** section to set access levels for Teams, roles, users, or service accounts based on your use case. -1. Click **Save**. +1. Click {{< ui >}}Edit Access{{< /ui >}} > {{< ui >}}Live Capture Access{{< /ui >}}. +1. Click {{< ui >}}Restrict Access{{< /ui >}}. +1. The {{< ui >}}Organization access{{< /ui >}} section shows that members of your organization have {{< ui >}}Viewer{{< /ui >}} access by default. Use the dropdown menu to select what kind of access you want them to have. +1. Click the dropdown menu in the {{< ui >}}Restricted{{< /ui >}} section to set access levels for Teams, roles, users, or service accounts based on your use case. +1. Click {{< ui >}}Save{{< /ui >}}. To restore full access to Live Capture for a pipeline: 1. Click the cog on the upper right side of your pipeline's page. -1. Click **Edit Access** > **Live Capture Access**. -1. Click **Restore Full Access**. -1. Click **Save**. +1. Click {{< ui >}}Edit Access{{< /ui >}} > {{< ui >}}Live Capture Access{{< /ui >}}. +1. Click {{< ui >}}Restore Full Access{{< /ui >}}. +1. Click {{< ui >}}Save{{< /ui >}}. [1]: /account_management/rbac/?tab=datadogapplication#role-based-access-control [2]: /account_management/teams/ diff --git a/content/en/observability_pipelines/configuration/export_and_import_pipeline_configurations.md b/content/en/observability_pipelines/configuration/export_and_import_pipeline_configurations.md index 5cd27800f44..24666fa82fb 100644 --- a/content/en/observability_pipelines/configuration/export_and_import_pipeline_configurations.md +++ b/content/en/observability_pipelines/configuration/export_and_import_pipeline_configurations.md @@ -29,7 +29,7 @@ When building a pipeline that has not been deployed yet, you can set up the pipe 1. Navigate to [Observability Pipelines][1]. 1. [Set up a pipeline][2] by adding your source, processors, and destinations. -1. After your pipeline has been configured, click **Export Pipeline**. +1. After your pipeline has been configured, click {{< ui >}}Export Pipeline{{< /ui >}}. {{< img src="observability_pipelines/export_pipeline/export_draft_pipeline.png" alt="The export button highlighted in the pipeline UI" style="width:100%;" >}} 1. Click the copy or download button to export the configuration as JSON or Terraform. {{< img src="observability_pipelines/export_pipeline/export_json_modal.png" alt="The export modal showing the pipeline configuration in JSON" style="width:100%;" >}} @@ -46,7 +46,7 @@ When viewing a deployed pipeline in the UI, you can export its configuration to 1. Navigate to [Observability Pipelines][1]. 1. Select a deployed pipeline (status can be `active` or `inactive`) to view the configuration. -1. Click **Export Pipeline**. +1. Click {{< ui >}}Export Pipeline{{< /ui >}}. {{< img src="observability_pipelines/export_pipeline/export_deployed_pipeline.png" alt="The export button on a deployed pipeline page" style="width:100%;" >}} 1. Click the copy or download button to export the configuration as JSON or Terraform. 1. Update the JSON or Terraform configuration for any additional changes you want to make and then deploy the configuration programmatically. @@ -60,7 +60,7 @@ When editing a deployed pipeline, you can add new components such as [Packs][6] 1. Navigate to [Observability Pipelines][1]. 1. Select a deployed pipeline (status can be either `active` or `inactive`) to view the configuration. 1. Make changes to your source, destinations, or processors. -1. Before exiting the pipeline, click **Export Pipeline**. +1. Before exiting the pipeline, click {{< ui >}}Export Pipeline{{< /ui >}}. {{< img src="observability_pipelines/export_pipeline/export_deployed_pipeline_edit.png" alt="The export button highlighted on the pipeline edit page" style="width:100%;" >}} 1. Click the copy or download button to export the configuration as JSON or Terraform. - **Note**: After making updates to your pipeline in the UI, the exported configuration includes the latest changes, even if you haven't saved or deployed the changes. @@ -77,11 +77,11 @@ To help build your pipelines and transfer pipeline configurations across Datadog 1. Navigate to [Observability Pipelines][1]. 1. Select a draft pipeline to view the configuration. -1. Click on the settings and select **Import Pipeline** +1. Click on the settings and select {{< ui >}}Import Pipeline{{< /ui >}} {{< img src="observability_pipelines/export_pipeline/import_access.png" alt="The settings menu showing Import Pipeline" style="width:100%;" >}} 1. Choose a pipeline configuration as a JSON file from your computer. {{< img src="observability_pipelines/export_pipeline/import_select.png" alt="The import modal giving the option to select a JSON file" style="width:100%;" >}} -1. Click Import. This replaces your current pipeline configuration with the imported JSON's pipeline configuration. +1. Click {{< ui >}}Import{{< /ui >}}. This replaces your current pipeline configuration with the imported JSON's pipeline configuration. 1. [Install the Observability Pipelines Worker and deploy your pipeline using the UI][8]. ## Further reading diff --git a/content/en/observability_pipelines/configuration/install_the_worker/_index.mdoc.md b/content/en/observability_pipelines/configuration/install_the_worker/_index.mdoc.md index 77ec00ad706..22c1f584980 100644 --- a/content/en/observability_pipelines/configuration/install_the_worker/_index.mdoc.md +++ b/content/en/observability_pipelines/configuration/install_the_worker/_index.mdoc.md @@ -272,11 +272,11 @@ See [Update Existing Pipelines][13] if you want to make changes to your pipeline **Note**: All other parameters are set to reasonable defaults for a Worker deployment, but you can adjust them for your use case as needed in the AWS Console before creating the stack. 1. Select the AWS region you want to use to install the Worker. -1. Click **Select API key** to choose the Datadog API key you want to use. +1. Click {% ui %}Select API key{% /ui %} to choose the Datadog API key you want to use. - **Note**: The API key must be [enabled for Remote Configuration][10]. -1. Click **Launch CloudFormation Template** to navigate to the AWS Console to review the stack configuration and then launch it. Make sure the CloudFormation parameters are as expected. +1. Click {% ui %}Launch CloudFormation Template{% /ui %} to navigate to the AWS Console to review the stack configuration and then launch it. Make sure the CloudFormation parameters are as expected. 1. Select the VPC and subnet you want to use to install the Worker. -1. Review and check the necessary permissions checkboxes for IAM. Click **Submit** to create the stack. CloudFormation handles the installation at this point; the Worker instances are launched, the necessary software is downloaded, and the Worker starts automatically. +1. Review and check the necessary permissions checkboxes for IAM. Click {% ui %}Submit{% /ui %} to create the stack. CloudFormation handles the installation at this point; the Worker instances are launched, the necessary software is downloaded, and the Worker starts automatically. **Note**: If you are using a firewall, see [Add domains to firewall allowlist](#add-domains-to-firewall-allowlist). @@ -294,13 +294,13 @@ See [Update Existing Pipelines][13] if you want to make changes to your pipeline {% partial file="observability_pipelines/install_the_worker/ui-intro.mdoc.md" /%} -1. Select **Docker** as your installation platform. +1. Select {% ui %}Docker{% /ui %} as your installation platform. {% if equals($secrets_source, "secrets_management") %} -2. In **Review your secrets management**, ensure that your secrets are configured in your secrets manager. -3. Click **Select API key** to choose the Datadog API key you want to use. +2. In {% ui %}Review your secrets management{% /ui %}, ensure that your secrets are configured in your secrets manager. +3. Click {% ui %}Select API key{% /ui %} to choose the Datadog API key you want to use. - **Note**: The API key must be [enabled for Remote Configuration][10]. 4. Run the command provided in the UI to install the Worker. The command points to the Worker bootstrap file that you configure to resolve secrets using your secrets manager. @@ -311,19 +311,19 @@ See [Update Existing Pipelines][13] if you want to make changes to your pipeline sudo systemctl restart observability-pipelines-worker ``` -7. Navigate back to the Observability Pipelines installation page and click **Deploy**. +7. Navigate back to the Observability Pipelines installation page and click {% ui %}Deploy{% /ui %}. {% /if %} {% if equals($secrets_source, "environment_variables") %} -2. In **Review your secrets management**, enter the [environment variables][7] for your sources and destinations, if applicable. -3. Click **Select API key** to choose the Datadog API key you want to use. +2. In {% ui %}Review your secrets management{% /ui %}, enter the [environment variables][7] for your sources and destinations, if applicable. +3. Click {% ui %}Select API key{% /ui %} to choose the Datadog API key you want to use. - **Note**: The API key must be [enabled for Remote Configuration][10]. -4. Run the command provided in the UI to install the Worker. The command is automatically populated with the environment variables you entered in **Review your secrets management**. +4. Run the command provided in the UI to install the Worker. The command is automatically populated with the environment variables you entered in {% ui %}Review your secrets management{% /ui %}. -5. Navigate back to the Observability Pipelines installation page and click **Deploy**. +5. Navigate back to the Observability Pipelines installation page and click {% ui %}Deploy{% /ui %}. {% /if %} @@ -344,25 +344,25 @@ See [Update Existing Pipelines][13] if you want to make changes to your pipeline {% partial file="observability_pipelines/install_the_worker/ui-intro.mdoc.md" /%} -1. Select **Kubernetes** as your installation platform. +1. Select {% ui %}Kubernetes{% /ui %} as your installation platform. {% if equals($secrets_source, "secrets_management") %} -2. In **Review your secrets management**, ensure that your secrets are configured in your secrets manager. +2. In {% ui %}Review your secrets management{% /ui %}, ensure that your secrets are configured in your secrets manager. {% partial file="observability_pipelines/install_the_worker/ui-kubernetes.mdoc.md" /%} 6. Configure your `values.yaml` file for your secrets manager. See [Secrets Management][18]. 7. Run the command provided in the UI to install the Worker. -8. Navigate back to the Observability Pipelines installation page and click **Deploy**. +8. Navigate back to the Observability Pipelines installation page and click {% ui %}Deploy{% /ui %}. {% /if %} {% if equals($secrets_source, "environment_variables") %} -2. In **Review your secrets management**, enter the [environment variables][7] for your sources and destinations, if applicable. +2. In {% ui %}Review your secrets management{% /ui %}, enter the [environment variables][7] for your sources and destinations, if applicable. {% partial file="observability_pipelines/install_the_worker/ui-kubernetes.mdoc.md" /%} 6. Run the command provided in the UI to install the Worker. The command is automatically populated with the environment variables you entered earlier. -7. Navigate back to the Observability Pipelines installation page and click **Deploy**. +7. Navigate back to the Observability Pipelines installation page and click {% ui %}Deploy{% /ui %}. {% /if %} {% /if %} @@ -372,19 +372,19 @@ See [Update Existing Pipelines][13] if you want to make changes to your pipeline {% partial file="observability_pipelines/install_the_worker/ui-intro.mdoc.md" /%} -1. Select **Linux** as your installation platform. +1. Select {% ui %}Linux{% /ui %} as your installation platform. {% if equals($secrets_source, "secrets_management") %} -2. In **Review your secrets management**, ensure that your secrets are configured in your secrets manager. +2. In {% ui %}Review your secrets management{% /ui %}, ensure that your secrets are configured in your secrets manager. {% partial file="observability_pipelines/install_the_worker/ui-linux.mdoc.md" /%} 5. Modify the Worker bootstrap file to connect the Worker to your secrets manager. See [Secrets Management][12] for more information. 6. Restart the Worker to use the updated bootstrap file: ``` sudo systemctl restart observability-pipelines-worker ``` -7. Navigate back to the Observability Pipelines installation page and click **Deploy**. +7. Navigate back to the Observability Pipelines installation page and click {% ui %}Deploy{% /ui %}. **Note**: If you are using a firewall, see [Add domains to firewall allowlist](#add-domains-to-firewall-allowlist). @@ -393,9 +393,9 @@ See [Update Existing Pipelines][13] if you want to make changes to your pipeline {% if equals($secrets_source, "environment_variables") %} -2. In **Review your secrets management**, enter the [environment variables][7] for your sources and destinations, if applicable. +2. In {% ui %}Review your secrets management{% /ui %}, enter the [environment variables][7] for your sources and destinations, if applicable. {% partial file="observability_pipelines/install_the_worker/ui-linux.mdoc.md" /%} -5. Navigate back to the Observability Pipelines installation page and click **Deploy**. +5. Navigate back to the Observability Pipelines installation page and click {% ui %}Deploy{% /ui %}. {% partial file="observability_pipelines/install_the_worker/install-script-notes.mdoc.md" /%} @@ -410,19 +410,19 @@ See [Update Existing Pipelines][13] if you want to make changes to your pipeline {% partial file="observability_pipelines/install_the_worker/ui-intro.mdoc.md" /%} -1. Select **CloudFormation** as your installation platform. +1. Select {% ui %}CloudFormation{% /ui %} as your installation platform. {% if equals($secrets_source, "secrets_management") %} -2. In **Review your secrets management**, ensure that your secrets are configured in your secrets manager. +2. In {% ui %}Review your secrets management{% /ui %}, ensure that your secrets are configured in your secrets manager. {% /if %} {% if equals($secrets_source, "environment_variables") %} -2. In **Review your secrets management**, enter the [environment variables][7] for your sources and destinations, if applicable. +2. In {% ui %}Review your secrets management{% /ui %}, enter the [environment variables][7] for your sources and destinations, if applicable. {% /if %} @@ -438,12 +438,12 @@ See [Update Existing Pipelines][13] if you want to make changes to your pipeline **Note**: All other parameters are set to reasonable defaults for a Worker deployment, but you can adjust them for your use case as needed in the AWS Console before creating the stack. 4. Select the AWS region you want to use to install the Worker. -5. Click **Select API key** to choose the Datadog API key you want to use. +5. Click {% ui %}Select API key{% /ui %} to choose the Datadog API key you want to use. - **Note**: The API key must be [enabled for Remote Configuration][10]. -6. Click **Launch CloudFormation Template** to navigate to the AWS Console to review the stack configuration and then launch it. Make sure the CloudFormation parameters are as expected. +6. Click {% ui %}Launch CloudFormation Template{% /ui %} to navigate to the AWS Console to review the stack configuration and then launch it. Make sure the CloudFormation parameters are as expected. 7. Select the VPC and subnet you want to use to install the Worker. -8. Review and check the necessary permissions checkboxes for IAM. Click **Submit** to create the stack. CloudFormation handles the installation at this point; the Worker instances are launched, the necessary software is downloaded, and the Worker starts automatically. -9. Navigate back to the Observability Pipelines installation page and click **Deploy**. +8. Review and check the necessary permissions checkboxes for IAM. Click {% ui %}Submit{% /ui %} to create the stack. CloudFormation handles the installation at this point; the Worker instances are launched, the necessary software is downloaded, and the Worker starts automatically. +9. Navigate back to the Observability Pipelines installation page and click {% ui %}Deploy{% /ui %}. **Note**: If you are using a firewall, see [Add domains to firewall allowlist](#add-domains-to-firewall-allowlist). @@ -817,7 +817,7 @@ Follow these steps to manually install the Worker, instead of running the one-li {% if equals($interface, "ui") %} -5. Navigate back to the Observability Pipelines installation page and click **Deploy**. +5. Navigate back to the Observability Pipelines installation page and click {% ui %}Deploy{% /ui %}. {% partial file="observability_pipelines/install_the_worker/install-script-notes.mdoc.md" /%} @@ -888,7 +888,7 @@ Follow these steps to manually install the Worker, instead of running the one-li {% if equals($interface, "ui") %} -5. Navigate back to the Observability Pipelines installation page and click **Deploy**. +5. Navigate back to the Observability Pipelines installation page and click {% ui %}Deploy{% /ui %}. {% partial file="observability_pipelines/install_the_worker/install-script-notes.mdoc.md" /%} diff --git a/content/en/observability_pipelines/configuration/install_the_worker/run_multiple_pipelines_on_a_host.md b/content/en/observability_pipelines/configuration/install_the_worker/run_multiple_pipelines_on_a_host.md index 1142886e235..b1595ddca6e 100644 --- a/content/en/observability_pipelines/configuration/install_the_worker/run_multiple_pipelines_on_a_host.md +++ b/content/en/observability_pipelines/configuration/install_the_worker/run_multiple_pipelines_on_a_host.md @@ -127,7 +127,7 @@ Additionally, you can use the command `sudo journalctl -u op-fluent.service` to ## Deploy the pipeline 1. Navigate to the additional pipeline's Install page. -1. In the **Deploy your pipeline** section, you should see your additional Worker detected. Click **Deploy**. +1. In the {{< ui >}}Deploy your pipeline{{< /ui >}} section, you should see your additional Worker detected. Click {{< ui >}}Deploy{{< /ui >}}. [1]: /observability_pipelines/configuration/set_up_pipelines/?tab=pipelineui [2]: /observability_pipelines/guide/environment_variables/?tab=sources diff --git a/content/en/observability_pipelines/configuration/live_capture.md b/content/en/observability_pipelines/configuration/live_capture.md index 74264cbc376..53b1d9048e1 100644 --- a/content/en/observability_pipelines/configuration/live_capture.md +++ b/content/en/observability_pipelines/configuration/live_capture.md @@ -52,8 +52,8 @@ If you want to use Live Capture and are using a firewall, you must add these dom 1. Navigate to [Observability Pipelines][3]. 1. Select your pipeline. 1. Click the cog for the source or processor that you want to capture events for. -1. Select **Capture and view events** in the side panel. -1. Click **Capture**. +1. Select {{< ui >}}Capture and view events{{< /ui >}} in the side panel. +1. Click {{< ui >}}Capture{{< /ui >}}. 1. **Optional configurations**: {{< img src="observability_pipelines/live_capture_optional_config.png" alt="The Live Capture optional configuration modal showing the filter query, capture duration, and Worker selection options" style="width:60%;" >}} **Note**: Optional configurations are only available if all active Workers are version 2.13 or later. @@ -62,13 +62,13 @@ If you want to use Live Capture and are using a firewall, you must add these dom - Minimum duration (default if no duration is specified): 30 seconds - Maximum duration: 300 seconds (5 minutes) 1. Select which Workers you want to capture events from. If no Workers are selected, a random Worker is chosen. -1. Click **Capture** to start capturing events.
**Note**: It might take up to 60 seconds for captured events to appear in the UI. Captured data is visible to all users with view access, and is stored in the Datadog Platform for 72 hours. +1. Click {{< ui >}}Capture{{< /ui >}} to start capturing events.
**Note**: It might take up to 60 seconds for captured events to appear in the UI. Captured data is visible to all users with view access, and is stored in the Datadog Platform for 72 hours. 1. After the capture is complete: 1. Click a specific captured event to see the data that was received and sent out. You can also search for specific events in the search bar. Use the dropdown menu next to the search bar to show events based on status (`MODIFIED`, `UNMODIFIED`, `DROPPED`, and `REDUCED`). - 1. In the **Workers - Capture Execution Details** section, click **View Logs** to see the Worker logs for the capture. -1. To see other captures for the same component, click **Captures** on the top left of the side panel. **Note**: Viewing other captures only applies if all active Workers are version 2.13 or later. + 1. In the {{< ui >}}Workers - Capture Execution Details{{< /ui >}} section, click {{< ui >}}View Logs{{< /ui >}} to see the Worker logs for the capture. +1. To see other captures for the same component, click {{< ui >}}Captures{{< /ui >}} on the top left of the side panel. **Note**: Viewing other captures only applies if all active Workers are version 2.13 or later. - You can filter captures by capture event ID, filter query, pipeline version, or status (`in_progress` or `completed`). - - For the **Total Events** column, the maximum captured events per Worker is 200 when including both the input and output of an event. + - For the {{< ui >}}Total Events{{< /ui >}} column, the maximum captured events per Worker is 200 when including both the input and output of an event. ## Further reading diff --git a/content/en/observability_pipelines/configuration/pipeline_simulation.md b/content/en/observability_pipelines/configuration/pipeline_simulation.md index 335a9f8fa67..702faa93c43 100644 --- a/content/en/observability_pipelines/configuration/pipeline_simulation.md +++ b/content/en/observability_pipelines/configuration/pipeline_simulation.md @@ -61,8 +61,8 @@ If you are using a firewall, add these domains to the allowlist: Before running a simulation, you need to capture sample log data to test against. Pipeline Simulation lets you capture live data from an active pipeline, reuse previously captured samples, or import your own data. 1. Navigate to [Observability Pipelines][3]. -1. [Set up a pipeline][4] or select a pipeline and click **Edit Pipeline** on the top right side of the page. -1. On the pipeline's edit page, you can expand a processor in a processor group to view its read-only configuration. To edit any processors, capture data, and run a simulation, click **Edit** on a processor group. +1. [Set up a pipeline][4] or select a pipeline and click {{< ui >}}Edit Pipeline{{< /ui >}} on the top right side of the page. +1. On the pipeline's edit page, you can expand a processor in a processor group to view its read-only configuration. To edit any processors, capture data, and run a simulation, click {{< ui >}}Edit{{< /ui >}} on a processor group. {{< img src="observability_pipelines/pipeline_simulation/pipeline_simulation_edit_processor_group.png" alt="A pipeline's edit page with the Edit button on a processor group highlighted." style="width:100%;" >}} The status of a pipeline determines whether a simulation can be run with live data, imported data, or both. @@ -81,22 +81,22 @@ For active pipelines, Observability Pipelines automatically runs a Live Capture To run a capture for a specific set of data: -1. Click **Live Capture**. +1. Click {{< ui >}}Live Capture{{< /ui >}}. 1. (Optional) Enter a query to specify which events you want to capture. The default query is `*`. - Use a capture query, such as `service:cloudtrail env:prod`, to target a specific set of logs. This helps to distinguish between different sets of logs you use for your simulations. For example, you can capture a set of logs for custom app log processors and another for the [Cloudflare Pack][5]. - For more information on creating queries, see [Search Syntax for Logs][6] or [Search Syntax for Metrics][7]. 1. (Optional) Enter a capture duration (in seconds or minutes) for how long you want events to be captured. - Minimum duration (default, if no duration is specified): 30 seconds - Maximum duration: 300 seconds (5 minutes) -1. Click **Capture**. +1. Click {{< ui >}}Capture{{< /ui >}}. ### Import your own sample data for a simulation To import sample data for your pipeline simulation: -1. For an inactive or draft pipeline, if the pipeline does not have saved data, click **Import Data**. Otherwise, click the down arrow next to **Live Capture** and select **Import Sample Data**. -1. In the modal, drag and drop your sample data files or browse for them, or click the **Paste** tab to paste your sample data. **Note**: Sample data must be in a JSON or JSONL file. See [Sample file import specifications](#sample-file-import-specifications) for more details. -1. Click **Confirm**. +1. For an inactive or draft pipeline, if the pipeline does not have saved data, click {{< ui >}}Import Data{{< /ui >}}. Otherwise, click the down arrow next to {{< ui >}}Live Capture{{< /ui >}} and select {{< ui >}}Import Sample Data{{< /ui >}}. +1. In the modal, drag and drop your sample data files or browse for them, or click the {{< ui >}}Paste{{< /ui >}} tab to paste your sample data. **Note**: Sample data must be in a JSON or JSONL file. See [Sample file import specifications](#sample-file-import-specifications) for more details. +1. Click {{< ui >}}Confirm{{< /ui >}}. #### Sample file import specifications @@ -166,8 +166,8 @@ The following is an example JSONL file you can import for a simulation: After you use Live Capture to pull data from your pipeline, the results are stored for 72 hours in the Datadog platform and can be used for simulations. To use previously captured data for your pipeline simulation: -1. Click the down arrow next to **Live Capture** and select **See Saved Samples**. -1. Click **Use as Sample Data** for the live capture or previously imported data you want to use. +1. Click the down arrow next to {{< ui >}}Live Capture{{< /ui >}} and select {{< ui >}}See Saved Samples{{< /ui >}}. +1. Click {{< ui >}}Use as Sample Data{{< /ui >}} for the live capture or previously imported data you want to use. {{< img src="observability_pipelines/pipeline_simulation/pipeline_simulation_saved_samples.png" alt="The Saved Samples view with the Use as Sample Data button for a previous capture." style="width:100%;" >}} @@ -176,21 +176,21 @@ After you use Live Capture to pull data from your pipeline, the results are stor After you have captured data for your pipeline simulation, edit your pipeline processors and run a simulation. 1. Navigate to [Observability Pipelines][3]. -1. Select your pipeline and click **Edit Pipeline** on the top right side of the page. -1. On the pipeline edit page, click **Edit** on a processor group to add or edit processors in your pipeline. -1. In the **Processor Group** dropdown menu on the left side of the Pipeline Simulation page, select the processor group with the processors you want to update and test. You can hover over **Processor Group** to see a snapshot of where the processors are in the pipeline. +1. Select your pipeline and click {{< ui >}}Edit Pipeline{{< /ui >}} on the top right side of the page. +1. On the pipeline edit page, click {{< ui >}}Edit{{< /ui >}} on a processor group to add or edit processors in your pipeline. +1. In the {{< ui >}}Processor Group{{< /ui >}} dropdown menu on the left side of the Pipeline Simulation page, select the processor group with the processors you want to update and test. You can hover over {{< ui >}}Processor Group{{< /ui >}} to see a snapshot of where the processors are in the pipeline. {{< img src="observability_pipelines/pipeline_simulation/processor_group_map.mp4" alt="Hovering over a processor group shows a snapshot of where the processors are in the pipeline." video="true" width="60%" >}} 1. Add and update your processors. You can update multiple processors for one simulation. **Note**: For a pipeline canvas, there is a limit of 25 processor groups and a total of 150 processors. 1. Choose a simulation scenario: - - **Run a simulation up to a specific processor group**: Keep the **End-to-End Preview** toggle disabled to see the result of logs transformed by all processors in the current processor group and the prior processor groups. See [Run a simulation up to a specific processor group](#run-a-simulation-up-to-a-specific-processor-group) for more information. - - **Run an end-to-end preview simulation**: Enable the **End-to-End Preview** toggle to run a simulation through all processor groups and see the data that is sent to the destination. See [End-to-end preview](#end-to-end-preview) for more information. + - **Run a simulation up to a specific processor group**: Keep the {{< ui >}}End-to-End Preview{{< /ui >}} toggle disabled to see the result of logs transformed by all processors in the current processor group and the prior processor groups. See [Run a simulation up to a specific processor group](#run-a-simulation-up-to-a-specific-processor-group) for more information. + - **Run an end-to-end preview simulation**: Enable the {{< ui >}}End-to-End Preview{{< /ui >}} toggle to run a simulation through all processor groups and see the data that is sent to the destination. See [End-to-end preview](#end-to-end-preview) for more information. {{< img src="observability_pipelines/pipeline_simulation/pipeline_simulation_end_to_end_toggle.png" alt="The End-to-End Preview toggle on the Pipeline Simulation page." style="width:100%;" >}} -1. Click **Preview** at the bottom of the processors panel to run the simulation. +1. Click {{< ui >}}Preview{{< /ui >}} at the bottom of the processors panel to run the simulation. {{< img src="observability_pipelines/pipeline_simulation/pipeline_simulation_preview.png" alt="The Preview button at the bottom of the processors panel." style="width:60%;" >}} 1. After the simulation is complete, you can: - See the log data that the processor received and sent out. - Enter a free-text search query to find specific logs that were captured. The query searches all attributes and tags in the logs. - - Use the **All events** dropdown menu to view events by status: + - Use the {{< ui >}}All events{{< /ui >}} dropdown menu to view events by status: - `Modified only` shows only modified events. - `Unmodified only` shows only unmodified events. - `Rerouted only` shows only logs rerouted to an overflow destination by the [Quota processor][8]. @@ -198,12 +198,12 @@ After you have captured data for your pipeline simulation, edit your pipeline pr - Metrics generated from logs with the [Generate Logs-Based Metrics][9] processor. - Logs created by the [Split Array][10] processor. - `Dropped only` shows only dropped events. - - Use the **All telemetry** dropdown menu to view `Logs only` or `Metrics only` events. `Metrics only` shows events only from the [Generate Logs-Based Metrics][9] processor. + - Use the {{< ui >}}All telemetry{{< /ui >}} dropdown menu to view `Logs only` or `Metrics only` events. `Metrics only` shows events only from the [Generate Logs-Based Metrics][9] processor. {{< img src="observability_pipelines/pipeline_simulation/view_simulation.mp4" alt="The log data the processor received and sent out, with the search bar and the status and telemetry filter dropdowns." video="true" width="70%" >}} -1. Click **Save** at the bottom right side of the page to save your changes. -1. Click **Back to Pipeline** on the top right side of the page. +1. Click {{< ui >}}Save{{< /ui >}} at the bottom right side of the page to save your changes. +1. Click {{< ui >}}Back to Pipeline{{< /ui >}} on the top right side of the page. 1. To deploy your updates to production, do one of the following: - - **Deploy updates using the UI**: Click **Next: Deploy Changes** on the pipeline page. + - **Deploy updates using the UI**: Click {{< ui >}}Next: Deploy Changes{{< /ui >}} on the pipeline page. - **Use the API to deploy changes**: See [Export and Import Configuration][11] for information on exporting pipeline configurations to JSON. - **Use Terraform to deploy changes**: See [Export and Import Configuration][11] for information on exporting pipeline configurations to Terraform. @@ -221,7 +221,7 @@ On the Pipeline Simulation page, you can choose which set of processors you want #### End-to-end preview -When you toggle **End-to-End Preview** and run a simulation, the entry event shown is the log sent from the source before any processing is done. The exit log is the result after all processors have been applied and sent to the destination. This lets you visualize how a log is transformed after it goes through the entire pipeline. +When you toggle {{< ui >}}End-to-End Preview{{< /ui >}} and run a simulation, the entry event shown is the log sent from the source before any processing is done. The exit log is the result after all processors have been applied and sent to the destination. This lets you visualize how a log is transformed after it goes through the entire pipeline. ## Further reading diff --git a/content/en/observability_pipelines/configuration/set_up_pipelines.md b/content/en/observability_pipelines/configuration/set_up_pipelines.md index e2db9709a7d..a97a21ab03f 100644 --- a/content/en/observability_pipelines/configuration/set_up_pipelines.md +++ b/content/en/observability_pipelines/configuration/set_up_pipelines.md @@ -48,10 +48,10 @@ See [Export a Pipeline Configuration to JSON or Terraform][14] if you want to pr {{% tab "Logs" %}} 1. Navigate to [Observability Pipelines][1]. -1. Select a [template][2] based on your use case or click **New Pipeline** on the top right side of the page. +1. Select a [template][2] based on your use case or click {{< ui >}}New Pipeline{{< /ui >}} on the top right side of the page. 1. Select and set up a [log source][3]. 1. Select and set up [destinations][5] for your processed logs. -1. Click **Edit** on a processor group to add, update, and validate your [processors][4] using [Pipeline Simulation][6]. +1. Click {{< ui >}}Edit{{< /ui >}} on a processor group to add, update, and validate your [processors][4] using [Pipeline Simulation][6]. - **Notes**: - For a pipeline canvas, there is a limit of 25 processor groups and a total of 150 processors. - If you want to copy a processor, click the copy icon for that processor and then use `command-v` to paste it. @@ -94,7 +94,7 @@ Metric Tag Governance is in Preview. Fill out the }}Next: Install{{< /ui >}}. See [Install the Worker][12] for instructions on how to install the Worker for your platform. See [Advanced Worker Configurations][5] for bootstrapping options. If you want to make changes to your pipeline after you have deployed it, see [Update Existing Pipelines][11]. ### Enable out-of-the-box monitors for your pipeline 1. Navigate to the [Pipelines][4] page and find your pipeline. -1. Click **Enable monitors** in the **Monitors** column for your pipeline. -1. Click **Start** to set up a monitor for one of the suggested use cases.
+1. Click {{< ui >}}Enable monitors{{< /ui >}} in the {{< ui >}}Monitors{{< /ui >}} column for your pipeline. +1. Click {{< ui >}}Start{{< /ui >}} to set up a monitor for one of the suggested use cases.
- The metric monitor is configured based on the selected use case. You can update the configuration to further customize it. See the [Metric monitor documentation][13] for more information. ## Set up a pipeline with the API @@ -159,7 +159,7 @@ To clone a pipeline in the UI: 1. Navigate to [Observability Pipelines][4]. 1. Select the pipeline you want to clone. -1. Click the cog at the top right side of the page, then select **Clone**. +1. Click the cog at the top right side of the page, then select {{< ui >}}Clone{{< /ui >}}. ## Delete a pipeline @@ -167,7 +167,7 @@ To delete a pipeline in the UI: 1. Navigate to [Observability Pipelines][4]. 1. Select the pipeline you want to delete. -1. Click the cog at the top right side of the page, then select **Delete**. +1. Click the cog at the top right side of the page, then select {{< ui >}}Delete{{< /ui >}}. **Note**: You cannot delete an active pipeline. You must stop all Workers for a pipeline before you can delete it. diff --git a/content/en/observability_pipelines/configuration/update_existing_pipelines.md b/content/en/observability_pipelines/configuration/update_existing_pipelines.md index b06f0e99837..51b3799f275 100644 --- a/content/en/observability_pipelines/configuration/update_existing_pipelines.md +++ b/content/en/observability_pipelines/configuration/update_existing_pipelines.md @@ -17,16 +17,16 @@ See [Export a Pipeline Configuration to JSON or Terraform][4] if you want to pro 1. Navigate to [Observability Pipelines][1]. 1. Select the pipeline you want to update. -1. Click **Edit Pipeline** in the top right corner. +1. Click {{< ui >}}Edit Pipeline{{< /ui >}} in the top right corner. 1. Make changes to the pipeline. - - If you are updating the source or destination settings shown in the tiles, or updating and adding processors, make the changes and then click **Deploy Changes**. - - To update source or destination environment variables, click **Go to Worker Installation Steps** and see [Update source or destination environment variables](#update-source-or-destination-environment-variables) for instructions. + - If you are updating the source or destination settings shown in the tiles, or updating and adding processors, make the changes and then click {{< ui >}}Deploy Changes{{< /ui >}}. + - To update source or destination environment variables, click {{< ui >}}Go to Worker Installation Steps{{< /ui >}} and see [Update source or destination environment variables](#update-source-or-destination-environment-variables) for instructions. 1. If you add, update, or delete a source, destination, or corresponding secrets, you must restart the Worker using a command such as `sudo systemctl restart observability-pipelines-worker` for the change to take effect. ### Update source or destination environment variables On the Worker installation page: -1. Select your platform in the **Choose your installation platform** dropdown menu. +1. Select your platform in the {{< ui >}}Choose your installation platform{{< /ui >}} dropdown menu. 1. If you want to update source environment variables, update the information for your data source. {{< tabs >}} {{% tab "Amazon Data Firehose" %}} diff --git a/content/en/observability_pipelines/destinations/amazon_opensearch.md b/content/en/observability_pipelines/destinations/amazon_opensearch.md index 99480843215..02edf907726 100644 --- a/content/en/observability_pipelines/destinations/amazon_opensearch.md +++ b/content/en/observability_pipelines/destinations/amazon_opensearch.md @@ -24,28 +24,28 @@ Configure the Amazon OpenSearch destination when you [set up a pipeline][6]. You After you select the Amazon OpenSearch destination in the pipeline UI: 1. Enter the identifier for your Amazon OpenSearch endpoint URL. If you leave it blank, the [default](#secret-defaults) is used. -1. In the **Mode** dropdown menu, select **Bulk** or **Data streams**. - - **Bulk** mode +1. In the {{< ui >}}Mode{{< /ui >}} dropdown menu, select {{< ui >}}Bulk{{< /ui >}} or {{< ui >}}Data streams{{< /ui >}}. + - {{< ui >}}Bulk{{< /ui >}} mode - Uses Amazon OpenSearch's [Bulk API][4] to send batched events directly into a standard index. - Choose this mode when you want direct control over index naming and lifecycle management. Data is appended to the index you specify, and you are responsible for handling rollovers, deletions, and mappings. - - To configure **Bulk** mode: - - In the **Index** field, optionally enter the name of the Amazon OpenSearch index. You can use [template syntax][3] to dynamically route logs to different indexes based on specific fields in your logs, for example `logs-{{service}}`. - - **Data streams** mode + - To configure {{< ui >}}Bulk{{< /ui >}} mode: + - In the {{< ui >}}Index{{< /ui >}} field, optionally enter the name of the Amazon OpenSearch index. You can use [template syntax][3] to dynamically route logs to different indexes based on specific fields in your logs, for example `logs-{{service}}`. + - {{< ui >}}Data streams{{< /ui >}} mode - Uses [Amazon OpenSearch Data Streams][5] for log storage. Data streams automatically manage backing indexes and rollovers, making them ideal for timeseries log data. - Choose this mode when you want Amazon OpenSearch to manage the index lifecycle for you. Data streams ensures smooth rollovers, Index Lifecycle Management (ILM) compatibility, and optimized handling of time-based data. - - To configure **Data streams** mode, optionally define the data stream name (default is `logs-generic-default`) by entering the following information: - - In the **Type** field, enter the category of data being ingested, for example `logs`. - - In the **Dataset** field, specify the format or data source that describes the structure, for example `apache`. - - In the **Namespace** field, enter the grouping for organizing your data streams, for example `production`. + - To configure {{< ui >}}Data streams{{< /ui >}} mode, optionally define the data stream name (default is `logs-generic-default`) by entering the following information: + - In the {{< ui >}}Type{{< /ui >}} field, enter the category of data being ingested, for example `logs`. + - In the {{< ui >}}Dataset{{< /ui >}} field, specify the format or data source that describes the structure, for example `apache`. + - In the {{< ui >}}Namespace{{< /ui >}} field, enter the grouping for organizing your data streams, for example `production`. - In the UI, there is a preview of the data stream name you configured. With the above example inputs, the data stream name that the Worker writes to is `logs-apache-production`. 1. Optionally, enter the name of the Amazon OpenSearch index. See [template syntax][3] if you want to route logs to different indexes based on specific fields in your logs. -1. Select an authentication strategy, **Basic** or **AWS**. If you selected: - - **Basic**: +1. Select an authentication strategy, {{< ui >}}Basic{{< /ui >}} or {{< ui >}}AWS{{< /ui >}}. If you selected: + - {{< ui >}}Basic{{< /ui >}}: - Enter the identifier for your Amazon OpenSearch username. If you leave it blank, the [default](#secret-defaults) is used. - Enter the identifier for your Amazon OpenSearch password. If you leave it blank, the [default](#secret-defaults) is used. - - **AWS**: + - {{< ui >}}AWS{{< /ui >}}: 1. Enter the AWS region. - 1. (Optional) Select an AWS authentication option. The **Assume role** option should only be used if the user or role you created earlier needs to assume a different role to access the specific AWS resource and that permission has to be explicitly defined.
If you select **Assume role**: + 1. (Optional) Select an AWS authentication option. The {{< ui >}}Assume role{{< /ui >}} option should only be used if the user or role you created earlier needs to assume a different role to access the specific AWS resource and that permission has to be explicitly defined.
If you select {{< ui >}}Assume role{{< /ui >}}: 1. Enter the ARN of the IAM role you want to assume. 1. Optionally, enter the assumed role session name and external ID. diff --git a/content/en/observability_pipelines/destinations/amazon_s3.md b/content/en/observability_pipelines/destinations/amazon_s3.md index 1c75c495824..a6454811973 100644 --- a/content/en/observability_pipelines/destinations/amazon_s3.md +++ b/content/en/observability_pipelines/destinations/amazon_s3.md @@ -91,23 +91,23 @@ After you select the Amazon S3 destination in the pipeline UI: - **Notes**: - Datadog recommends that you start your prefixes with the directory name and without a lead slash (`/`). For example, `app-logs/` or `service-logs/`. - Do **not** use the same S3 prefix as a [Datadog Archives][2] destination. The Amazon S3 destination writes files in a different format and having both file types in the same prefix can result in rehydration issues. -1. Select the storage class for your S3 bucket in the **Storage Class** dropdown menu. -1. Select the encoding you want to use in the **Encoding** dropdown menu (**JSON** or **Parquet**). - - **Note**: For **Parquet**, the schema is generated per batch and can vary. See [Automatically generated Parquet schema](#automatically-generated-parquet-schema). -1. Select a compression algorithm in the **Compression - Algorithm** dropdown menu. If you selected: - - **Parquet**: Datadog recommends `snappy` or a low-compression level if you choose `zstd`. - - **JSON**: Datadog recommends `gzip`. +1. Select the storage class for your S3 bucket in the {{< ui >}}Storage Class{{< /ui >}} dropdown menu. +1. Select the encoding you want to use in the {{< ui >}}Encoding{{< /ui >}} dropdown menu ({{< ui >}}JSON{{< /ui >}} or {{< ui >}}Parquet{{< /ui >}}). + - **Note**: For {{< ui >}}Parquet{{< /ui >}}, the schema is generated per batch and can vary. See [Automatically generated Parquet schema](#automatically-generated-parquet-schema). +1. Select a compression algorithm in the {{< ui >}}Compression - Algorithm{{< /ui >}} dropdown menu. If you selected: + - {{< ui >}}Parquet{{< /ui >}}: Datadog recommends `snappy` or a low-compression level if you choose `zstd`. + - {{< ui >}}JSON{{< /ui >}}: Datadog recommends `gzip`. ### Optional settings #### Batching -1. Enter a maximum batching size and select the unit (**MB** or **GB**) in the dropdown menu. If not configured, the default is `100` MB. +1. Enter a maximum batching size and select the unit ({{< ui >}}MB{{< /ui >}} or {{< ui >}}GB{{< /ui >}}) in the dropdown menu. If not configured, the default is `100` MB. 1. Enter a batching timeout in seconds. If not configured, the default is `900` seconds. #### AWS authentication -Select an AWS authentication option. If you are only using the [user or role you created earlier](#set-up-an-iam-policy-that-allows-workers-to-write-to-the-s3-bucket) for authentication, do not select **Assume role**. Select **Assume role** only if the user or role you created earlier needs to assume a different role to access the AWS resource. The assumed role's permissions must be explicitly defined.
If you select **Assume role**: +Select an AWS authentication option. If you are only using the [user or role you created earlier](#set-up-an-iam-policy-that-allows-workers-to-write-to-the-s3-bucket) for authentication, do not select {{< ui >}}Assume role{{< /ui >}}. Select {{< ui >}}Assume role{{< /ui >}} only if the user or role you created earlier needs to assume a different role to access the AWS resource. The assumed role's permissions must be explicitly defined.
If you select {{< ui >}}Assume role{{< /ui >}}: 1. Enter the ARN of the IAM role you want to assume. - **Note:** The [user or role you created earlier](#set-up-an-iam-policy-that-allows-workers-to-write-to-the-s3-bucket) must have permission to assume this role so that the Worker can authenticate with AWS. 1. (Optional) Enter the assumed role session name and external ID. diff --git a/content/en/observability_pipelines/destinations/crowdstrike_ng_siem.md b/content/en/observability_pipelines/destinations/crowdstrike_ng_siem.md index 7bf91ee8912..3f0b62ed939 100644 --- a/content/en/observability_pipelines/destinations/crowdstrike_ng_siem.md +++ b/content/en/observability_pipelines/destinations/crowdstrike_ng_siem.md @@ -29,14 +29,14 @@ After you select the CrowdStrike NG-SIEM destination in the pipeline UI: 1. Enter the identifier for your CrowdStrike NG-SIEM endpoint URL. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the identifier for your CrowdStrike NG-SIEM token. If you leave it blank, the [default](#secret-defaults) is used. -1. Select **JSON** or **Raw** encoding in the dropdown menu. +1. Select {{< ui >}}JSON{{< /ui >}} or {{< ui >}}Raw{{< /ui >}} encoding in the dropdown menu. #### Optional settings ##### Enable compressions -1. Toggle the switch to **Enable compressions**. -1. Select an algorithm (**gzip** or **zlib**) in the dropdown menu. +1. Toggle the switch to {{< ui >}}Enable compressions{{< /ui >}}. +1. Select an algorithm ({{< ui >}}gzip{{< /ui >}} or {{< ui >}}zlib{{< /ui >}}) in the dropdown menu. ##### Enable TLS diff --git a/content/en/observability_pipelines/destinations/databricks.md b/content/en/observability_pipelines/destinations/databricks.md index b4c4b2535bb..152bb81ba94 100644 --- a/content/en/observability_pipelines/destinations/databricks.md +++ b/content/en/observability_pipelines/destinations/databricks.md @@ -70,7 +70,7 @@ In the Databricks workspace: ``` - See Databricks' [Create a Unity Catalog Managed Table][3] documentation for more information. -The fully qualified table name is `catalog.schema.table`, for example `main.obs_pipelines.apache_common_logs`. This is the value you enter for **Table Name** when you set up the Observability Pipelines Databricks destination. +The fully qualified table name is `catalog.schema.table`, for example `main.obs_pipelines.apache_common_logs`. This is the value you enter for {{< ui >}}Table Name{{< /ui >}} when you set up the Observability Pipelines Databricks destination. ### Set up a service principal @@ -105,11 +105,11 @@ After you select the Databricks (Zerobus) destination in the pipeline UI: {{% observability_pipelines/secrets_env_var_note %}} -1. Enter the **Ingestion Endpoint** for your Databricks workspace, such as `https://.zerobus..cloud.databricks.com`. The Worker sends logs to this endpoint. -1. Enter the **Table Name** in the format `catalog.schema.table`, such as `main.obs_pipelines.apache_common_logs`. -1. Enter the **Unity Catalog Endpoint** for your Databricks workspace, such as `https://.cloud.databricks.com`. The Worker uses this endpoint to read the table's schema. -1. In the **Auth - Client ID** field, enter the application ID of the service principal, such as `abcdefgh-1234-5678-abcd-ef0123456789`. -1. In the **Auth - Client Secret** field, enter the identifier for your OAuth client secret. If you leave it blank, the [default](#secret-defaults) is used. +1. Enter the {{< ui >}}Ingestion Endpoint{{< /ui >}} for your Databricks workspace, such as `https://.zerobus..cloud.databricks.com`. The Worker sends logs to this endpoint. +1. Enter the {{< ui >}}Table Name{{< /ui >}} in the format `catalog.schema.table`, such as `main.obs_pipelines.apache_common_logs`. +1. Enter the {{< ui >}}Unity Catalog Endpoint{{< /ui >}} for your Databricks workspace, such as `https://.cloud.databricks.com`. The Worker uses this endpoint to read the table's schema. +1. In the {{< ui >}}Auth - Client ID{{< /ui >}} field, enter the application ID of the service principal, such as `abcdefgh-1234-5678-abcd-ef0123456789`. +1. In the {{< ui >}}Auth - Client Secret{{< /ui >}} field, enter the identifier for your OAuth client secret. If you leave it blank, the [default](#secret-defaults) is used. ### Optional settings diff --git a/content/en/observability_pipelines/destinations/datadog_archives.md b/content/en/observability_pipelines/destinations/datadog_archives.md index 645c5e38a53..8dca2d8129d 100644 --- a/content/en/observability_pipelines/destinations/datadog_archives.md +++ b/content/en/observability_pipelines/destinations/datadog_archives.md @@ -11,7 +11,7 @@ products: ## Overview -Use the Datadog Archives destination to send logs to Amazon S3 for [archiving][1] in Datadog-rehydratable format. You can then query these logs with [Archive Search][16]. Use Archive Search's **Search & Rehydration** mode when you need to re-index results for full platform access. +Use the Datadog Archives destination to send logs to Amazon S3 for [archiving][1] in Datadog-rehydratable format. You can then query these logs with [Archive Search][16]. Use Archive Search's {{< ui >}}Search & Rehydration{{< /ui >}} mode when you need to re-index results for full platform access. **Notes**: - The Datadog Archives destination compresses logs using gzip. @@ -97,7 +97,7 @@ After you select the Datadog Archives destination in the pipeline UI: - Prefixes are useful for partitioning objects. For example, you can use a prefix as an object key to store objects under a particular directory. If using a prefix for this purpose, it must end in `/` to act as a directory path; a trailing `/` is not automatically added. - See [template syntax][8] if you want to route logs to different object keys based on specific fields in your logs. - **Note**: Datadog recommends that you start your prefixes with the directory name and without a lead slash (`/`). For example, `app-logs/` or `service-logs/`. -1. Select the storage class for your S3 bucket in the **Storage Class** dropdown menu. If you are going to archive and rehydrate your logs: +1. Select the storage class for your S3 bucket in the {{< ui >}}Storage Class{{< /ui >}} dropdown menu. If you are going to archive and rehydrate your logs: - **Note**: Rehydration only supports the following [storage classes][9]: - Standard - Intelligent-Tiering, only if [the optional asynchronous archive access tiers][10] are both disabled. @@ -110,7 +110,7 @@ After you select the Datadog Archives destination in the pipeline UI: #### AWS authentication -Select an AWS authentication option. If you are only using the [user or role you created earlier](#set-up-an-iam-policy-that-allows-workers-to-write-to-the-s3-bucket) for authentication, do not select **Assume role**. Select **Assume role** only if the user or role you created earlier needs to assume a different role to access the AWS resource. The assumed role's permissions must be explicitly defined.
If you select **Assume role**: +Select an AWS authentication option. If you are only using the [user or role you created earlier](#set-up-an-iam-policy-that-allows-workers-to-write-to-the-s3-bucket) for authentication, do not select {{< ui >}}Assume role{{< /ui >}}. Select {{< ui >}}Assume role{{< /ui >}} only if the user or role you created earlier needs to assume a different role to access the AWS resource. The assumed role's permissions must be explicitly defined.
If you select {{< ui >}}Assume role{{< /ui >}}: 1. Enter the ARN of the IAM role you want to assume. - **Note:** The [user or role you created earlier](#set-up-an-iam-policy-that-allows-workers-to-write-to-the-s3-bucket) must have permission to assume this role so that the Worker can authenticate with AWS. 1. (Optional) Enter the assumed role session name and external ID. diff --git a/content/en/observability_pipelines/destinations/datadog_logs.md b/content/en/observability_pipelines/destinations/datadog_logs.md index 8c434e6d5c8..f9d3c21cc32 100644 --- a/content/en/observability_pipelines/destinations/datadog_logs.md +++ b/content/en/observability_pipelines/destinations/datadog_logs.md @@ -29,14 +29,14 @@ You can route logs to multiple Datadog organizations. After routing has been set {{< img src="observability_pipelines/destinations/multi_dd_orgs.png" alt="The Datadog Logs destination showing us1 and us3 org" style="width:45%;" >}} -Click **Route to Multiple Organizations** to set up routing to multiple Datadog organizations. +Click {{< ui >}}Route to Multiple Organizations{{< /ui >}} to set up routing to multiple Datadog organizations. - If you haven't added any organizations yet, enter organization details as described in the [Add a Datadog organization](#add-an-organization) section. - If you have already added organizations, you can: - Click on an organization in the table to edit or delete it. - Use the search bar to find a specific organization by name, filter query, or Datadog site, and then select the organization to edit or delete it. - [View metrics](#view-metrics-for-the-component-or-specific-organizations) for an organization. - - Click **Add organization** to route to another Datadog organization. + - Click {{< ui >}}Add organization{{< /ui >}} to route to another Datadog organization. **Note**: If you don't set up routing to multiple Datadog organizations, logs are routed to the default Datadog organization, which is the organization that is tied to the API key when you install the Worker. @@ -50,7 +50,7 @@ Click **Route to Multiple Organizations** to set up routing to multiple Datadog 1. Select the Datadog organization's site. 1. Enter the identifier for the API key for that Datadog organization. - **Note**: Only enter the identifier for the API key. Do **not** enter the actual API key. -1. Click **Save**. +1. Click {{< ui >}}Save{{< /ui >}}. #### Buffering @@ -84,9 +84,9 @@ To view metrics for the overall Datadog Logs destination: 1. Navigate to [Observability Pipelines][1]. 1. Select your pipeline. -1. Click the cog on the **Datadog Logs** destination and select **View details**. +1. Click the cog on the {{< ui >}}Datadog Logs{{< /ui >}} destination and select {{< ui >}}View details{{< /ui >}}. -**Note**: The **Data dropped (intentional)** metric shows logs that didn't match any of the organizations' filters. +**Note**: The {{< ui >}}Data dropped (intentional){{< /ui >}} metric shows logs that didn't match any of the organizations' filters. ### Organization-level metrics @@ -94,12 +94,12 @@ To view metrics for a specific Datadog organization: 1. Navigate to [Observability Pipelines][1]. 1. Select your pipeline. -1. Click the **Datadog Logs** destination so the organizations show up. +1. Click the {{< ui >}}Datadog Logs{{< /ui >}} destination so the organizations show up. {{< img src="observability_pipelines/destinations/multi_dd_orgs_highlighted.png" alt="The Datadog Logs destination showing us1 and us3 org highlighted" style="width:45%;" >}} 1. Click the organization you want to see metrics for. -1. Click **View Health Metrics**. +1. Click {{< ui >}}View Health Metrics{{< /ui >}}. -Alternatively, you can click on **Review Configured Organizations** in the Datadog Logs destination, and click the graph icon in the **Metrics** column for the organization you are interested in. +Alternatively, you can click on {{< ui >}}Review Configured Organizations{{< /ui >}} in the Datadog Logs destination, and click the graph icon in the {{< ui >}}Metrics{{< /ui >}} column for the organization you are interested in. ## How the destination works diff --git a/content/en/observability_pipelines/destinations/elasticsearch.md b/content/en/observability_pipelines/destinations/elasticsearch.md index f3ed04a2349..e3fb71eeae1 100644 --- a/content/en/observability_pipelines/destinations/elasticsearch.md +++ b/content/en/observability_pipelines/destinations/elasticsearch.md @@ -34,21 +34,21 @@ After you select the Elasticsearch destination in the pipeline UI: 1. Enter the identifiers for your Elasticsearch username and password. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the identifier for your Elasticsearch endpoint URL. If you leave it blank, the [default](#secret-defaults) is used. 1. (Optional) Enter the Elasticsearch version. -1. In the **Mode** dropdown menu, select **Bulk** or **Data stream**. - - **Bulk** mode +1. In the {{< ui >}}Mode{{< /ui >}} dropdown menu, select {{< ui >}}Bulk{{< /ui >}} or {{< ui >}}Data stream{{< /ui >}}. + - {{< ui >}}Bulk{{< /ui >}} mode - Uses Elasticsearch's [Bulk API][5] to send batched events directly into a standard index. - Choose this mode when you want direct control over index naming and lifecycle management. Data is appended to the index you specify, and you are responsible for handling rollovers, deletions, and mappings. - - To configure **Bulk** mode: - - (Optional) In the **Index** field, enter the name of the Elasticsearch index. You can use [template syntax][3] to dynamically route data to different indexes based on specific fields in your logs, for example `logs-{{service}}` or `metrics-{{service}}`. - - **Data streams** mode + - To configure {{< ui >}}Bulk{{< /ui >}} mode: + - (Optional) In the {{< ui >}}Index{{< /ui >}} field, enter the name of the Elasticsearch index. You can use [template syntax][3] to dynamically route data to different indexes based on specific fields in your logs, for example `logs-{{service}}` or `metrics-{{service}}`. + - {{< ui >}}Data streams{{< /ui >}} mode - Uses [Elasticsearch Data Streams][4] for data storage. Data streams automatically manage backing indexes and rollovers, making them ideal for time series log data. - Choose this mode when you want Elasticsearch to manage the index lifecycle for you. Data streams ensure smooth rollovers, Index Lifecycle Management (ILM) compatibility, and optimized handling of time-based data. - - To configure **Data streams** mode, optionally specify the data stream name and configure routing and syncing settings. - 1. In the **Type** field, enter the category of data being ingested, for example `logs` or `metrics`. - 1. In the **Dataset** field, specify the format or data source that describes the structure, for example `apache`. - 1. In the **Namespace** field, enter the grouping for organizing your data streams, for example `production`. - 1. Enable the **Auto routing** toggle to automatically route events to a data stream based on the event content. - 1. Enable the **Sync fields** toggle to synchronize data stream fields with the Elasticsearch index mapping. + - To configure {{< ui >}}Data streams{{< /ui >}} mode, optionally specify the data stream name and configure routing and syncing settings. + 1. In the {{< ui >}}Type{{< /ui >}} field, enter the category of data being ingested, for example `logs` or `metrics`. + 1. In the {{< ui >}}Dataset{{< /ui >}} field, specify the format or data source that describes the structure, for example `apache`. + 1. In the {{< ui >}}Namespace{{< /ui >}} field, enter the grouping for organizing your data streams, for example `production`. + 1. Enable the {{< ui >}}Auto routing{{< /ui >}} toggle to automatically route events to a data stream based on the event content. + 1. Enable the {{< ui >}}Sync fields{{< /ui >}} toggle to synchronize data stream fields with the Elasticsearch index mapping. - In the UI, there is a preview of the data stream name you configured. If the fields are left blank, the default data stream name used is `logs-generic-default` for logs and `metrics-generic-default` for metrics. With the above example inputs, the data stream name that the Worker writes to is: - `logs-apache-production` for logs - `metrics-apache-production` for metrics @@ -57,7 +57,7 @@ After you select the Elasticsearch destination in the pipeline UI: ##### Enable TLS -Toggle the switch to **Enable TLS**. +Toggle the switch to {{< ui >}}Enable TLS{{< /ui >}}. - If you are using Secrets Management, enter the identifier for the key pass. See [Secret defaults](#secret-defaults) for the default used if the field is left blank. - The following certificate and key files are required for TLS: - `Server Certificate Path`: The path to the certificate file that has been signed by your Certificate Authority (CA) root file in DER, PEM, or CRT (X.509). @@ -71,7 +71,7 @@ Toggle the switch to **Enable TLS**. You might want to use compression if you are sending a high volume of events to your Elasticsearch clusters. -Toggle the switch to enable **Compression**. Select a compression algorithm (**gzip**, **snappy**, **zlib**, **zstd**) in the dropdown menu. The default is no compression. +Toggle the switch to enable {{< ui >}}Compression{{< /ui >}}. Select a compression algorithm (`gzip`, `snappy`, `zlib`, `zstd`) in the dropdown menu. The default is no compression. ##### Buffering @@ -79,9 +79,9 @@ Toggle the switch to enable **Compression**. Select a compression algorithm (**g ##### Advanced options -1. In the **ID Key** field, enter the name of the field used as the document ID in Elasticsearch. -1. In the **Pipeline** field, enter the name of an Elasticsearch ingest pipeline to apply to events before indexing. -1. Enable the **Retry partial failures** toggle to retry a failed bulk request when some events in a batch fail while others succeed. +1. In the {{< ui >}}ID Key{{< /ui >}} field, enter the name of the field used as the document ID in Elasticsearch. +1. In the {{< ui >}}Pipeline{{< /ui >}} field, enter the name of an Elasticsearch ingest pipeline to apply to events before indexing. +1. Enable the {{< ui >}}Retry partial failures{{< /ui >}} toggle to retry a failed bulk request when some events in a batch fail while others succeed. ## Secret defaults diff --git a/content/en/observability_pipelines/destinations/google_cloud_storage.md b/content/en/observability_pipelines/destinations/google_cloud_storage.md index f847dd9c0fc..1bcd9306f8a 100644 --- a/content/en/observability_pipelines/destinations/google_cloud_storage.md +++ b/content/en/observability_pipelines/destinations/google_cloud_storage.md @@ -52,7 +52,7 @@ Enter a prefix that you want to apply to all key objects. #### Metadata -1. Click **Add Header** to add metadata. +1. Click {{< ui >}}Add Header{{< /ui >}} to add metadata. 1. Enter values for the header name and value. #### Buffering diff --git a/content/en/observability_pipelines/destinations/google_pubsub.md b/content/en/observability_pipelines/destinations/google_pubsub.md index 947800b2248..f595039703a 100644 --- a/content/en/observability_pipelines/destinations/google_pubsub.md +++ b/content/en/observability_pipelines/destinations/google_pubsub.md @@ -77,7 +77,7 @@ Use this authentication method if you're deploying the Worker as a Cloud Run ser 1. Choose the JSON format. 1. Save the downloaded JSON file in a secure location. 1. After you install the Worker, copy or mount JSON the file into `DD_OP_DATA_DIR/config/`. -You reference this file in the Google Pub/Sub destination's **Credentials path** field when you [set up the destination](#set-up-the-destination) in the Pipelines UI. +You reference this file in the Google Pub/Sub destination's {{< ui >}}Credentials path{{< /ui >}} field when you [set up the destination](#set-up-the-destination) in the Pipelines UI. ## Setup @@ -89,9 +89,9 @@ After you select the Google Pub/Sub destination in the pipeline UI: - This is the GCP project where your Pub/Sub topic lives. 1. Enter the topic. - This is the Pub/Sub topic to publish logs to. -1. In the **Encoding** dropdown menu, select whether you want to encode your pipeline's output in **JSON** or **Raw message**. - - **JSON**: Logs are structured as JSON (recommended if downstream tools need structured data). - - **Raw**: Logs are sent as raw strings (preserves the original format). +1. In the {{< ui >}}Encoding{{< /ui >}} dropdown menu, select whether you want to encode your pipeline's output in {{< ui >}}JSON{{< /ui >}} or {{< ui >}}Raw message{{< /ui >}}. + - {{< ui >}}JSON{{< /ui >}}: Logs are structured as JSON (recommended if downstream tools need structured data). + - {{< ui >}}Raw{{< /ui >}}: Logs are sent as raw strings (preserves the original format). 1. If you have a credentials JSON file, enter the path to your credentials JSON file. - If you using a service account JSON: enter the path `DD_OP_DATA_DIR/config/.json`. - Or set the `GOOGLE_APPLICATION_CREDENTIALS` environment variable. diff --git a/content/en/observability_pipelines/destinations/google_secops.md b/content/en/observability_pipelines/destinations/google_secops.md index 85b358022c0..fc62ea45f98 100644 --- a/content/en/observability_pipelines/destinations/google_secops.md +++ b/content/en/observability_pipelines/destinations/google_secops.md @@ -30,7 +30,7 @@ After you select the Google SecOps destination in the pipeline UI: 1. If you have a credentials JSON file, enter the path to your credentials JSON file. The credentials file must be placed under `DD_OP_DATA_DIR/config`. Alternatively, you can use the `GOOGLE_APPLICATION_CREDENTIALS` environment variable to provide the credential path. - If you're using [workload identity][6] on Google Kubernetes Engine (GKE), the `GOOGLE_APPLICATION_CREDENTIALS` is provided for you. - The Worker uses standard [Google authentication methods][7]. -1. Select **JSON** or **Raw** encoding in the dropdown menu. +1. Select {{< ui >}}JSON{{< /ui >}} or {{< ui >}}Raw{{< /ui >}} encoding in the dropdown menu. 1. Enter the log type. See [template syntax][4] if you want to route logs to different log types based on specific fields in your logs. ### Optional buffering diff --git a/content/en/observability_pipelines/destinations/http_client.md b/content/en/observability_pipelines/destinations/http_client.md index 15a9f1a06e0..270512fbad5 100644 --- a/content/en/observability_pipelines/destinations/http_client.md +++ b/content/en/observability_pipelines/destinations/http_client.md @@ -27,11 +27,11 @@ Configure the HTTP Client destination when you [set up a pipeline][3]. You can s After you select the HTTP Client destination in the pipeline UI: 1. Enter the identifier for your HTTP Client URI. If you leave it blank, the [default](#secret-defaults) is used. -1. Select your authorization strategy (**None**, **Basic**, or **Bearer**). If you selected: - - **Basic**: +1. Select your authorization strategy ({{< ui >}}None{{< /ui >}}, {{< ui >}}Basic{{< /ui >}}, or {{< ui >}}Bearer{{< /ui >}}). If you selected: + - {{< ui >}}Basic{{< /ui >}}: - Enter the identifier for your HTTP Client username. If you leave it blank, the [default](#secret-defaults) is used. - Enter the identifier for your HTTP Client password. If you leave it blank, the [default](#secret-defaults) is used. - - **Bearer**: + - {{< ui >}}Bearer{{< /ui >}}: - Enter the identifier for your HTTP Client token. If you leave it blank, the [default](#secret-defaults) is used. 1. JSON is the only available encoder. @@ -39,7 +39,7 @@ After you select the HTTP Client destination in the pipeline UI: #### Enable compression -Toggle the switch to **Enable Compression**. If enabled: +Toggle the switch to {{< ui >}}Enable Compression{{< /ui >}}. If enabled: 1. GZIP is the only available compression algorithm. 1. Select the compression level you want to use. diff --git a/content/en/observability_pipelines/destinations/kafka.md b/content/en/observability_pipelines/destinations/kafka.md index 1e12b900171..128d5140f84 100644 --- a/content/en/observability_pipelines/destinations/kafka.md +++ b/content/en/observability_pipelines/destinations/kafka.md @@ -37,7 +37,7 @@ After you select the Kafka destination in the pipeline UI: 1. Enter the identifier for your Kafka bootstrap servers. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the name of the topic you want to send logs to. -1. In the **Encoding** dropdown menu, select either `JSON` or `Raw message` as the output format. +1. In the {{< ui >}}Encoding{{< /ui >}} dropdown menu, select either {{< ui >}}JSON{{< /ui >}} or {{< ui >}}Raw message{{< /ui >}} as the output format. {{< img src="observability_pipelines/destinations/kafka_settings.png" alt="The Kafka destination with sample values" style="width:30%;" >}} @@ -49,15 +49,15 @@ After you select the Kafka destination in the pipeline UI: ##### Enable SASL authentication -1. Toggle the switch to enable **SASL Authentication**. +1. Toggle the switch to enable {{< ui >}}SASL Authentication{{< /ui >}}. 1. Enter the identifiers for your Kafka SASL username and password. If you leave them blank, the [defaults](#secret-defaults) are used. -1. Select the mechanism (**PLAIN**, **SCHRAM-SHA-256**, or **SCHRAM-SHA-512**) in the dropdown menu. +1. Select the mechanism ({{< ui >}}PLAIN{{< /ui >}}, {{< ui >}}SCHRAM-SHA-256{{< /ui >}}, or {{< ui >}}SCHRAM-SHA-512{{< /ui >}}) in the dropdown menu. ##### Enable compression -1. Toggle switch to **Enable Compression**. -1. In the **Compression Algorithm** dropdown menu, select a compression algorithm (**gzip**, **zstd**, **lz4**, or **snappy**). -1. (Optional) Select a **Compression Level** in the dropdown menu. If the level is not specified, the algorithm's default level is used. +1. Toggle switch to {{< ui >}}Enable Compression{{< /ui >}}. +1. In the {{< ui >}}Compression Algorithm{{< /ui >}} dropdown menu, select a compression algorithm ({{< ui >}}gzip{{< /ui >}}, {{< ui >}}zstd{{< /ui >}}, {{< ui >}}lz4{{< /ui >}}, or {{< ui >}}snappy{{< /ui >}}). +1. (Optional) Select a {{< ui >}}Compression Level{{< /ui >}} in the dropdown menu. If the level is not specified, the algorithm's default level is used. ##### Buffering @@ -65,20 +65,20 @@ After you select the Kafka destination in the pipeline UI: ##### Advanced options -Click **Advanced** if you want to set any of the following fields: +Click {{< ui >}}Advanced{{< /ui >}} if you want to set any of the following fields: -1. **Message Key Field**: Specify which log field contains the message key for partitioning, grouping, and ordering. -1. **Headers Key**: Specify which log field contains your Kafka headers. If left blank, no headers are written. -1. **Message Timeout (ms)**: Local message timeout, in milliseconds. Default is `300,000 ms`. -1. **Socket Timeout (ms)**: Default timeout, in milliseconds, for network requests. Default is `60,000 ms`. -1. **Rate Limit Events**: The maximum number of requests the Kafka client can send within the rate limit time window. Default is no rate limit. -1. **Rate Limit Time Window (secs)**: The time window used for the rate limit option. +1. {{< ui >}}Message Key Field{{< /ui >}}: Specify which log field contains the message key for partitioning, grouping, and ordering. +1. {{< ui >}}Headers Key{{< /ui >}}: Specify which log field contains your Kafka headers. If left blank, no headers are written. +1. {{< ui >}}Message Timeout (ms){{< /ui >}}: Local message timeout, in milliseconds. Default is `300,000 ms`. +1. {{< ui >}}Socket Timeout (ms){{< /ui >}}: Default timeout, in milliseconds, for network requests. Default is `60,000 ms`. +1. {{< ui >}}Rate Limit Events{{< /ui >}}: The maximum number of requests the Kafka client can send within the rate limit time window. Default is no rate limit. +1. {{< ui >}}Rate Limit Time Window (secs){{< /ui >}}: The time window used for the rate limit option. - This setting has no effect if the rate limit for events is not set. - - Default is `1 second` if **Rate Limit Events** is set, but **Rate Limit Time Window** is not set. -1. To add additional [librdkafka options](#librdkafka-options), click **Add Option** and select an option in the dropdown menu. + - Default is `1 second` if {{< ui >}}Rate Limit Events{{< /ui >}} is set, but {{< ui >}}Rate Limit Time Window{{< /ui >}} is not set. +1. To add additional [librdkafka options](#librdkafka-options), click {{< ui >}}Add Option{{< /ui >}} and select an option in the dropdown menu. 1. Enter a value for that option. 1. Check your values against the [librdkafka documentation][7] to make sure they have the correct type and are within the set range. - 1. Click **Add Option** to add another librdkafka option. + 1. Click {{< ui >}}Add Option{{< /ui >}} to add another librdkafka option. ## Secret defaults diff --git a/content/en/observability_pipelines/destinations/new_relic.md b/content/en/observability_pipelines/destinations/new_relic.md index a27041ecf2e..c1a6f828b10 100644 --- a/content/en/observability_pipelines/destinations/new_relic.md +++ b/content/en/observability_pipelines/destinations/new_relic.md @@ -25,7 +25,7 @@ After you select the New Relic destination in the pipeline UI: 1. Enter the identifier for your account ID. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the identifier for your license. If you leave it blank, the [default](#secret-defaults) is used. -1. Select the data center region (**US** or **EU**) of your New Relic account. +1. Select the data center region ({{< ui >}}US{{< /ui >}} or {{< ui >}}EU{{< /ui >}}) of your New Relic account. ### Optional buffering diff --git a/content/en/observability_pipelines/destinations/opensearch.md b/content/en/observability_pipelines/destinations/opensearch.md index 69f0ef4d442..de58767dd89 100644 --- a/content/en/observability_pipelines/destinations/opensearch.md +++ b/content/en/observability_pipelines/destinations/opensearch.md @@ -26,19 +26,19 @@ After you select the OpenSearch destination in the pipeline UI: 1. Enter the identifier for your OpenSearch endpoint URL. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the identifier for your OpenSearch username. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the identifier for your OpenSearch password. If you leave it blank, the [default](#secret-defaults) is used. -1. In the **Mode** dropdown menu, select **Bulk** or **Data streams**. - - **Bulk** mode +1. In the {{< ui >}}Mode{{< /ui >}} dropdown menu, select {{< ui >}}Bulk{{< /ui >}} or {{< ui >}}Data streams{{< /ui >}}. + - {{< ui >}}Bulk{{< /ui >}} mode - Uses OpenSearch's [Bulk API][4] to send batched events directly into a standard index. - Choose this mode when you want direct control over index naming and lifecycle management. Data is appended to the index you specify, and you are responsible for handling rollovers, deletions, and mappings. - - To configure **Bulk** mode: - - In the **Index** field, optionally enter the name of the OpenSearch index. You can use [template syntax][3] to dynamically route logs to different indexes based on specific fields in your logs, for example `logs-{{service}}`. - - **Data streams** mode + - To configure {{< ui >}}Bulk{{< /ui >}} mode: + - In the {{< ui >}}Index{{< /ui >}} field, optionally enter the name of the OpenSearch index. You can use [template syntax][3] to dynamically route logs to different indexes based on specific fields in your logs, for example `logs-{{service}}`. + - {{< ui >}}Data streams{{< /ui >}} mode - Uses [OpenSearch Data Streams][5] for log storage. Data streams automatically manage backing indexes and rollovers, making them ideal for timeseries log data. - Choose this mode when you want OpenSearch to manage the index lifecycle for you. Data streams ensures smooth rollovers, Index Lifecycle Management (ILM) compatibility, and optimized handling of time-based data. - - To configure **Data streams** mode, optionally define the data stream name (default is `logs-generic-default`) by entering the following information: - - In the **Type** field, enter the category of data being ingested, for example `logs`. - - In the **Dataset** field, specify the format or data source that describes the structure, for example `apache`. - - In the **Namespace** field, enter the grouping for organizing your data streams, for example `production`. + - To configure {{< ui >}}Data streams{{< /ui >}} mode, optionally define the data stream name (default is `logs-generic-default`) by entering the following information: + - In the {{< ui >}}Type{{< /ui >}} field, enter the category of data being ingested, for example `logs`. + - In the {{< ui >}}Dataset{{< /ui >}} field, specify the format or data source that describes the structure, for example `apache`. + - In the {{< ui >}}Namespace{{< /ui >}} field, enter the grouping for organizing your data streams, for example `production`. - In the UI, there is a preview of the data stream name you configured. With the above example inputs, the data stream name that the Worker writes to is `logs-apache-production`. ### Optional settings diff --git a/content/en/observability_pipelines/destinations/sentinelone.md b/content/en/observability_pipelines/destinations/sentinelone.md index 0669e73e3fe..8f6fa412b67 100644 --- a/content/en/observability_pipelines/destinations/sentinelone.md +++ b/content/en/observability_pipelines/destinations/sentinelone.md @@ -58,8 +58,8 @@ After you select the SentinelOne destination in the pipeline UI: After you've set up the pipeline to send logs to the SentinelOne destination, you can view the logs in a SentinelOne cluster: 1. Log into the [S1 console][2]. -2. Navigate to the Singularity Data Lake (SDL) "Search" page. To access it from the console, click on "Visibility" on the left menu to go to SDL, and make sure you're on the "Search" tab. -3. Make sure the filter next to the search bar is set to **All Data**. +2. Navigate to the Singularity Data Lake (SDL) {{< ui >}}Search{{< /ui >}} page. To access it from the console, click on {{< ui >}}Visibility{{< /ui >}} on the left menu to go to SDL, and make sure you're on the {{< ui >}}Search{{< /ui >}} tab. +3. Make sure the filter next to the search bar is set to {{< ui >}}All Data{{< /ui >}}. 4. This page shows the logs you sent from Observability Pipelines to SentinelOne. ## How the destination works diff --git a/content/en/observability_pipelines/destinations/socket.md b/content/en/observability_pipelines/destinations/socket.md index 9fd5273a30d..95ef1c41b75 100644 --- a/content/en/observability_pipelines/destinations/socket.md +++ b/content/en/observability_pipelines/destinations/socket.md @@ -24,8 +24,8 @@ After you select the Socket destination in the pipeline UI: {{% observability_pipelines/secrets_env_var_note %}} 1. Enter the identifier for your address. If you leave it blank, the [default](#secret-defaults) is used. -1. In the **Mode** dropdown menu, select the socket type to use. -1. In the **Encoding** dropdown menu, select either `JSON` or `Raw message` as the output format. +1. In the {{< ui >}}Mode{{< /ui >}} dropdown menu, select the socket type to use. +1. In the {{< ui >}}Encoding{{< /ui >}} dropdown menu, select either {{< ui >}}JSON{{< /ui >}} or {{< ui >}}Raw message{{< /ui >}} as the output format. ### Optional settings diff --git a/content/en/observability_pipelines/destinations/splunk_hec.md b/content/en/observability_pipelines/destinations/splunk_hec.md index 9c75e8a6bd6..45d22cb078b 100644 --- a/content/en/observability_pipelines/destinations/splunk_hec.md +++ b/content/en/observability_pipelines/destinations/splunk_hec.md @@ -25,9 +25,9 @@ Configure the Splunk HEC destination when you [set up a pipeline][5]. You can se After you select the Splunk HEC destination in the pipeline UI: -1. For the **Token strategy** dropdown menu: - - Only select **From Source** if you are using a [Splunk HEC source][8] and have enabled **Store HEC token** on the source. Otherwise, an error occurs and you cannot proceed to install the Worker. This option forwards the token received by Observability Pipelines onto the Splunk HEC destination. - - If you use the default **Custom** token strategy, enter the identifier for your token. If you leave it blank, the [default](#secret-defaults) is used. +1. For the {{< ui >}}Token strategy{{< /ui >}} dropdown menu: + - Only select {{< ui >}}From Source{{< /ui >}} if you are using a [Splunk HEC source][8] and have enabled {{< ui >}}Store HEC token{{< /ui >}} on the source. Otherwise, an error occurs and you cannot proceed to install the Worker. This option forwards the token received by Observability Pipelines onto the Splunk HEC destination. + - If you use the default {{< ui >}}Custom{{< /ui >}} token strategy, enter the identifier for your token. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the identifier for your endpoint URL. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the identifier for your token. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the identifier for your endpoint URL. If you leave it blank, the [default](#secret-defaults) is used. @@ -48,8 +48,8 @@ Set the `sourcetype` to override Splunk's default value, which is `httpevent` fo #### Encoding -Select the **Encoding** in the dropdown menu (**JSON** or **Raw**). -- If you selected **JSON**, optionally click **Add Field** to add keys of fields you want extracted as [indexed fields][4]. This indexes the specified fields when the Splunk HTTP Event Collector ingests the logs. +Select the {{< ui >}}Encoding{{< /ui >}} in the dropdown menu ({{< ui >}}JSON{{< /ui >}} or {{< ui >}}Raw{{< /ui >}}). +- If you selected {{< ui >}}JSON{{< /ui >}}, optionally click {{< ui >}}Add Field{{< /ui >}} to add keys of fields you want extracted as [indexed fields][4]. This indexes the specified fields when the Splunk HTTP Event Collector ingests the logs. #### Buffering diff --git a/content/en/observability_pipelines/destinations/sumo_logic_hosted_collector.md b/content/en/observability_pipelines/destinations/sumo_logic_hosted_collector.md index 28db7ce5bb8..bcaed8a993c 100644 --- a/content/en/observability_pipelines/destinations/sumo_logic_hosted_collector.md +++ b/content/en/observability_pipelines/destinations/sumo_logic_hosted_collector.md @@ -25,11 +25,11 @@ After you select the Sumo Logic destination in the pipeline UI, enter the identi ### Optional settings -1. In the **Encoding** dropdown menu, select whether you want to encode your pipeline's output in `JSON`, `Logfmt`, or `Raw` text. If no decoding is selected, the decoding defaults to JSON. -1. Enter a **source name** to override the default `name` value configured for your Sumo Logic collector's source. -1. Enter a **host name** to override the default `host` value configured for your Sumo Logic collector's source. -1. Enter a **category name** to override the default `category` value configured for your Sumo Logic collector's source. -1. Click **Add Header** to add any custom header fields and values. +1. In the {{< ui >}}Encoding{{< /ui >}} dropdown menu, select whether you want to encode your pipeline's output in `JSON`, `Logfmt`, or `Raw` text. If no decoding is selected, the decoding defaults to JSON. +1. Enter a {{< ui >}}source name{{< /ui >}} to override the default `name` value configured for your Sumo Logic collector's source. +1. Enter a {{< ui >}}host name{{< /ui >}} to override the default `host` value configured for your Sumo Logic collector's source. +1. Enter a {{< ui >}}category name{{< /ui >}} to override the default `category` value configured for your Sumo Logic collector's source. +1. Click {{< ui >}}Add Header{{< /ui >}} to add any custom header fields and values. #### Buffering options diff --git a/content/en/observability_pipelines/guide/get_started_with_the_custom_processor.md b/content/en/observability_pipelines/guide/get_started_with_the_custom_processor.md index d917298b10f..d78a58bf250 100644 --- a/content/en/observability_pipelines/guide/get_started_with_the_custom_processor.md +++ b/content/en/observability_pipelines/guide/get_started_with_the_custom_processor.md @@ -539,7 +539,7 @@ This results in the log with flattened attributes that you can filter directly: } ``` -**Note**: If you flatten the message field, the resulting log no longer has a message object. This means if the log is sent to Datadog, when you view the log in Log Explorer, you will not see a **Log Message** section in the log side panel. +**Note**: If you flatten the message field, the resulting log no longer has a message object. This means if the log is sent to Datadog, when you view the log in Log Explorer, you will not see a {{< ui >}}Log Message{{< /ui >}} section in the log side panel. ## Serialize outbound logs in _raw format @@ -547,7 +547,7 @@ Splunk and CrowdStrike prefer a format called `_raw` for log ingestion. Sending **Notes**: - You should add other processing, remapping, and parsing steps before serializing your logs in `_raw` format. -- To ensure your logs are correctly routed after serialization, configure your preferred destination with **Raw** as the encoding type. +- To ensure your logs are correctly routed after serialization, configure your preferred destination with {{< ui >}}Raw{{< /ui >}} as the encoding type. An example input log: diff --git a/content/en/observability_pipelines/guide/remap_reserved_attributes.md b/content/en/observability_pipelines/guide/remap_reserved_attributes.md index 007e09b7326..0b77392c89f 100644 --- a/content/en/observability_pipelines/guide/remap_reserved_attributes.md +++ b/content/en/observability_pipelines/guide/remap_reserved_attributes.md @@ -31,23 +31,23 @@ To change or override the value of an existing reserved attribute field, Datadog ### Use an Edit Fields processor for basic field assignments -1. Use a **Remove field** processor to drop the reserved attribute from the log. -2. Use an **Add field** processor to add the reserved attribute back to the log with your correct field name and value assignment. +1. Use a {{< ui >}}Remove field{{< /ui >}} processor to drop the reserved attribute from the log. +2. Use an {{< ui >}}Add field{{< /ui >}} processor to add the reserved attribute back to the log with your correct field name and value assignment. -**Note**: In terms of the processor order, the **Add Field** processor should go immediately after the **Remove Field** processor to ensure correct field remapping. +**Note**: In terms of the processor order, the {{< ui >}}Add Field{{< /ui >}} processor should go immediately after the {{< ui >}}Remove Field{{< /ui >}} processor to ensure correct field remapping. #### Example -The **Remove field** processor image below removes the improperly named `service` field from the log. +The {{< ui >}}Remove field{{< /ui >}} processor image below removes the improperly named `service` field from the log. {{< img src="observability_pipelines/guide/remap_attributes/remove_field_remap.png" alt="A remove field processor that drops the service tag and an add field processor that adds the service field with the value payment-app" style="width:50%;" >}} -The **Add field** processor image below re-adds the `service` field back with the correct value. +The {{< ui >}}Add field{{< /ui >}} processor image below re-adds the `service` field back with the correct value. {{< img src="observability_pipelines/guide/remap_attributes/add_field_remap.png" alt="A remove field processor that drops the service tag and an add field processor that adds the service field with the value payment-app" style="width:50%;" >}} ### Use the Custom Processor for dynamic or manual assignments -Use the **Custom Processor** to rewrite the reserved attribute's value. +Use the {{< ui >}}Custom Processor{{< /ui >}} to rewrite the reserved attribute's value. #### Dynamically assign the value using template syntax to reference another field's value. @@ -149,19 +149,19 @@ Assume these are the correct values you want for the log sent to Datadog: Do the following to remap the `source` and `service` attributes to the correct values: -1. Use a **Remove field** processor to drop the `source` field`. - - Enter `source` in the **Field to drop** field. +1. Use a {{< ui >}}Remove field{{< /ui >}} processor to drop the `source` field`. + - Enter `source` in the {{< ui >}}Field to drop{{< /ui >}} field. {{< img src="observability_pipelines/guide/remap_attributes/remove_field_source.png" alt="A remove field processor that removes the source field" style="width:50%;" >}} -1. Use an **Add field** processor to add the `ddsource` field with the value `akamai`. - - Enter `ddsource` in the **Field to add** field. - - Enter `akamai` in the **Value to add** field. +1. Use an {{< ui >}}Add field{{< /ui >}} processor to add the `ddsource` field with the value `akamai`. + - Enter `ddsource` in the {{< ui >}}Field to add{{< /ui >}} field. + - Enter `akamai` in the {{< ui >}}Value to add{{< /ui >}} field. {{< img src="observability_pipelines/guide/remap_attributes/add_field_ddsource.png" alt="An add field processor that adds the ddsource field" style="width:50%;" >}} -1. Use a **Remove field** processor to drop the `service` field. - - Enter `service` in the **Field to drop** field. +1. Use a {{< ui >}}Remove field{{< /ui >}} processor to drop the `service` field. + - Enter `service` in the {{< ui >}}Field to drop{{< /ui >}} field. {{< img src="observability_pipelines/guide/remap_attributes/remove_field_service.png" alt="A remove field processor that removes the service field" style="width:50%;" >}} -1. Use an **Add field** processor to add the `source` field with the value `cdn-logs`. - - Enter `source` in the **Field to add** field. - - Enter `cdn-logs` in the **Value to add** field. +1. Use an {{< ui >}}Add field{{< /ui >}} processor to add the `source` field with the value `cdn-logs`. + - Enter `source` in the {{< ui >}}Field to add{{< /ui >}} field. + - Enter `cdn-logs` in the {{< ui >}}Value to add{{< /ui >}} field. {{< img src="observability_pipelines/guide/remap_attributes/add_field_source.png" alt="An add field processor that adds the ddsource field" style="width:50%;" >}} diff --git a/content/en/observability_pipelines/guide/upgrade_your_filter_queries_to_the_new_search_syntax.md b/content/en/observability_pipelines/guide/upgrade_your_filter_queries_to_the_new_search_syntax.md index 52cba98b1be..9e33e962e1f 100644 --- a/content/en/observability_pipelines/guide/upgrade_your_filter_queries_to_the_new_search_syntax.md +++ b/content/en/observability_pipelines/guide/upgrade_your_filter_queries_to_the_new_search_syntax.md @@ -30,9 +30,9 @@ If you created your pipeline in the UI: 1. [Upgrade to Observability Pipelines Worker][1] version 2.11. 1. Navigate to the [Pipeline page][2] for that pipeline and update your filter queries to the new syntax. See the [What's new in the updated search syntax](#whats-new-in-the-updated-search-syntax) section for more information. -1. On the pipeline editor page, by default **Legacy Search Syntax** is enabled because your pipeline is running the search syntax of Worker 2.10 or older. +1. On the pipeline editor page, by default {{< ui >}}Legacy Search Syntax{{< /ui >}} is enabled because your pipeline is running the search syntax of Worker 2.10 or older. {{< img src="observability_pipelines/guide/legacy_search_syntax_toggle.png" alt="The pipelines editor showing the legacy search toggle enabled" style="width:85%;" >}} -1. After you've updated all queries in that pipeline, toggle the switch to **New Search Syntax** and deploy your pipeline. +1. After you've updated all queries in that pipeline, toggle the switch to {{< ui >}}New Search Syntax{{< /ui >}} and deploy your pipeline. ### Created the pipeline using the API or Terraform diff --git a/content/en/observability_pipelines/monitoring_and_troubleshooting/monitoring_pipelines.md b/content/en/observability_pipelines/monitoring_and_troubleshooting/monitoring_pipelines.md index f5619824747..b94fe020c4f 100644 --- a/content/en/observability_pipelines/monitoring_and_troubleshooting/monitoring_pipelines.md +++ b/content/en/observability_pipelines/monitoring_and_troubleshooting/monitoring_pipelines.md @@ -28,9 +28,9 @@ A pipeline consists of components that collect, process, and route your observab ## View the status of your pipelines -1. Navigate to [Observability Pipelines][1] to see how many events or bytes your pipelines are receiving and sending out. The **events/s** and **bytes/s** metrics shown on this page are based on an average over 15 minutes. +1. Navigate to [Observability Pipelines][1] to see how many events or bytes your pipelines are receiving and sending out. The {{< ui >}}events/s{{< /ui >}} and {{< ui >}}bytes/s{{< /ui >}} metrics shown on this page are based on an average over 15 minutes. 1. Select a pipeline. -1. Click the **Health** tab to see details about the pipeline and its components. You can view graphs of: +1. Click the {{< ui >}}Health{{< /ui >}} tab to see details about the pipeline and its components. You can view graphs of: - How much each component is being used, and the total number of events that the component receives and sends out. - The number of requests made to destinations, and the number of errors encountered by those requests. - How many events are intentionally and unintentionally discarded. @@ -44,7 +44,7 @@ To view graphs of resource usage and data sent through Observability Pipelines W 1. Navigate to [Observability Pipelines][1]. 1. Select a pipeline. -1. Click the **Workers** tab to see the Workers' memory and CPU utilization, traffic stats, and any errors. +1. Click the {{< ui >}}Workers{{< /ui >}} tab to see the Workers' memory and CPU utilization, traffic stats, and any errors. ## View the status of your pipeline components @@ -52,7 +52,7 @@ To view metrics for a source, process, or destination: 1. Navigate to [Observability Pipelines][1]. 1. Select a pipeline. -1. Click the cog next to the source's, processor's, or destination's name, then select **View details**. Datadog displays health graphs for the component you selected. +1. Click the cog next to the source's, processor's, or destination's name, then select {{< ui >}}View details{{< /ui >}}. Datadog displays health graphs for the component you selected. 1. If you want to export a graph to an [incident][2], [dashboard][3], or [notebook][4], click the export icon on the graph. The exported graph shows that the metric is grouped by the specific pipeline and component tags. ## Out-of-the-box monitors @@ -60,8 +60,8 @@ To view metrics for a source, process, or destination: To see available out-of-the-box monitors: 1. Navigate to [Observability Pipelines][1]. -1. Click **Enable monitors** in the **Monitors** column for your pipeline. -1. Click **Start** to set up a monitor for one of the suggested use cases.
+1. Click {{< ui >}}Enable monitors{{< /ui >}} in the {{< ui >}}Monitors{{< /ui >}} column for your pipeline. +1. Click {{< ui >}}Start{{< /ui >}} to set up a monitor for one of the suggested use cases.
The new metric monitor page is configured based on the use case you selected. You can update the configuration to further customize it. See the [Metric monitor documentation][3] for more information. ## Further reading diff --git a/content/en/observability_pipelines/monitoring_and_troubleshooting/troubleshooting.md b/content/en/observability_pipelines/monitoring_and_troubleshooting/troubleshooting.md index a30dc2292c8..3766adce462 100644 --- a/content/en/observability_pipelines/monitoring_and_troubleshooting/troubleshooting.md +++ b/content/en/observability_pipelines/monitoring_and_troubleshooting/troubleshooting.md @@ -13,9 +13,9 @@ To view information about the Observability Pipelines Workers running for an act 1. Navigate to [Observability Pipelines][2]. 1. Select your pipeline. -1. Click the **Workers** tab to see the Workers' memory and CPU utilization, traffic stats, and any errors. -1. To view the Workers' statuses and versions, click the **Latest Deployment & Setup** tab. -1. To see the Workers' logs, click the cog at the top right side of the page, then select **View OPW Logs**. See [Logs Search Syntax][3] for details on how to filter your logs. To see logs for a specific Worker, add `@op_worker.id:` to the search query.
**Note**: If you are not seeing Observability Pipelines Worker logs, make sure you are [indexing Worker logs][10] to Log Management. +1. Click the {{< ui >}}Workers{{< /ui >}} tab to see the Workers' memory and CPU utilization, traffic stats, and any errors. +1. To view the Workers' statuses and versions, click the {{< ui >}}Latest Deployment & Setup{{< /ui >}} tab. +1. To see the Workers' logs, click the cog at the top right side of the page, then select {{< ui >}}View OPW Logs{{< /ui >}}. See [Logs Search Syntax][3] for details on how to filter your logs. To see logs for a specific Worker, add `@op_worker.id:` to the search query.
**Note**: If you are not seeing Observability Pipelines Worker logs, make sure you are [indexing Worker logs][10] to Log Management. ## Inspect events sent through your pipeline to identify setup issues diff --git a/content/en/observability_pipelines/packs/_index.md b/content/en/observability_pipelines/packs/_index.md index 048dc28ac32..15522a6cc06 100644 --- a/content/en/observability_pipelines/packs/_index.md +++ b/content/en/observability_pipelines/packs/_index.md @@ -90,15 +90,15 @@ These packs are available: To set up packs: 1. Navigate to the [Pipelines][1] page. -1. Click **Packs**. +1. Click {{< ui >}}Packs{{< /ui >}}. 1. Click the pack you want to set up. 1. You can either create a new pipeline from the pack or add the pack to an existing pipelines. - - If you clicked **Add to New Pipeline**, in the new pipeline that was created: + - If you clicked {{< ui >}}Add to New Pipeline{{< /ui >}}, in the new pipeline that was created: - Click the processor group that was added to see the individual processors that the pack added and edit them as needed. See [Processors][2] for more information. - See [Set Up Pipelines][3] for information on setting up the rest of the pipeline. - - If you clicked **Add to Existing Pipeline**: + - If you clicked {{< ui >}}Add to Existing Pipeline{{< /ui >}}: 1. Select the pipeline you want to add the pack to. - 1. Click **Add to Existing Pipeline**. + 1. Click {{< ui >}}Add to Existing Pipeline{{< /ui >}}. 1. The pack is added to the last processor group in your pipeline. 1. Click on the group to review the individual processors and edit them as needed. See [Processors][2] for more information. diff --git a/content/en/observability_pipelines/processors/add_environment_variables.md b/content/en/observability_pipelines/processors/add_environment_variables.md index 11c95c93029..7b136738e3f 100644 --- a/content/en/observability_pipelines/processors/add_environment_variables.md +++ b/content/en/observability_pipelines/processors/add_environment_variables.md @@ -20,7 +20,7 @@ To set up this processor: 1. Define a filter query. Only logs that match the specified filter query are processed. All logs, regardless of whether they match the filter query, are sent to the next step in the pipeline. See [Search Syntax][1] for more information. 1. Enter the field name for the environment variable. 1. Enter the environment variable name. -1. Click **Add Environment Variable** if you want to add another environment variable. +1. Click {{< ui >}}Add Environment Variable{{< /ui >}} if you want to add another environment variable. ### Blocked environment variables @@ -46,7 +46,7 @@ The environment variable is matched to the pattern and not the literal word. For ### Allowlist -After you have added processors to your pipeline and clicked **Next: Install**, in the **Add environment variable processor(s) allowlist** field, enter a comma-separated list of environment variables you want to pull values from and use with this processor. +After you have added processors to your pipeline and clicked {{< ui >}}Next: Install{{< /ui >}}, in the {{< ui >}}Add environment variable processor(s) allowlist{{< /ui >}} field, enter a comma-separated list of environment variables you want to pull values from and use with this processor. The allowlist is stored in the environment variable `DD_OP_PROCESSOR_ADD_ENV_VARS_ALLOWLIST`. diff --git a/content/en/observability_pipelines/processors/add_hostname.md b/content/en/observability_pipelines/processors/add_hostname.md index 0fe9ba3e726..edc8a2f6581 100644 --- a/content/en/observability_pipelines/processors/add_hostname.md +++ b/content/en/observability_pipelines/processors/add_hostname.md @@ -16,6 +16,6 @@ This processor adds a field with the name of the host that sent the log. For exa ## Setup To set up this processor: -- Define a **filter query**. Only logs that match the specified filter query are processed. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][1] for more information. +- Define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are processed. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][1] for more information. [1]: /observability_pipelines/search_syntax/logs/ \ No newline at end of file diff --git a/content/en/observability_pipelines/processors/custom_processor.md b/content/en/observability_pipelines/processors/custom_processor.md index d43dc66de5c..05ba5e0cb6c 100644 --- a/content/en/observability_pipelines/processors/custom_processor.md +++ b/content/en/observability_pipelines/processors/custom_processor.md @@ -30,6 +30,7 @@ Use this processor with Vector Remap Language (VRL) to modify and enrich your lo - [Convert syslog values](#convert) to read-able values. - Enrich values by using [enrichment tables](#enrichment). - [Manipulate IP values](#ip). +- Calculate [geographic distances](#map) and bearing with haversine. - [Parse](#parse) values with custom rules (for example, grok, regex, and so on) and out-of-the-box functions (for example, syslog, apache, VPC flow logs, and so on). See [Writing Effective Grok Parsing Rules with Regular Expressions][3] for information. - Manipulate event [paths](#path). @@ -41,17 +42,17 @@ See [Remap Reserved Attributes][1] on how to use the Custom Processor to manuall To set up this processor: -- If you have not created any functions yet, click **Add custom processor** and follow the instructions in [Add a function](#add-a-function) to create a function. -- If you have already added custom functions, click **Manage custom processors**. Click on a function in the list to edit or delete it. You can use the search bar to find a function by its name. Click **Add Custom Processor** to [add a function](#add-a-function). +- If you have not created any functions yet, click {{< ui >}}Add custom processor{{< /ui >}} and follow the instructions in [Add a function](#add-a-function) to create a function. +- If you have already added custom functions, click {{< ui >}}Manage custom processors{{< /ui >}}. Click on a function in the list to edit or delete it. You can use the search bar to find a function by its name. Click {{< ui >}}Add Custom Processor{{< /ui >}} to [add a function](#add-a-function). ### Add a function 1. Enter a name for your custom processor. -1. Add your script to modify your logs using [custom functions][1]. You can also click **Autofill with Example** and select one of the common use cases to get started. Click the copy icon for the example script and paste it into your script. See [Get Started with the Custom Processor][2] for more information. -1. Optionally, check **Drop events on error** if you want to drop events that encounter an error during processing. +1. Add your script to modify your logs using [custom functions][1]. You can also click {{< ui >}}Autofill with Example{{< /ui >}} and select one of the common use cases to get started. Click the copy icon for the example script and paste it into your script. See [Get Started with the Custom Processor][2] for more information. +1. Optionally, check {{< ui >}}Drop events on error{{< /ui >}} if you want to drop events that encounter an error during processing. 1. Enter a sample log event. -1. Click **Run** to preview how the functions process the log. After the script has run, you can see the output for the log. -1. Click **Save**. +1. Click {{< ui >}}Run{{< /ui >}} to preview how the functions process the log. After the script has run, you can see the output for the log. +1. Click {{< ui >}}Save{{< /ui >}}. ## Custom functions @@ -63,6 +64,7 @@ To set up this processor: {{< nextlink href="observability_pipelines/processors/custom_processor/#debug" >}}Debug{{< /nextlink >}} {{< nextlink href="observability_pipelines/processors/custom_processor/#enrichment" >}}Enrichment{{< /nextlink >}} {{< nextlink href="observability_pipelines/processors/custom_processor/#ip" >}}IP{{< /nextlink >}} + {{< nextlink href="observability_pipelines/processors/custom_processor/#map" >}}Map{{< /nextlink >}} {{< nextlink href="observability_pipelines/processors/custom_processor/#number" >}}Number{{< /nextlink >}} {{< nextlink href="observability_pipelines/processors/custom_processor/#object" >}}Object{{< /nextlink >}} {{< nextlink href="observability_pipelines/processors/custom_processor/#parse" >}}Parse{{< /nextlink >}} diff --git a/content/en/observability_pipelines/processors/dedupe.md b/content/en/observability_pipelines/processors/dedupe.md index e37ea647163..4976d377677 100644 --- a/content/en/observability_pipelines/processors/dedupe.md +++ b/content/en/observability_pipelines/processors/dedupe.md @@ -17,13 +17,13 @@ The Deduplicate processor removes copies of data to reduce volume and noise. It To set up the Deduplicate processor: -1. Define a **filter query**. Only logs that match the specified filter query are processed. Deduped logs and logs that do not match the filter query are sent to the next step in the pipeline. See [Search Syntax][1] for more information. -1. In the **Type of deduplication** dropdown menu, select whether you want to `Match` on or `Ignore` the fields specified below. +1. Define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are processed. Deduped logs and logs that do not match the filter query are sent to the next step in the pipeline. See [Search Syntax][1] for more information. +1. In the {{< ui >}}Type of deduplication{{< /ui >}} dropdown menu, select whether you want to `Match` on or `Ignore` the fields specified below. - If `Match` is selected, then after a log passes through, future logs that have the same values for all of the fields you specify below are removed. - If `Ignore` is selected, then after a log passes through, future logs that have the same values for all of their fields, *except* the ones you specify below, are removed. 1. Enter the fields you want to match on, or ignore. At least one field is required, and you can specify a maximum of three fields. - Use the path notation `.` to match subfields. See the [Path notation example](#path-notation-example) below. -1. Click **Add field** to add additional fields you want to filter on. +1. Click {{< ui >}}Add field{{< /ui >}} to add additional fields you want to filter on. ### Optional settings diff --git a/content/en/observability_pipelines/processors/edit_fields.md b/content/en/observability_pipelines/processors/edit_fields.md index a4702c44e93..6c8a732d422 100644 --- a/content/en/observability_pipelines/processors/edit_fields.md +++ b/content/en/observability_pipelines/processors/edit_fields.md @@ -15,38 +15,38 @@ products: ## Overview -The Edit Fields processor can add, drop, or rename fields within your individual log data. Use this processor to enrich your logs with additional context, remove low-value fields to reduce volume, and standardize naming across important attributes. Select **add field**, **drop field**, or **rename field** in the dropdown menu to get started. +The Edit Fields processor can add, drop, or rename fields within your individual log data. Use this processor to enrich your logs with additional context, remove low-value fields to reduce volume, and standardize naming across important attributes. Select {{< ui >}}add field{{< /ui >}}, {{< ui >}}drop field{{< /ui >}}, or {{< ui >}}rename field{{< /ui >}} in the dropdown menu to get started. See the [Remap Reserved Attributes][1] guide on how to use the Edit Fields processor to remap attributes. ## Setup ### Add field -Use **add field** to append a new key-value field to your log. +Use {{< ui >}}add field{{< /ui >}} to append a new key-value field to your log. To set up the add field processor: -1. Define a **filter query**. Only logs that match the specified filter query are processed. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][2] for more information. +1. Define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are processed. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][2] for more information. 1. Enter the field and value you want to add. To specify a nested field for your key, use the [path notation](#path-notation-example-remap): `.`. All values are stored as strings. **Note**: If the field you want to add already exists, the Worker logs an error and the existing field remains unchanged. ### Drop field -Use **drop field** to drop a field from logging data that matches the filter you specify below. It can delete objects, so you can use the processor to drop nested keys. +Use {{< ui >}}drop field{{< /ui >}} to drop a field from logging data that matches the filter you specify below. It can delete objects, so you can use the processor to drop nested keys. To set up the drop field processor: -1. Define a **filter query**. Only logs that match the specified filter query are processed. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][2] for more information. +1. Define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are processed. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][2] for more information. 1. Enter the key of the field you want to drop. To specify a nested field for your specified key, use the [path notation](#path-notation-example-remap): `.`. **Note**: If your specified key does not exist, your log is unimpacted. ### Rename field -Use **rename field** to rename a field within your log. +Use {{< ui >}}rename field{{< /ui >}} to rename a field within your log. To set up the rename field processor: -1. Define a **filter query**. Only logs that match the specified filter query are processed. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][2] for more information. -1. Enter the name of the field you want to rename in the **Source field**. To specify a nested field for your key, use the [path notation](#path-notation-example-remap): `.`. After it is renamed, your original field is deleted unless you enable the **Preserve source tag** checkbox described below.
**Note**: If the source key you specify doesn't exist, a default `null` value is applied to your target. -1. In the **Target field**, enter the name you want the source field to be renamed to. To specify a nested field for your specified key, use the [path notation](#path-notation-example-remap): `.`.
**Note**: If the target field you specify already exists, the Worker logs an error and does not overwrite the existing target field. -1. Optionally, check the **Preserve source tag** box if you want to retain the original source field and duplicate the information from your source key to your specified target key. If this box is not checked, the source key is dropped after it is renamed. +1. Define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are processed. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][2] for more information. +1. Enter the name of the field you want to rename in the {{< ui >}}Source field{{< /ui >}}. To specify a nested field for your key, use the [path notation](#path-notation-example-remap): `.`. After it is renamed, your original field is deleted unless you enable the {{< ui >}}Preserve source tag{{< /ui >}} checkbox described below.
**Note**: If the source key you specify doesn't exist, a default `null` value is applied to your target. +1. In the {{< ui >}}Target field{{< /ui >}}, enter the name you want the source field to be renamed to. To specify a nested field for your specified key, use the [path notation](#path-notation-example-remap): `.`.
**Note**: If the target field you specify already exists, the Worker logs an error and does not overwrite the existing target field. +1. Optionally, check the {{< ui >}}Preserve source tag{{< /ui >}} box if you want to retain the original source field and duplicate the information from your source key to your specified target key. If this box is not checked, the source key is dropped after it is renamed. ### Path notation example {#path-notation-example-remap} diff --git a/content/en/observability_pipelines/processors/enrichment_table.md b/content/en/observability_pipelines/processors/enrichment_table.md index c9e25c73cb1..3f258a40eda 100644 --- a/content/en/observability_pipelines/processors/enrichment_table.md +++ b/content/en/observability_pipelines/processors/enrichment_table.md @@ -73,14 +73,14 @@ In Datadog's Snowflake integration documentation, see [Reference Tables][3] for To set up the Enrichment Table processor: -1. Click **Add enrichment**. -1. Define a **filter query**. Only logs that match the specified filter query are sent through the processor. **Note**: All logs, regardless of whether they match the filter query, are sent to the next step in the pipeline. See [Search Syntax][8] for more information. -1. In the **Set lookup mapping** section, select the type of lookup dataset you want to use. +1. Click {{< ui >}}Add enrichment{{< /ui >}}. +1. Define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are sent through the processor. **Note**: All logs, regardless of whether they match the filter query, are sent to the next step in the pipeline. See [Search Syntax][8] for more information. +1. In the {{< ui >}}Set lookup mapping{{< /ui >}} section, select the type of lookup dataset you want to use. {{< tabs >}} {{% tab "Reference Table" %}} 1. Select the Reference Table in the dropdown menu. See [Using reference tables](#using-reference-tables) for more information. - 1. Click **Manage** to go to the Reference Tables configuration page. + 1. Click {{< ui >}}Manage{{< /ui >}} to go to the Reference Tables configuration page. 1. (Optional) Select specific columns with which to enrich your logs. - Observability Pipelines enriches logs with all columns in the table by default. Each column in the table is added as an attribute to the log, where the attribute name is the column name and the attribute value is the column value. - If you want to enrich your logs with specific columns from your Reference Table, select the columns' corresponding attributes in the dropdown menu. @@ -89,7 +89,7 @@ To set up the Enrichment Table processor: - Limited to the [`reference_tables_read`][3] scope. 1. Enter the source attribute of the log. The source attribute's value is what you want Observability Pipelines to find in the Reference Table. See the [Enrichment example](#enrichment-example) for more information. 1. Enter the target attribute. The target attribute's value stores, as a JSON object, the information found in the Reference Table. See the [Enrichment file example](#enrichment-file-example) for more information. - 1. Click **Save**. + 1. Click {{< ui >}}Save{{< /ui >}}. [1]: /account_management/api-app-keys/#application-keys [2]: /account_management/org_settings/service_accounts#service-account-application-keys @@ -101,12 +101,12 @@ To set up the Enrichment Table processor: 1. Enter the file path. - **Note**: All file paths are made relative to the configuration data directory, which is `/var/lib/observability-pipelines-worker/config/` by default. The file must be owned by the `observability-pipelines-worker group` and `observability-pipelines-worker` user, or at least readable by the group or user. See [Advanced Worker Configurations][1] for more information. 1. Enter the column name. The column name in the enrichment table is used for matching the source attribute value. See the [Enrichment example](#enrichment-example) for more information. - 1. ({{< tooltip glossary="preview" case="title" >}}) If you are using a secret as a source attribute, toggle **Use Secret as source attribute** to enable it. - - Select the type of secret (**Datadog API Key** or **Splunk HEC token**). + 1. ({{< tooltip glossary="preview" case="title" >}}) If you are using a secret as a source attribute, toggle {{< ui >}}Use Secret as source attribute{{< /ui >}} to enable it. + - Select the type of secret ({{< ui >}}Datadog API Key{{< /ui >}} or {{< ui >}}Splunk HEC token{{< /ui >}}). - See [Use a secret as a source attribute example](#use-a-secret-as-a-source-attribute) for more information. 1. If you are not using a secret, enter the source attribute of the log. The source attribute's value is used as the key to match against the column name in your local file. 1. Enter the target attribute. The target attribute's value stores the information found in the file as a JSON object. - 1. Click **Save**. + 1. Click {{< ui >}}Save{{< /ui >}}. [1]: /observability_pipelines/configuration/install_the_worker/advanced_worker_configurations/ {{% /tab %}} @@ -116,7 +116,7 @@ To set up the Enrichment Table processor: - **Note**: All file paths are made relative to the configuration data directory, which is `/var/lib/observability-pipelines-worker/config/` by default. The file must be owned by the `observability-pipelines-worker group` and `observability-pipelines-worker` user, or at least readable by the group or user. See [Advanced Worker Configurations][1] for more information. 1. Enter the source attribute of the log. The source attribute's value is what you want Observabiity Pipelines to find in the Reference Table. See the [Enrichment file example](#enrichment-file-example) for more information. 1. Enter the target attribute. The target attribute's value stores the information found in the Reference Table as a JSON object. See the [Enrichment file example](#enrichment-file-example) for more information. - 1. Click **Save**. + 1. Click {{< ui >}}Save{{< /ui >}}. [1]: /observability_pipelines/configuration/install_the_worker/advanced_worker_configurations/ {{% /tab %}} @@ -150,15 +150,15 @@ merchant_info { ### Use a secret as a source attribute -For the file lookup option, you can enable **Use Secret as source attribute** to map to a secret, such as a Datadog API key, Splunk HEC token, or a custom header in an HTTP request, in your local CSV file. The secret is used as the key to match against the column name in your local file. +For the file lookup option, you can enable {{< ui >}}Use Secret as source attribute{{< /ui >}} to map to a secret, such as a Datadog API key, Splunk HEC token, or a custom header in an HTTP request, in your local CSV file. The secret is used as the key to match against the column name in your local file. -**Note**: If you want to map to Splunk HEC tokens, you must use a [Splunk HEC source][9] and enable **Store HEC token** on the source. +**Note**: If you want to map to Splunk HEC tokens, you must use a [Splunk HEC source][9] and enable {{< ui >}}Store HEC token{{< /ui >}} on the source. #### Splunk HEC example For example, if you want to filter and route logs based on Splunk HEC tokens: -1. Enable **Store HEC token** on the Splunk HEC source to store the token in the event metadata. +1. Enable {{< ui >}}Store HEC token{{< /ui >}} on the Splunk HEC source to store the token in the event metadata. 1. Use the file lookup option in the Enrichment Table processor to use the HEC token stored in the event metadata as a lookup key. The Worker enriches the event so you can filter and route logs based on that value. Example of a local lookup CSV file with Splunk HEC tokens mapped to a value: diff --git a/content/en/observability_pipelines/processors/filter.md b/content/en/observability_pipelines/processors/filter.md index bf665bf20c8..206087598de 100644 --- a/content/en/observability_pipelines/processors/filter.md +++ b/content/en/observability_pipelines/processors/filter.md @@ -27,7 +27,7 @@ This processor sends all logs or metrics ({{< tooltip glossary="preview" case="t To set up the filter processor: -- Define a **filter query**.
**Notes**: +- Define a {{< ui >}}filter query{{< /ui >}}.
**Notes**: - Logs or metrics that match the query are sent to the next component. - Logs or metrics that don't match the query are dropped. - For more information, see [Search Syntax for Logs][1] or [Search Syntax for Metrics][2]. diff --git a/content/en/observability_pipelines/processors/generate_metrics.md b/content/en/observability_pipelines/processors/generate_metrics.md index 3f3ba67fa20..eef81126c35 100644 --- a/content/en/observability_pipelines/processors/generate_metrics.md +++ b/content/en/observability_pipelines/processors/generate_metrics.md @@ -19,20 +19,20 @@ Many types of logs are meant to be used for telemetry to track trends, such as K To set up the processor: -Click **Manage Metrics** to create new metrics or edit existing metrics. This opens a side panel. +Click {{< ui >}}Manage Metrics{{< /ui >}} to create new metrics or edit existing metrics. This opens a side panel. - If you have not created any metrics yet, enter the metric parameters as described in the [Add a metric](#add-a-metric) section to create a metric. -- If you have already created metrics, click on the metric's row in the overview table to edit or delete it. Use the search bar to find a specific metric by its name, and then select the metric to edit or delete it. Click **Add Metric** to add another metric. +- If you have already created metrics, click on the metric's row in the overview table to edit or delete it. Use the search bar to find a specific metric by its name, and then select the metric to edit or delete it. Click {{< ui >}}Add Metric{{< /ui >}} to add another metric. ### Add a metric 1. Enter a filter query. Only logs that match the specified filter query are processed. All logs, regardless of whether they match the filter query, are sent to the next step in the pipeline. See [Search Syntax][5] for more information. **Note**: Since a single processor can generate multiple metrics, you can define a different filter query for each metric. 1. Enter a name for the metric. -1. In the **Define parameters** section, select the metric type (count, gauge, or distribution). See the [Count metric example](#count-metric-example) and [Distribution metric example](#distribution-metric-example). Also see [Metrics Types](#metrics-types) for more information. +1. In the {{< ui >}}Define parameters{{< /ui >}} section, select the metric type (count, gauge, or distribution). See the [Count metric example](#count-metric-example) and [Distribution metric example](#distribution-metric-example). Also see [Metrics Types](#metrics-types) for more information. - For gauge and distribution metric types, select a log field which has a numeric (or parseable numeric string) value that is used for the value of the generated metric. - For the distribution metric type, the log field's value can be an array of (parseable) numerics, which is used for the generated metric's sample set. - - The **Group by** field determines how the metric values are grouped together. For example, if you have hundreds of hosts spread across four regions, grouping by region allows you to graph one line for every region. The fields listed in the **Group by** setting are set as tags on the configured metric. -1. Click **Add Metric**. + - The {{< ui >}}Group by{{< /ui >}} field determines how the metric values are grouped together. For example, if you have hundreds of hosts spread across four regions, grouping by region allows you to graph one line for every region. The fields listed in the {{< ui >}}Group by{{< /ui >}} setting are set as tags on the configured metric. +1. Click {{< ui >}}Add Metric{{< /ui >}}. ## Metrics types diff --git a/content/en/observability_pipelines/processors/grok_parser.md b/content/en/observability_pipelines/processors/grok_parser.md index 7df2111ce2b..0ce40670132 100644 --- a/content/en/observability_pipelines/processors/grok_parser.md +++ b/content/en/observability_pipelines/processors/grok_parser.md @@ -32,22 +32,22 @@ See [Parsing][1] for more information on Datadog's Grok patterns. ## Setup -To set up the grok parser, define a **filter query**. Only logs that match the specified filter query are processed. All logs, regardless of whether they match the filter query, are sent to the next step in the pipeline. See [Search Syntax][3] for more information. +To set up the grok parser, define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are processed. All logs, regardless of whether they match the filter query, are sent to the next step in the pipeline. See [Search Syntax][3] for more information. To test log samples for out-of-the-box rules: -1. Click the **Preview Library Rules** button. +1. Click the {{< ui >}}Preview Library Rules{{< /ui >}} button. 1. Search or select a source in the dropdown menu. 1. Enter a log sample to test the parsing rules for that source. To add a custom parsing rule: -1. Click **Add Custom Rule**. -1. If you want to clone a library rule, select **Clone library rule** and then the library source from the dropdown menu. -1. If you want to create a custom rule, select **Custom** and then enter the `source`. The parsing rules are applied to logs with that `source`. +1. Click {{< ui >}}Add Custom Rule{{< /ui >}}. +1. If you want to clone a library rule, select {{< ui >}}Clone library rule{{< /ui >}} and then the library source from the dropdown menu. +1. If you want to create a custom rule, select {{< ui >}}Custom{{< /ui >}} and then enter the `source`. The parsing rules are applied to logs with that `source`. 1. Enter log samples to test the parsing rules. 1. Enter the rules for parsing the logs. See [Parsing][1] for more information on writing parsing rules with Datadog Grok patterns.
**Note**: The `url`, `useragent`, and `csv` filters are not available. -1. Click **Advanced Settings** if you want to add helper rules. See [Using helper rules to reuse common patterns][2] for more information. -1. Click **Add Rule**. +1. Click {{< ui >}}Advanced Settings{{< /ui >}} if you want to add helper rules. See [Using helper rules to reuse common patterns][2] for more information. +1. Click {{< ui >}}Add Rule{{< /ui >}}. [1]: /logs/log_configuration/parsing/ [2]: /logs/log_configuration/parsing/?tab=matchers#using-helper-rules-to-reuse-common-patterns diff --git a/content/en/observability_pipelines/processors/parse_json.md b/content/en/observability_pipelines/processors/parse_json.md index 0d3b84a9ac0..fee3f1d4ac3 100644 --- a/content/en/observability_pipelines/processors/parse_json.md +++ b/content/en/observability_pipelines/processors/parse_json.md @@ -62,7 +62,7 @@ This output contains the `message` field with the parsed JSON: ## Setup To set up this processor: -1. Define a **filter query**. Only logs that match the specified filter query are processed. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][1] for more information. +1. Define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are processed. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][1] for more information. 2. Enter the name of the field you want to parse JSON on.
**Note**: The parsed JSON overwrites what was originally contained in the field. [1]: /observability_pipelines/search_syntax/logs/ diff --git a/content/en/observability_pipelines/processors/parse_xml.md b/content/en/observability_pipelines/processors/parse_xml.md index d01fb4559d2..14a7199095e 100644 --- a/content/en/observability_pipelines/processors/parse_xml.md +++ b/content/en/observability_pipelines/processors/parse_xml.md @@ -47,12 +47,12 @@ To set up this processor: 1. Define a filter query. Only logs that match the specified filter query are processed. All logs, regardless of whether they match the filter query, are sent to the next step in the pipeline. See [Search Syntax][1] for more information. 1. Enter the path to the log field on which you want to parse XML. Use the path notation `.` to match subfields. See the [Path notation example](#path-notation-example-parse-xml) below. 1. Optionally, in the `Enter text key` field, input the key name to use for the text node when XML attributes are appended. See the [text key example](#text-key-example). If the field is left empty, `value` is used as the key name. -1. Optionally, select `Always use text key` if you want to store text inside an object using the text key even when no attributes exist. -1. Optionally, toggle `Include XML attributes` on if you want to include XML attributes. You can then choose to add the attribute prefix you want to use. See [attribute prefix example](#attribute-prefix-example). If the field is left empty, the original attribute key is used. +1. Optionally, select {{< ui >}}Always use text key{{< /ui >}} if you want to store text inside an object using the text key even when no attributes exist. +1. Optionally, toggle {{< ui >}}Include XML attributes{{< /ui >}} on if you want to include XML attributes. You can then choose to add the attribute prefix you want to use. See [attribute prefix example](#attribute-prefix-example). If the field is left empty, the original attribute key is used. 1. Optionally, select if you want to convert data types into numbers, Booleans, or nulls. - - If **Numbers** is selected, numbers are parsed as integers and floats. - - If **Booleans** is selected, `true` and `false` are parsed as Booleans. - - If **Nulls** is selected, the string `null` is parsed as null. + - If {{< ui >}}Numbers{{< /ui >}} is selected, numbers are parsed as integers and floats. + - If {{< ui >}}Booleans{{< /ui >}} is selected, `true` and `false` are parsed as Booleans. + - If {{< ui >}}Nulls{{< /ui >}} is selected, the string `null` is parsed as null. ### Path notation example {#path-notation-example-parse-xml} @@ -62,7 +62,7 @@ To set up this processor: ### Always use text key example -If **Always use text key** is selected, the text key is the default (`value`), and you have the following XML: +If {{< ui >}}Always use text key{{< /ui >}} is selected, the text key is the default (`value`), and you have the following XML: ```xml @@ -106,7 +106,7 @@ The XML is converted to: ### Attribute prefix example -If you enable **Include XML attributes**, the attribute is added as a prefix to each XML attribute. For example, if the attribute prefix is `@` and you have the following XML: +If you enable {{< ui >}}Include XML attributes{{< /ui >}}, the attribute is added as a prefix to each XML attribute. For example, if the attribute prefix is `@` and you have the following XML: ```xml Carbonara diff --git a/content/en/observability_pipelines/processors/quota.md b/content/en/observability_pipelines/processors/quota.md index f90c90d005e..1388caba4c7 100644 --- a/content/en/observability_pipelines/processors/quota.md +++ b/content/en/observability_pipelines/processors/quota.md @@ -30,31 +30,31 @@ You can also use field-based partitioning, such as `service`, `env`, `status`. E To set up the quota processor: 1. Enter a name for the quota processor. -1. Define a **filter query**. Only logs that match the specified filter query are counted towards the daily limit. See [Search Syntax][6] for more information. +1. Define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are counted towards the daily limit. See [Search Syntax][6] for more information. - Logs that match the quota filter and are within the daily quota are sent to the next step in the pipeline. - Logs that do not match the quota filter are sent to the next step of the pipeline. -1. In the **Unit for quota** dropdown menu, select if you want to measure the quota by the number of `Events` or by the `Volume` in bytes. +1. In the {{< ui >}}Unit for quota{{< /ui >}} dropdown menu, select if you want to measure the quota by the number of `Events` or by the `Volume` in bytes. 1. Set the daily quota limit and select the unit of magnitude for your desired quota. -1. Optional: Click **Add Field** if you want to set a quota on a specific service or region field. +1. Optional: Click {{< ui >}}Add Field{{< /ui >}} if you want to set a quota on a specific service or region field. 1. Enter the field name you want to partition by. See the [Partition example](#partition-example) for more information. - 1. Select the **Ignore when missing** if you want the quota applied only to events that match the partition. See the [Ignore when missing example](#example-for-the-ignore-when-missing-option) for more information. - 1. Optional: Click **Overrides** if you want to set different quotas for the partitioned field. - - Click **Download as CSV** for an example of how to structure the CSV. - - Drag and drop your overrides CSV to upload it. You can also click **Browse** to select the file to upload it. See the [Overrides example](#overrides-example) for more information. - 1. Click **Add Field** if you want to add another partition. -1. In the **When quota is met** dropdown menu, select if you want to **drop events**, **keep events**, or **send events to overflow destination**, when the quota has been met. - 1. If you select **send events to overflow destination**, an overflow destination is added with the following cloud storage options: **Amazon S3**, **Azure Blob**, and **Google Cloud**. + 1. Select the {{< ui >}}Ignore when missing{{< /ui >}} if you want the quota applied only to events that match the partition. See the [Ignore when missing example](#example-for-the-ignore-when-missing-option) for more information. + 1. Optional: Click {{< ui >}}Overrides{{< /ui >}} if you want to set different quotas for the partitioned field. + - Click {{< ui >}}Download as CSV{{< /ui >}} for an example of how to structure the CSV. + - Drag and drop your overrides CSV to upload it. You can also click {{< ui >}}Browse{{< /ui >}} to select the file to upload it. See the [Overrides example](#overrides-example) for more information. + 1. Click {{< ui >}}Add Field{{< /ui >}} if you want to add another partition. +1. In the {{< ui >}}When quota is met{{< /ui >}} dropdown menu, select if you want to {{< ui >}}drop events{{< /ui >}}, {{< ui >}}keep events{{< /ui >}}, or {{< ui >}}send events to overflow destination{{< /ui >}}, when the quota has been met. + 1. If you select {{< ui >}}send events to overflow destination{{< /ui >}}, an overflow destination is added with the following cloud storage options: **Amazon S3**, **Azure Blob**, and **Google Cloud**. 1. Select the cloud storage you want to send overflow logs to. See the setup instructions for your cloud storage: [Amazon S3][2], [Azure Blob Storage][3], or [Google Cloud Storage][4]. ### Examples #### Partition example -Use **Partition by** if you want to set a quota on a specific service or region. For example, if you want to set a quota for 10 events per day and group the events by the `service` field, enter `service` into the **Partition by** field. +Use {{< ui >}}Partition by{{< /ui >}} if you want to set a quota on a specific service or region. For example, if you want to set a quota for 10 events per day and group the events by the `service` field, enter `service` into the {{< ui >}}Partition by{{< /ui >}} field. #### Example for the "ignore when missing" option -Select **Ignore when missing** if you want the quota applied only to events that match the partition. For example, if the Worker receives the following set of events: +Select {{< ui >}}Ignore when missing{{< /ui >}} if you want the quota applied only to events that match the partition. For example, if the Worker receives the following set of events: ``` {"service":"a", "source":"foo", "message": "..."} @@ -64,14 +64,14 @@ Select **Ignore when missing** if you want the quota applied only to events that {"message": "..."} ``` -And the **Ignore when missing** is selected, then the Worker: +And the {{< ui >}}Ignore when missing{{< /ui >}} is selected, then the Worker: - creates a set for logs with `service:a` and `source:foo` - creates a set for logs with `service:b` and `source:bar` - ignores the last three events The quota is applied to the two sets of logs and not to the last three events. -If the **Ignore when missing** is not selected, the quota is applied to all five events. +If the {{< ui >}}Ignore when missing{{< /ui >}} is not selected, the quota is applied to all five events. #### Overrides example diff --git a/content/en/observability_pipelines/processors/reduce.md b/content/en/observability_pipelines/processors/reduce.md index bc3bed4b1d6..4b642d3da9f 100644 --- a/content/en/observability_pipelines/processors/reduce.md +++ b/content/en/observability_pipelines/processors/reduce.md @@ -16,13 +16,13 @@ The reduce processor groups multiple log events into a single log, based on the ## Setup To set up the reduce processor: -1. Define a **filter query**. Only logs that match the specified filter query are processed. Reduced logs and logs that do not match the filter query are sent to the next step in the pipeline. See [Search Syntax][1] for more information. -2. In the **Group By** section, enter the field you want to group the logs by. -3. Click **Add Group by Field** to add additional fields. -4. In the **Merge Strategy** section: - - In **On Field**, enter the name of the field you want to merge the logs on. - - Select the merge strategy in the **Apply** dropdown menu. This is the strategy used to combine events. See the [Merge strategies](#merge-strategies) section for descriptions of the available strategies. - - Click **Add Merge Strategy** to add additional strategies. +1. Define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are processed. Reduced logs and logs that do not match the filter query are sent to the next step in the pipeline. See [Search Syntax][1] for more information. +2. In the {{< ui >}}Group By{{< /ui >}} section, enter the field you want to group the logs by. +3. Click {{< ui >}}Add Group by Field{{< /ui >}} to add additional fields. +4. In the {{< ui >}}Merge Strategy{{< /ui >}} section: + - In {{< ui >}}On Field{{< /ui >}}, enter the name of the field you want to merge the logs on. + - Select the merge strategy in the {{< ui >}}Apply{{< /ui >}} dropdown menu. This is the strategy used to combine events. See the [Merge strategies](#merge-strategies) section for descriptions of the available strategies. + - Click {{< ui >}}Add Merge Strategy{{< /ui >}} to add additional strategies. ### Merge strategies diff --git a/content/en/observability_pipelines/processors/remap_ocsf.md b/content/en/observability_pipelines/processors/remap_ocsf.md index 1bc5d629144..297e81021aa 100644 --- a/content/en/observability_pipelines/processors/remap_ocsf.md +++ b/content/en/observability_pipelines/processors/remap_ocsf.md @@ -17,10 +17,10 @@ Use this processor to remap logs to Open Cybersecurity Schema Framework (OCSF) e To set up this processor: -Click **Manage mappings**. This opens a modal: +Click {{< ui >}}Manage mappings{{< /ui >}}. This opens a modal: -- If you have already added mappings, click on a mapping in the list to edit or delete it. You can use the search bar to find a mapping by its name. Click **Add Mapping** if you want to add another mapping. Select **Library Mapping** or **Custom Mapping** and click **Continue**. -- If you have not added any mappings yet, select **Library Mapping** or **Custom Mapping**. Click **Continue**. +- If you have already added mappings, click on a mapping in the list to edit or delete it. You can use the search bar to find a mapping by its name. Click {{< ui >}}Add Mapping{{< /ui >}} if you want to add another mapping. Select {{< ui >}}Library Mapping{{< /ui >}} or {{< ui >}}Custom Mapping{{< /ui >}} and click {{< ui >}}Continue{{< /ui >}}. +- If you have not added any mappings yet, select {{< ui >}}Library Mapping{{< /ui >}} or {{< ui >}}Custom Mapping{{< /ui >}}. Click {{< ui >}}Continue{{< /ui >}}. {{% collapse-content title="Library mapping" level="h5" expanded=false id="library_mapping" %}} @@ -29,7 +29,7 @@ Click **Manage mappings**. This opens a modal: 1. Select the log type in the dropdown menu. 1. Define a filter query. Only logs that match the specified filter query are remapped. All logs, regardless of whether they do or do not match the filter query, are sent to the next step in the pipeline. See [Search Syntax][1] for more information. 1. Review the sample source log and the resulting OCSF output. -1. Click **Save Mapping**. +1. Click {{< ui >}}Save Mapping{{< /ui >}}. ### Library mappings @@ -71,21 +71,21 @@ To set up a custom mapping: 1. Select the OCSF event category from the dropdown menu. 1. Select the OCSF event class from the dropdown menu. 1. Enter a log sample so that you can reference it when you add fields. -1. Click **Continue**. +1. Click {{< ui >}}Continue{{< /ui >}}. 1. Select any OCSF profiles that you want to add. See [OCSF Schema Browser][1] for more information. -1. All required fields are shown. Enter the required **Source Logs Fields** and **Fallback Values** for them. If you want to manually add additional fields, click **+ Field**. Click the trash can icon to delete a field. **Note**: Required fields cannot be deleted. +1. All required fields are shown. Enter the required {{< ui >}}Source Logs Fields{{< /ui >}} and {{< ui >}}Fallback Values{{< /ui >}} for them. If you want to manually add additional fields, click {{< ui >}}+ Field{{< /ui >}}. Click the trash can icon to delete a field. **Note**: Required fields cannot be deleted. - The fallback value is used for the OCSF field if the log doesn't have the source log field. - - You can add multiple fields for **Source Log Fields**. For example, Okta's `user.system.start` logs have either the `eventType` or `legacyEventType` field. You can map both fields to the same OCSF field. - - If you have your own OCSF mappings in JSON or saved a previous mapping that you want to use, click **Import Configuration File**. -1. Click **Continue**. + - You can add multiple fields for {{< ui >}}Source Log Fields{{< /ui >}}. For example, Okta's `user.system.start` logs have either the `eventType` or `legacyEventType` field. You can map both fields to the same OCSF field. + - If you have your own OCSF mappings in JSON or saved a previous mapping that you want to use, click {{< ui >}}Import Configuration File{{< /ui >}}. +1. Click {{< ui >}}Continue{{< /ui >}}. 1. Some log source values must be mapped to OCSF values. For example, the values of a source log's severity field that is mapped to the OCSF's `severity_id` field, must be mapped to the OCSF `severity_id`'s values. See `severity_id` in [Authentication][2] for a list of OCSF values. An example of mapping severity values: | Log source value | OCSF value | | ---------------- | --------------- | | `INFO` | `Informational` | | `WARN` | `Medium` | | `ERROR` | `High` | -1. All values that are required to be mapped to an OCSF value are listed. Click **+ Add Row** if you want to map additional values. -1. Click **Save Mapping**. +1. All values that are required to be mapped to an OCSF value are listed. Click {{< ui >}}+ Add Row{{< /ui >}} if you want to map additional values. +1. Click {{< ui >}}Save Mapping{{< /ui >}}. [1]: https://schema.ocsf.io/ [2]: https://schema.ocsf.io/1.4.0/classes/authentication?extensions= diff --git a/content/en/observability_pipelines/processors/sample.md b/content/en/observability_pipelines/processors/sample.md index 6503815f1cd..88e4573d650 100644 --- a/content/en/observability_pipelines/processors/sample.md +++ b/content/en/observability_pipelines/processors/sample.md @@ -18,9 +18,9 @@ The sampling only applies to logs that match your filter query and does not impa ## Setup To set up the sample processor: -1. Define a **filter query**. Only logs that match the specified filter query are sampled at the specified retention rate below. The sampled logs and the logs that do not match the filter query are sent to the next step in the pipeline. See [Search Syntax][1] for more information. -1. Enter your desired sampling rate in the **Retain** field. For example, entering `2` means 2% of logs are retained out of all the logs that match the filter query. -1. Optionally, enter a **Group By** field to create separate sampling groups for each unique value for that field. For example, `status:error` and `status:info` are two unique field values. Each bucket of events with the same field is sampled independently. Click Add Field if you want to add more fields to partition by. See the [group-by example](#group-by-example). +1. Define a {{< ui >}}filter query{{< /ui >}}. Only logs that match the specified filter query are sampled at the specified retention rate below. The sampled logs and the logs that do not match the filter query are sent to the next step in the pipeline. See [Search Syntax][1] for more information. +1. Enter your desired sampling rate in the {{< ui >}}Retain{{< /ui >}} field. For example, entering `2` means 2% of logs are retained out of all the logs that match the filter query. +1. Optionally, enter a {{< ui >}}Group By{{< /ui >}} field to create separate sampling groups for each unique value for that field. For example, `status:error` and `status:info` are two unique field values. Each bucket of events with the same field is sampled independently. Click {{< ui >}}Add Field{{< /ui >}} if you want to add more fields to partition by. See the [group-by example](#group-by-example). ### Group-by example diff --git a/content/en/observability_pipelines/processors/sensitive_data_scanner.md b/content/en/observability_pipelines/processors/sensitive_data_scanner.md index 840a0822875..e763a5c24d0 100644 --- a/content/en/observability_pipelines/processors/sensitive_data_scanner.md +++ b/content/en/observability_pipelines/processors/sensitive_data_scanner.md @@ -26,7 +26,7 @@ See [Best practices to optimize performance](#best-practices-to-optimize-perform To set up the processor: 1. Define a filter query. Only logs that match the specified filter query are scanned and processed. All logs are sent to the next step in the pipeline, regardless of whether they match the filter query. See [Search Syntax][1] for more information. -1. Click **Add Scanning Rule**. +1. Click {{< ui >}}Add Scanning Rule{{< /ui >}}. 1. Select one of the following: {{< tabs >}} @@ -34,33 +34,33 @@ To set up the processor: 1. In the dropdown menu, select the library rule you want to use. 1. Recommended keywords are automatically added based on the library rule selected. After the scanning rule has been added, you can [add additional keywords or remove recommended keywords](#add-additional-keywords). -1. In the **Define rule target and conditions** section, select if you want to scan the **Entire Event**, **Specific Attributes**, or **Exclude Attributes** in the dropdown menu. +1. In the {{< ui >}}Define rule target and conditions{{< /ui >}} section, select if you want to scan the {{< ui >}}Entire Event{{< /ui >}}, {{< ui >}}Specific Attributes{{< /ui >}}, or {{< ui >}}Exclude Attributes{{< /ui >}} in the dropdown menu. - If you are scanning the entire event, you can optionally exclude specific attributes from getting scanned. Use [path notation](#path-notation-example) (`outer_key.inner_key`) to access nested keys. For specified attributes with nested data, all nested data is excluded. - If you are scanning specific attributes, specify which attributes you want to scan. Use [path notation](#path-notation-example) (`outer_key.inner_key`) to access nested keys. For specified attributes with nested data, all nested data is scanned. -1. For **Define actions on match**, select the action you want to take for the matched information. **Note**: Redaction, partial redaction, and hashing are all irreversible actions. - - **Redact**: Replaces all matching values with the text you specify in the **Replacement text** field. - - **Partially Redact**: Replaces a specified portion of all matched data. In the **Redact** section, specify the number of characters you want to redact and which part of the matched data to redact. - - **Hash**: Replaces all matched data with a unique identifier. The UTF-8 bytes of the match are hashed with the 64-bit fingerprint of FarmHash. -1. Optionally, click **Add Field** to add tags you want to associate with the matched events. +1. For {{< ui >}}Define actions on match{{< /ui >}}, select the action you want to take for the matched information. **Note**: Redaction, partial redaction, and hashing are all irreversible actions. + - {{< ui >}}Redact{{< /ui >}}: Replaces all matching values with the text you specify in the {{< ui >}}Replacement text{{< /ui >}} field. + - {{< ui >}}Partially Redact{{< /ui >}}: Replaces a specified portion of all matched data. In the {{< ui >}}Redact{{< /ui >}} section, specify the number of characters you want to redact and which part of the matched data to redact. + - {{< ui >}}Hash{{< /ui >}}: Replaces all matched data with a unique identifier. The UTF-8 bytes of the match are hashed with the 64-bit fingerprint of FarmHash. +1. Optionally, click {{< ui >}}Add Field{{< /ui >}} to add tags you want to associate with the matched events. 1. Add a name for the scanning rule. 1. Optionally, add a description for the rule. -1. Click **Save**. +1. Click {{< ui >}}Save{{< /ui >}}. ### Add additional keywords After adding scanning rules from the library, you can edit each rule separately and add additional keywords to the keyword dictionary. 1. Navigate to your [pipeline][1]. -1. In the Sensitive Data Scanner processor with the rule you want to edit, click **Manage Scanning Rules**. -1. Toggle **Use recommended keywords** if you want the rule to use them. Otherwise, add your own keywords to the **Create keyword dictionary** field. You can also require that these keywords be within a specified number of characters of a match. By default, keywords must be within 30 characters before a matched value. -1. Click **Update**. +1. In the Sensitive Data Scanner processor with the rule you want to edit, click {{< ui >}}Manage Scanning Rules{{< /ui >}}. +1. Toggle {{< ui >}}Use recommended keywords{{< /ui >}} if you want the rule to use them. Otherwise, add your own keywords to the {{< ui >}}Create keyword dictionary{{< /ui >}} field. You can also require that these keywords be within a specified number of characters of a match. By default, keywords must be within 30 characters before a matched value. +1. Click {{< ui >}}Update{{< /ui >}}. [1]: https://app.datadoghq.com/observability-pipelines {{% /tab %}} {{% tab "Custom rules" %}} -1. In the **Define match conditions** section, specify the regex pattern to use for matching against events in the **Define the regex** field. See [Writing Effective Grok Parsing Rules with Regular Expressions][1] for more information. +1. In the {{< ui >}}Define match conditions{{< /ui >}} section, specify the regex pattern to use for matching against events in the {{< ui >}}Define the regex{{< /ui >}} field. See [Writing Effective Grok Parsing Rules with Regular Expressions][1] for more information. Sensitive Data Scanner supports Perl Compatible Regular Expressions (PCRE), but the following patterns are not supported: - Backreferences and capturing sub-expressions (lookarounds) - Arbitrary zero-width assertions @@ -72,19 +72,19 @@ After adding scanning rules from the library, you can edit each rule separately - The `\K` start of match reset directive - Callouts and embedded code - Atomic grouping and possessive quantifiers -1. Enter sample data in the **Add sample data** field to verify that your regex pattern is valid. -1. For **Create keyword dictionary**, add keywords to refine detection accuracy when matching regex conditions. For example, if you are scanning for a sixteen-digit Visa credit card number, you can add keywords like `visa`, `credit`, and `card`. You can also require that these keywords be within a specified number of characters of a match. By default, keywords must be within 30 characters before a matched value. -1. In the **Define rule target and conditions** section, select if you want to scan the **Entire Event**, **Specific Attributes**, or **Exclude Attributes** in the dropdown menu. +1. Enter sample data in the {{< ui >}}Add sample data{{< /ui >}} field to verify that your regex pattern is valid. +1. For {{< ui >}}Create keyword dictionary{{< /ui >}}, add keywords to refine detection accuracy when matching regex conditions. For example, if you are scanning for a sixteen-digit Visa credit card number, you can add keywords like `visa`, `credit`, and `card`. You can also require that these keywords be within a specified number of characters of a match. By default, keywords must be within 30 characters before a matched value. +1. In the {{< ui >}}Define rule target and conditions{{< /ui >}} section, select if you want to scan the {{< ui >}}Entire Event{{< /ui >}}, {{< ui >}}Specific Attributes{{< /ui >}}, or {{< ui >}}Exclude Attributes{{< /ui >}} in the dropdown menu. - If you are scanning the entire event, you can optionally exclude specific attributes from getting scanned. Use [path notation](#path-notation-example) (`outer_key.inner_key`) to access nested keys. For specified attributes with nested data, all nested data is excluded. - If you are scanning specific attributes, specify which attributes you want to scan. Use [path notation](#path-notation-example-custom) (`outer_key.inner_key`) to access nested keys. For specified attributes with nested data, all nested data is scanned. -1. For **Define actions on match**, select the action you want to take for the matched information. **Note**: Redaction, partial redaction, and hashing are all irreversible actions. - - **Redact**: Replaces all matching values with the text you specify in the **Replacement text** field. - - **Partially Redact**: Replaces a specified portion of all matched data. In the **Redact** section, specify the number of characters you want to redact and which part of the matched data to redact. - - **Hash**: Replaces all matched data with a unique identifier. The UTF-8 bytes of the match is hashed with the 64-bit fingerprint of FarmHash. -1. Optionally, click **Add Field** to add tags you want to associate with the matched events. +1. For {{< ui >}}Define actions on match{{< /ui >}}, select the action you want to take for the matched information. **Note**: Redaction, partial redaction, and hashing are all irreversible actions. + - {{< ui >}}Redact{{< /ui >}}: Replaces all matching values with the text you specify in the {{< ui >}}Replacement text{{< /ui >}} field. + - {{< ui >}}Partially Redact{{< /ui >}}: Replaces a specified portion of all matched data. In the {{< ui >}}Redact{{< /ui >}} section, specify the number of characters you want to redact and which part of the matched data to redact. + - {{< ui >}}Hash{{< /ui >}}: Replaces all matched data with a unique identifier. The UTF-8 bytes of the match is hashed with the 64-bit fingerprint of FarmHash. +1. Optionally, click {{< ui >}}Add Field{{< /ui >}} to add tags you want to associate with the matched events. 1. Add a name for the scanning rule. 1. Optionally, add a description for the rule. -1. Click **Add Rule**. +1. Click {{< ui >}}Add Rule{{< /ui >}}. [1]: /logs/guide/regex_log_parsing/ @@ -98,9 +98,9 @@ To delete a rule in the Sensitive Data Scanner: 1. Navigate to [Observability Pipelines][2]. 1. Select your pipeline. 1. Click the Sensitive Data Scanner processor to expand it. -1. Click **Manage Scanning Rules**. +1. Click {{< ui >}}Manage Scanning Rules{{< /ui >}}. 1. Select the rule you want to delete. -1. Click **Delete**. +1. Click {{< ui >}}Delete{{< /ui >}}. ### Path notation example @@ -295,7 +295,7 @@ Rules that are enabled but not used consume unnecessary resources. Check the Sen 1. Navigate to [Observability Pipelines][2]. 1. Select your pipeline. 1. Click the Sensitive Data Scanner processor to expand it. -1. Click **View Scanning Rules** to open the side panel and see **Matches in the last 24 hours** for each rule. +1. Click {{< ui >}}View Scanning Rules{{< /ui >}} to open the side panel and see {{< ui >}}Matches in the last 24 hours{{< /ui >}} for each rule. See [Delete a rule](#delete-a-rule) to delete an unused rule. @@ -305,7 +305,7 @@ The time it takes the Sensitive Data Scanner to scan an event roughly scales wit - If you know the types of events you want to scan, define a processor query that only sends the events you want to the processor. -- Reduce scanning time by targeting specific event attributes for scanning or excluding event attributes from being scanned. See the **Define rule target and conditions** step in [Set up the processor](#set-up-the-processor-in-the-ui). +- Reduce scanning time by targeting specific event attributes for scanning or excluding event attributes from being scanned. See the {{< ui >}}Define rule target and conditions{{< /ui >}} step in [Set up the processor](#set-up-the-processor-in-the-ui). ### Evaluate and benchmark performance optimizations @@ -318,7 +318,7 @@ To view the `pipelines.component_latency_seconds` metric: 1. Navigate to [Metrics Explorer][11]. 1. In the metric field, enter `pipelines.component_latency_seconds`. -1. In the **from** field, enter the tag `component_id:`, where `` is the ID for your Sensitive Data Scanner processor. +1. In the {{< ui >}}from{{< /ui >}} field, enter the tag `component_id:`, where `` is the ID for your Sensitive Data Scanner processor. **Note**: `pipelines.component_latency_seconds` is a distribution metric so you must enable percentiles for that metric. See [Enabling advanced query functionality][12] for instructions. diff --git a/content/en/observability_pipelines/processors/split_array.md b/content/en/observability_pipelines/processors/split_array.md index a3f2a141c02..1e1483c0da8 100644 --- a/content/en/observability_pipelines/processors/split_array.md +++ b/content/en/observability_pipelines/processors/split_array.md @@ -45,16 +45,16 @@ See the [split array example](#split-array-example) for a more detailed example. To set up this processor: -Click **Manage arrays to split** to add an array to split or edit an existing array to split. This opens a side panel. +Click {{< ui >}}Manage arrays to split{{< /ui >}} to add an array to split or edit an existing array to split. This opens a side panel. - If you have not created any arrays yet, enter the array parameters as described in the [Add a new array](#add-a-new-array) section below. -- If you have already created arrays, click on the array's row in the table to edit or delete it. Use the search bar to find a specific array, and then select the array to edit or delete it. Click **Add Array to Split** to add a new array. +- If you have already created arrays, click on the array's row in the table to edit or delete it. Use the search bar to find a specific array, and then select the array to edit or delete it. Click {{< ui >}}Add Array to Split{{< /ui >}} to add a new array. ### Add a new array 1. Define a filter query. Only logs that match the specified filter query are processed. All logs, regardless of whether they match the filter query, are sent to the next step in the pipeline. See [Search Syntax][1] for more information. 1. Enter the path to the array field. Use the path notation `.` to match subfields. See the [Path notation example](#path-notation-example-split-array) below. -1. Click **Save**. +1. Click {{< ui >}}Save{{< /ui >}}. ### Split array example diff --git a/content/en/observability_pipelines/processors/tag_control/logs.md b/content/en/observability_pipelines/processors/tag_control/logs.md index 8b1824fb614..cd23fb24bd9 100644 --- a/content/en/observability_pipelines/processors/tag_control/logs.md +++ b/content/en/observability_pipelines/processors/tag_control/logs.md @@ -17,8 +17,8 @@ For logs coming from the Datadog Agent, use this processor to exclude or include To set up the processor: 1. Define a filter query. Only matching logs are processed by this processor, but all logs continue to the next step in the pipeline. See [Search Syntax][2] for more information. -1. Optionally, input a Datadog tags array for the **Configure tags** section. The supported formats are `["key:value", "key"]`. See [Define Tags][1] for more information about the `key:value` format. -1. In the **Configure tags** section, choose whether to **Exclude tags** or **Include tags**. If you provided a tag array in the previous step, select the tag keys you want to configure. You can also manually add tag keys. **Note**: You can select up to 100 tags. +1. Optionally, input a Datadog tags array for the {{< ui >}}Configure tags{{< /ui >}} section. The supported formats are `["key:value", "key"]`. See [Define Tags][1] for more information about the `key:value` format. +1. In the {{< ui >}}Configure tags{{< /ui >}} section, choose whether to {{< ui >}}Exclude tags{{< /ui >}} or {{< ui >}}Include tags{{< /ui >}}. If you provided a tag array in the previous step, select the tag keys you want to configure. You can also manually add tag keys. **Note**: You can select up to 100 tags. [1]: /getting_started/tagging/#define-tags [2]: /observability_pipelines/search_syntax/logs/ diff --git a/content/en/observability_pipelines/processors/tag_control/metrics.md b/content/en/observability_pipelines/processors/tag_control/metrics.md index da5a9225edc..25195af2e23 100644 --- a/content/en/observability_pipelines/processors/tag_control/metrics.md +++ b/content/en/observability_pipelines/processors/tag_control/metrics.md @@ -24,25 +24,25 @@ The following tags can't be dropped because they provide specific platform funct To set up the processor: -Click **Add tag rule**. +Click {{< ui >}}Add tag rule{{< /ui >}}. - If you haven't added any rules yet, enter the rule details as described in the [Add a tag rule](#add-a-tag-rule) section to create a rule. - If you have already added rules, you can: - Click on a rule in the table to edit or delete it. - Use the search bar to find a specific rule by rule query, tag rule type, or tags applied and then select the metric to edit or delete it. - - Click **New Tag Rule** to add a rule. + - Click {{< ui >}}New Tag Rule{{< /ui >}} to add a rule. ### Add a tag rule {{< img src="observability_pipelines/processors/tag_control_settings.png" alt="The tag control settings panel" style="width:55%;" >}} 1. Define a filter query. Only matching metrics are processed by this processor, but all metrics continue to the next step in the pipeline. See [Search Syntax][2] for more information. -1. In the **Configure tags** section, choose whether to **Include tags** or **Exclude tags**. +1. In the {{< ui >}}Configure tags{{< /ui >}} section, choose whether to {{< ui >}}Include tags{{< /ui >}} or {{< ui >}}Exclude tags{{< /ui >}}. 1. Optionally, input a sample tags object to help you select the tags you want to include or exclude in the next step. - The supported input formats are `{"key1":"value1", "key2":"value2"}`. - See [Define Tags][1] for more information about the `key:value` format. 1. If you provided a tag array in the previous step, select the tag keys you want to configure in the dropdown menu. You can also manually add tag keys. - Note: You can select up to 15 tags. -1. Click **Save**. +1. Click {{< ui >}}Save{{< /ui >}}. [1]: /may/op-metrics-pipelines-components/getting_started/tagging/#define-tags [2]: /observability_pipelines/search_syntax/metrics/ \ No newline at end of file diff --git a/content/en/observability_pipelines/processors/throttle.md b/content/en/observability_pipelines/processors/throttle.md index ddba10e340b..845588a65d6 100644 --- a/content/en/observability_pipelines/processors/throttle.md +++ b/content/en/observability_pipelines/processors/throttle.md @@ -21,7 +21,7 @@ To set up the processor: 1. Define a filter query. Only logs that match the specified filter query are processed. All matched logs get throttled. Logs that are sent within the throttle limit and logs that do not match the filter are sent to the next step. Logs sent after the throttle limit has been reached, are dropped. See [Search Syntax][4] for more information. 1. Set the throttling rate. This is the number of events allowed for a given bucket during the set time window. **Note**: This rate limit is applied on a **per-worker level**. If you scale the number of workers up or down, you may want to adjust the processor rate limit accordingly. You can update the rate limit programmatically using the [Observability Pipelines API][1]. 1. Set the time window. -1. Optionally, click **Add Field** if you want to group by a field. +1. Optionally, click {{< ui >}}Add Field{{< /ui >}} if you want to group by a field. ## How the Throttle processor works @@ -41,7 +41,7 @@ The following table compares the Throttle processor with the Quota processor: {{< img src="observability_pipelines/processors/throttling_rate.png" alt="The Throttle processor with the throttling rate set to 1000 K" style="width:40%;" >}} -When the Throttle processor is enabled, the number of logs the processor allows through immediately is based on the configured **Throttling Rate**. For example, if the **Throttling Rate** is set to `1000` events over 60 seconds, and 5,000 events arrive the moment the processor is enabled: +When the Throttle processor is enabled, the number of logs the processor allows through immediately is based on the configured {{< ui >}}Throttling Rate{{< /ui >}}. For example, if the {{< ui >}}Throttling Rate{{< /ui >}} is set to `1000` events over 60 seconds, and 5,000 events arrive the moment the processor is enabled: - The processor allows an initial capacity of 1,000 events to pass through. - The remaining 4,000 events are dropped. diff --git a/content/en/observability_pipelines/sources/akamai_datastream.md b/content/en/observability_pipelines/sources/akamai_datastream.md index 83e12bf3e9f..24c5bb0fa54 100644 --- a/content/en/observability_pipelines/sources/akamai_datastream.md +++ b/content/en/observability_pipelines/sources/akamai_datastream.md @@ -31,9 +31,9 @@ The following are required to send Akamai DataStream logs to Observability Pipel 1. Select a log template to create a pipeline. 1. Select the HTTP Server source: 1. Select your authorization strategy. - 1. In the **Decoding** dropdown menu, select **Bytes**. -1. After you set up your destinations and processors, click **Next: Install**. -1. On the **Install** page, enter the HTTP/S Server listener address, such as `0.0.0.0:9997`. + 1. In the {{< ui >}}Decoding{{< /ui >}} dropdown menu, select {{< ui >}}Bytes{{< /ui >}}. +1. After you set up your destinations and processors, click {{< ui >}}Next: Install{{< /ui >}}. +1. On the {{< ui >}}Install{{< /ui >}} page, enter the HTTP/S Server listener address, such as `0.0.0.0:9997`. 1. Follow the rest of the instructions on the page to install the Worker based on your platform. ## Set up Akamai DataStream diff --git a/content/en/observability_pipelines/sources/amazon_data_firehose.md b/content/en/observability_pipelines/sources/amazon_data_firehose.md index bb65bb8e368..0ca9a024093 100644 --- a/content/en/observability_pipelines/sources/amazon_data_firehose.md +++ b/content/en/observability_pipelines/sources/amazon_data_firehose.md @@ -31,7 +31,7 @@ After you select the Amazon Data Firehose source in the pipeline UI, enter the i #### AWS authentication -Select an **AWS authentication** option. If you select **Assume role**: +Select an {{< ui >}}AWS authentication{{< /ui >}} option. If you select {{< ui >}}Assume role{{< /ui >}}: 1. Enter the ARN of the IAM role you want to assume. 1. Optionally, enter the assumed role session name and external ID. diff --git a/content/en/observability_pipelines/sources/amazon_s3.md b/content/en/observability_pipelines/sources/amazon_s3.md index fbf385a980d..22e45a92a83 100644 --- a/content/en/observability_pipelines/sources/amazon_s3.md +++ b/content/en/observability_pipelines/sources/amazon_s3.md @@ -34,7 +34,7 @@ After you select the Amazon S3 source in the pipeline UI: #### AWS authentication -Select an **AWS authentication** option. If you select **Assume role**: +Select an {{< ui >}}AWS authentication{{< /ui >}} option. If you select {{< ui >}}Assume role{{< /ui >}}: 1. Enter the ARN of the IAM role you want to assume. 1. Optionally, enter the assumed role session name and external ID. diff --git a/content/en/observability_pipelines/sources/azure_event_hubs.md b/content/en/observability_pipelines/sources/azure_event_hubs.md index 892e0809853..5b530cf1231 100644 --- a/content/en/observability_pipelines/sources/azure_event_hubs.md +++ b/content/en/observability_pipelines/sources/azure_event_hubs.md @@ -87,10 +87,10 @@ Select your platform. {{% tab "Kubernetes" %}} 1. Navigate to [Observability Pipelines](https://app.datadoghq.com/observability-pipelines). 1. Select the Kafka source. - 1. In the **Group ID** field, specify or create a unique consumer group (for example, `datadog-consumer-group`). - 1. In the **Topics** field, enter `datadog-topic` or the topic you configured for your Event Hub earlier. + 1. In the {{< ui >}}Group ID{{< /ui >}} field, specify or create a unique consumer group (for example, `datadog-consumer-group`). + 1. In the {{< ui >}}Topics{{< /ui >}} field, enter `datadog-topic` or the topic you configured for your Event Hub earlier. 1. Toggle the switch to enable SASL authentication. - 1. In the **Mechanism** dropdown menu, select **PLAIN**. + 1. In the {{< ui >}}Mechanism{{< /ui >}} dropdown menu, select {{< ui >}}PLAIN{{< /ui >}}. 1. Enable TLS. 1. Configure your `values.yaml` file to use the certificate that works as part of the container image: ``` @@ -113,15 +113,15 @@ Select your platform. ``` --set env[0].name=DD_OP_DATA_DIR,env[0].value='/config-volume/observability-pipelines-worker/' ``` - 1. In the **Certificate path** field, enter `/ca-certificates.crt` if you used the example above. Otherwise, enter the name of your certificate. + 1. In the {{< ui >}}Certificate path{{< /ui >}} field, enter `/ca-certificates.crt` if you used the example above. Otherwise, enter the name of your certificate. {{< img src="observability_pipelines/sources/kafka_settings.png" alt="The Kafka source settings with example values" style="width:45%;" >}} -1. Click **Next: Select Destination**. -1. After you set up your destinations and processors, click **Next: Install**. -1. Select your platform in the **Choose your installation platform** dropdown menu. +1. Click {{< ui >}}Next: Select Destination{{< /ui >}}. +1. After you set up your destinations and processors, click {{< ui >}}Next: Install{{< /ui >}}. +1. Select your platform in the {{< ui >}}Choose your installation platform{{< /ui >}} dropdown menu. 1. Enter the environment variables for your Kafka source: - 1. For **Kafka Bootstrap Servers**, enter `.servicebus.windows.net:9093` (for example, `myeventhubns.servicebus.windows.net:9093`). - 1. For **Kafka SASL Username**, enter `$$$$ConnectionString`. **Note**: You must have `$$$$` in front of `ConnectionString` because `$$$$` ends up being `$$` when transposed into the environment. - 1. For **Kafka SASL Password**, enter the full connection string. For example, `Endpoint=sb://.servicebus.windows.net/;SharedAccessKeyName=;SharedAccessKey=`. + 1. For {{< ui >}}Kafka Bootstrap Servers{{< /ui >}}, enter `.servicebus.windows.net:9093` (for example, `myeventhubns.servicebus.windows.net:9093`). + 1. For {{< ui >}}Kafka SASL Username{{< /ui >}}, enter `$$$$ConnectionString`. **Note**: You must have `$$$$` in front of `ConnectionString` because `$$$$` ends up being `$$` when transposed into the environment. + 1. For {{< ui >}}Kafka SASL Password{{< /ui >}}, enter the full connection string. For example, `Endpoint=sb://.servicebus.windows.net/;SharedAccessKeyName=;SharedAccessKey=`. - This is the **Primary Connection String** in your Event Hub instance [shared access policies](#configure-shared-access-policy). 1. Enter your Kafka TLS passphrase. - This is the **Primary Key** in your Event Hub instance's [shared access policies](#configure-shared-access-policy). @@ -133,10 +133,10 @@ Select your platform. 1. Navigate to [Observability Pipelines](https://app.datadoghq.com/observability-pipelines). 1. Select the Kafka source. - 1. In the **Group ID** field, specify or create a unique consumer group (for example, `datadog-consumer-group`). - 1. Enter `datadog-topic` in the **Topics** field. + 1. In the {{< ui >}}Group ID{{< /ui >}} field, specify or create a unique consumer group (for example, `datadog-consumer-group`). + 1. Enter `datadog-topic` in the {{< ui >}}Topics{{< /ui >}} field. 1. Toggle the switch to enable SASL authentication. - 1. In the **Mechanism** dropdown menu, select **PLAIN**. + 1. In the {{< ui >}}Mechanism{{< /ui >}} dropdown menu, select {{< ui >}}PLAIN{{< /ui >}}. 1. Enable TLS. For the certificate, copy the certificate from its original location to the default Observability Pipelines data configuration directory: 1. Since the Observability Pipelines Worker hasn't been installed yet, run this command to create the directory for the certificate: ``` @@ -146,15 +146,15 @@ Select your platform. ``` sudo cp /etc/ssl/certs/ca-certificates.crt /var/lib/observability-pipelines-worker/config/ ``` - 1. In the **Certificate path** field, enter `/ca-certificates.crt`. + 1. In the {{< ui >}}Certificate path{{< /ui >}} field, enter `/ca-certificates.crt`. {{< img src="observability_pipelines/sources/kafka_settings_vm.png" alt="The Kafka source settings with example values" style="width:45%;" >}} -1. Click **Next: Select Destination**. -1. After you set up your destinations and processors, click **Next: Install**. -1. Select your platform in the **Choose your installation platform** dropdown menu. +1. Click {{< ui >}}Next: Select Destination{{< /ui >}}. +1. After you set up your destinations and processors, click {{< ui >}}Next: Install{{< /ui >}}. +1. Select your platform in the {{< ui >}}Choose your installation platform{{< /ui >}} dropdown menu. 1. Enter the environment variables for your Kafka source: - 1. For **Kafka Bootstrap Servers**, enter `.servicebus.windows.net:9093` (for example, `myeventhubns.servicebus.windows.net:9093`). - 1. For **Kafka SASL Username**, enter `\$\$ConnectionString`. **Note**: You must escape the `$` in front of `ConnectionString`, otherwise the environment variable won't be loaded. - 1. For **Kafka SASL Password**, enter the full connection string wrapped in quotes (`"`). For example, `"Endpoint=sb://.servicebus.windows.net/;SharedAccessKeyName=;SharedAccessKey="`. + 1. For {{< ui >}}Kafka Bootstrap Servers{{< /ui >}}, enter `.servicebus.windows.net:9093` (for example, `myeventhubns.servicebus.windows.net:9093`). + 1. For {{< ui >}}Kafka SASL Username{{< /ui >}}, enter `\$\$ConnectionString`. **Note**: You must escape the `$` in front of `ConnectionString`, otherwise the environment variable won't be loaded. + 1. For {{< ui >}}Kafka SASL Password{{< /ui >}}, enter the full connection string wrapped in quotes (`"`). For example, `"Endpoint=sb://.servicebus.windows.net/;SharedAccessKeyName=;SharedAccessKey="`. - This is the **Primary Connection String** in your Event Hub instance [shared access policies](#configure-shared-access-policy). 1. Enter your Kafka TLS passphrase. - This is the **Primary Key** in your Event Hub instance's [shared access policies](#configure-shared-access-policy). diff --git a/content/en/observability_pipelines/sources/cloudflare_logpush.md b/content/en/observability_pipelines/sources/cloudflare_logpush.md index d64f7cb3315..d013453ceed 100644 --- a/content/en/observability_pipelines/sources/cloudflare_logpush.md +++ b/content/en/observability_pipelines/sources/cloudflare_logpush.md @@ -33,10 +33,10 @@ The following are required to send Cloudflare Logpush logs to Observability Pipe 1. Select a log template to create a pipeline. 1. Select the HTTP Server source. 1. If you are using Secrets Management, enter the identifier for the HTTP/S Server address key. See [Secret defaults][3] for the defaults used. -1. Select your authorization strategy. If you selected **Plain**: +1. Select your authorization strategy. If you selected {{< ui >}}Plain{{< /ui >}}: - Enter the identifiers for the HTTP/S Server username and password. See [Secret defaults][3] for the defaults used. -1. In the **Decoding** dropdown menu, select **Bytes**. -1. Toggle the switch to **Enable TLS**. +1. In the {{< ui >}}Decoding{{< /ui >}} dropdown menu, select {{< ui >}}Bytes{{< /ui >}}. +1. Toggle the switch to {{< ui >}}Enable TLS{{< /ui >}}. - If you are using Secrets Management, enter the identifier for the HTTP/S Server key pass. See [Secret defaults][3] for the defaults used. - The following certificate and key files are required. - `Server Certificate Path`: The path to the certificate file that has been signed by your Certificate Authority (CA) root file in DER, PEM, or CRT (X.509). @@ -54,11 +54,11 @@ The following are required to send Cloudflare Logpush logs to Observability Pipe sudo cp /path/to/your/ /var/lib/observability-pipelines-worker/config/ sudo cp /path/to/your/ /var/lib/observability-pipelines-worker/config/ ``` -1. After you set up your destinations and processors, click **Next: Install**. +1. After you set up your destinations and processors, click {{< ui >}}Next: Install{{< /ui >}}. ### Install the Worker -1. On the **Install** page, select your platform in the dropdown menu. +1. On the {{< ui >}}Install{{< /ui >}} page, select your platform in the dropdown menu. 1. Follow the instructions on the page to install the Worker based on your platform. See [Install the Worker][4] for details. 1. After installing the Worker, change ownership of the certificates so the Observability Pipelines Worker can read them: ```shell diff --git a/content/en/observability_pipelines/sources/http_client.md b/content/en/observability_pipelines/sources/http_client.md index b3b2f7ecfc1..8c67c731394 100644 --- a/content/en/observability_pipelines/sources/http_client.md +++ b/content/en/observability_pipelines/sources/http_client.md @@ -29,10 +29,10 @@ After you select the HTTP/S Client source in the pipeline UI: 1. Enter the identifier for your HTTP/S Client endpoint URL. If you leave it blank, the [default](#secret-defaults) is used. 1. Select your authorization strategy. If you selected: - - **Basic**: + - {{< ui >}}Basic{{< /ui >}}: - Enter the identifier for your HTTP/S Client username. If you leave it blank, the [default](#secret-defaults) is used. - Enter the identifier for your HTTP/S Client password. If you leave it blank, the [default](#secret-defaults) is used. - - **Bearer**: Enter the identifier for your bearer token. If you leave it blank, the [default](#secret-defaults) is used. + - {{< ui >}}Bearer{{< /ui >}}: Enter the identifier for your bearer token. If you leave it blank, the [default](#secret-defaults) is used. 1. Select the decoder you want to use on the HTTP messages. Logs pulled from the HTTP source must be in this format. ### Optional settings diff --git a/content/en/observability_pipelines/sources/http_server.md b/content/en/observability_pipelines/sources/http_server.md index 1fe7629f8d7..06e06d64a19 100644 --- a/content/en/observability_pipelines/sources/http_server.md +++ b/content/en/observability_pipelines/sources/http_server.md @@ -31,7 +31,7 @@ After you select the HTTP/S Server source in the pipeline UI: 1. Enter the identifier for your HTTP/S Server address. If you leave it blank, the [default](#secret-defaults) is used. - **Note**: Only enter the identifier for the address. Do **not** enter the actual address. -1. Select your authorization strategy. If you selected **Plain**: +1. Select your authorization strategy. If you selected {{< ui >}}Plain{{< /ui >}}: - Enter the identifiers for your HTTP/S Server username and password. If you leave it blank, the [default](#secret-defaults) is used. 1. Select the decoder you want to use on the HTTP messages. Your HTTP client logs must be in this format. **Note**: If you select `bytes` decoding, the raw log is stored in the `message` field. diff --git a/content/en/observability_pipelines/sources/kafka.md b/content/en/observability_pipelines/sources/kafka.md index 031d0d46a96..9fdf057ae8d 100644 --- a/content/en/observability_pipelines/sources/kafka.md +++ b/content/en/observability_pipelines/sources/kafka.md @@ -33,14 +33,14 @@ After you select the Kafka source in the pipeline UI: 1. Enter the identifier for your Kafka username. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the identifier for your Kafka password. If you leave it blank, the [default](#secret-defaults) is used. 1. Enter the group ID. -1. Enter the topic name. If there is more than one, click **Add Field** to add additional topics. +1. Enter the topic name. If there is more than one, click {{< ui >}}Add Field{{< /ui >}} to add additional topics. ### Optional settings #### Enable SASL Authentication -1. Toggle the switch to enable **SASL Authentication** -1. Select the mechanism (**PLAIN**, **SCHRAM-SHA-256**, or **SCHRAM-SHA-512**) in the dropdown menu. +1. Toggle the switch to enable {{< ui >}}SASL Authentication{{< /ui >}} +1. Select the mechanism ({{< ui >}}PLAIN{{< /ui >}}, {{< ui >}}SCHRAM-SHA-256{{< /ui >}}, or {{< ui >}}SCHRAM-SHA-512{{< /ui >}}) in the dropdown menu. #### Enable TLS @@ -48,11 +48,11 @@ After you select the Kafka source in the pipeline UI: #### Add additional librdkafka options -1. Click **Advanced** and then **Add Option**. +1. Click {{< ui >}}Advanced{{< /ui >}} and then {{< ui >}}Add Option{{< /ui >}}. 1. Select an option in the dropdown menu. 1. Enter a value for that option. 1. Check your values against the [librdkafka documentation][4] to make sure they have the correct type and are within the set range. -1. Click **Add Option** to add another librdkafka option. +1. Click {{< ui >}}Add Option{{< /ui >}} to add another librdkafka option. ## Secret defaults diff --git a/content/en/observability_pipelines/sources/lambda_extension.md b/content/en/observability_pipelines/sources/lambda_extension.md index 882f5527a27..0ee1033413d 100644 --- a/content/en/observability_pipelines/sources/lambda_extension.md +++ b/content/en/observability_pipelines/sources/lambda_extension.md @@ -17,7 +17,7 @@ See [Datadog Lambda Extension][1] to learn more about it. {{% observability_pipelines/lambda_forwarder/pipeline_setup %}} -**Note**: Your Observability Pipeline must use `HTTP Server` as the source to process logs from the Lambda extension. Do not use `Datadog Agent` as the source. +**Note**: Your Observability Pipeline must use {{< ui >}}HTTP Server{{< /ui >}} as the source to process logs from the Lambda extension. Do not use {{< ui >}}Datadog Agent{{< /ui >}} as the source. ## Deploy the Datadog Lambda Extension diff --git a/content/en/observability_pipelines/sources/mysql.md b/content/en/observability_pipelines/sources/mysql.md index 6995ee8e777..99c2a3715b0 100644 --- a/content/en/observability_pipelines/sources/mysql.md +++ b/content/en/observability_pipelines/sources/mysql.md @@ -110,7 +110,7 @@ Checkpoint values are updated every job run. To monitor the checkpoint value, th 1. To reset the checkpoint value in the MySQL source: 1. Navigate to [Observability Pipelines][1]. 1. Click on your pipeline and click. - 1. In the MySQL source, enter the destination's last checkpoint value in the **Checkpoint value** field. + 1. In the MySQL source, enter the destination's last checkpoint value in the {{< ui >}}Checkpoint value{{< /ui >}} field. #### External tools for validating queries @@ -148,8 +148,8 @@ After you select the MySQL source in the pipeline UI: 1. Enter the name of your query. 1. Enter the path to the local file containing the validated SQL query. - **Note**: All file paths are made relative to the configuration data directory. For example, if the SQL file path is `/var/lib/observability-pipelines-worker/config/config/db_queries/query.sql`, enter the path `/db_queries/query.sql`. -5. Select your query type (**Batch** or **Incremental**). See [Query types](#query-types) for more information. - - For **Incremental**: +5. Select your query type ({{< ui >}}Batch{{< /ui >}} or {{< ui >}}Incremental{{< /ui >}}). See [Query types](#query-types) for more information. + - For {{< ui >}}Incremental{{< /ui >}}: 1. Define the [incremental column](#incremental-columns). 1. Set the starting [checkpoint value](#checkpoint-values). 6. Define your query scheduling using cron syntax. These are cron syntax examples for different query schedules: diff --git a/content/en/observability_pipelines/sources/okta.md b/content/en/observability_pipelines/sources/okta.md index 6c7985a14dc..06977082847 100644 --- a/content/en/observability_pipelines/sources/okta.md +++ b/content/en/observability_pipelines/sources/okta.md @@ -29,15 +29,15 @@ The following are required to send Okta logs to Observability Pipelines using Am 1. Select a log template to create a pipeline. 1. Select the HTTP Server source. 1. If you are using Secrets Management, enter the identifier for the HTTP/S Server address key. See [Secret defaults][2] for the defaults used. -1. Select your authorization strategy. If you selected **Plain**: +1. Select your authorization strategy. If you selected {{< ui >}}Plain{{< /ui >}}: - Enter the identifiers for the HTTP/S Server username and password. See [Secret defaults][2] for the defaults used. -1. In the **Decoding** dropdown menu, select **Bytes**. -1. Toggle the switch to **Enable TLS**. +1. In the {{< ui >}}Decoding{{< /ui >}} dropdown menu, select {{< ui >}}Bytes{{< /ui >}}. +1. Toggle the switch to {{< ui >}}Enable TLS{{< /ui >}}. - If you are using Secrets Management, enter the identifier for the HTTP/S Server key pass. See [Secret defaults][2] for the defaults used. - The following certificate and key files are required. - - `Server Certificate Path`: The path to the certificate file that has been signed by your Certificate Authority (CA) root file in DER, PEM, or CRT (X.509). - - `CA Certificate Path`: The path to the certificate file that is your Certificate Authority (CA) root file in DER, PEM, or CERT (X.509). - - `Private Key Path`: The path to the `.key` private key file that belongs to your Server Certificate Path in DER, PEM, or CERT (PKCS #8) format. + - {{< ui >}}Server Certificate Path{{< /ui >}}: The path to the certificate file that has been signed by your Certificate Authority (CA) root file in DER, PEM, or CRT (X.509). + - {{< ui >}}CA Certificate Path{{< /ui >}}: The path to the certificate file that is your Certificate Authority (CA) root file in DER, PEM, or CERT (X.509). + - {{< ui >}}Private Key Path{{< /ui >}}: The path to the `.key` private key file that belongs to your Server Certificate Path in DER, PEM, or CERT (PKCS #8) format. - **Notes**: - The configuration data directory `/var/lib/observability-pipelines-worker/config/` is automatically appended to the file paths. See [Advanced Worker Configurations][5] for more information. - The file must be readable by the `observability-pipelines-worker` group and user. @@ -50,11 +50,11 @@ The following are required to send Okta logs to Observability Pipelines using Am sudo cp /path/to/your/ /var/lib/observability-pipelines-worker/config/ sudo cp /path/to/your/ /var/lib/observability-pipelines-worker/config/ ``` -1. After you set up your destinations and processors, click **Next: Install**. +1. After you set up your destinations and processors, click {{< ui >}}Next: Install{{< /ui >}}. ### Install the Worker -1. On the **Install** page, select your platform in the dropdown menu. +1. On the {{< ui >}}Install{{< /ui >}} page, select your platform in the dropdown menu. 1. Follow the instructions on the page to install the Worker based on your platform. See [Install the Worker][3] for details. 1. After installing the Worker, change ownership of the certificates so the Observability Pipelines Worker can read them: ```shell diff --git a/content/en/observability_pipelines/sources/socket.md b/content/en/observability_pipelines/sources/socket.md index 1a77d41b273..01f82e4edc8 100644 --- a/content/en/observability_pipelines/sources/socket.md +++ b/content/en/observability_pipelines/sources/socket.md @@ -28,8 +28,8 @@ Set up this source when you [set up a pipeline][1]. You can set up a pipeline in After you select the Socket source in the pipeline UI: 1. Enter the identifier for your socket address. If you leave it blank, the [default](#secret-defaults) is used. -1. In the **Mode** dropdown menu, select the socket type to use. -1. In the **Framing** dropdown menu, select how to delimit the stream of events. +1. In the {{< ui >}}Mode{{< /ui >}} dropdown menu, select the socket type to use. +1. In the {{< ui >}}Framing{{< /ui >}} dropdown menu, select how to delimit the stream of events. diff --git a/content/en/observability_pipelines/sources/splunk_hec.md b/content/en/observability_pipelines/sources/splunk_hec.md index 73d6cc19bfe..b63fe39c938 100644 --- a/content/en/observability_pipelines/sources/splunk_hec.md +++ b/content/en/observability_pipelines/sources/splunk_hec.md @@ -36,8 +36,8 @@ Set up this source when you [set up a pipeline][1]. You can set up a pipeline in After you select the Splunk HEC source in the pipeline UI: 1. Enter the identifier for your Splunk HEC address. If you leave it blank, the [default](#secret-defaults) is used. -1. Only enable **Store HEC token** if you want to do one of the following: - - Use a Splunk HEC destination with the **From Source** token strategy. +1. Only enable {{< ui >}}Store HEC token{{< /ui >}} if you want to do one of the following: + - Use a Splunk HEC destination with the {{< ui >}}From Source{{< /ui >}} token strategy. - Use an Enrichment Table processor to map Splunk HEC tokens from a local file. ### Optional TLS settings diff --git a/content/en/observability_pipelines/sources/sumo_logic.md b/content/en/observability_pipelines/sources/sumo_logic.md index 3bf48af0cb4..2ad3817e416 100644 --- a/content/en/observability_pipelines/sources/sumo_logic.md +++ b/content/en/observability_pipelines/sources/sumo_logic.md @@ -29,7 +29,7 @@ After you select the Sumo Logic source in the pipeline UI, enter the identifier ### Optional settings -In the **Decoding** dropdown menu, select whether your input format is raw **Bytes**, **JSON**, Graylog Extended Log Format (**Gelf**), or **Syslog**. If no decoding is selected, the decoding defaults to JSON. +In the {{< ui >}}Decoding{{< /ui >}} dropdown menu, select whether your input format is raw {{< ui >}}Bytes{{< /ui >}}, {{< ui >}}JSON{{< /ui >}}, Graylog Extended Log Format ({{< ui >}}Gelf{{< /ui >}}), or {{< ui >}}Syslog{{< /ui >}}. If no decoding is selected, the decoding defaults to JSON. ## Secret defaults diff --git a/content/en/observability_pipelines/sources/syslog.md b/content/en/observability_pipelines/sources/syslog.md index 350467ff963..963b129344d 100644 --- a/content/en/observability_pipelines/sources/syslog.md +++ b/content/en/observability_pipelines/sources/syslog.md @@ -30,7 +30,7 @@ Set up this source when you [set up a pipeline][1]. You can set up a pipeline in After you select the Syslog source in the pipeline UI: 1. Enter the identifier for your syslog address. If you leave it blank, the [default](#secret-defaults) is used. -1. In the **Socket Type** dropdown menu, select the communication protocol you want to use: **TCP** or **UDP**. +1. In the {{< ui >}}Socket Type{{< /ui >}} dropdown menu, select the communication protocol you want to use: {{< ui >}}TCP{{< /ui >}} or {{< ui >}}UDP{{< /ui >}}. ### Optional TLS settings diff --git a/content/en/opentelemetry/correlate/dbm_and_traces.md b/content/en/opentelemetry/correlate/dbm_and_traces.md index 3658606e565..bd00ca38c08 100644 --- a/content/en/opentelemetry/correlate/dbm_and_traces.md +++ b/content/en/opentelemetry/correlate/dbm_and_traces.md @@ -146,10 +146,10 @@ In your Datadog Agent configuration, ensure the `DD_APM_FEATURES` environment va After your application is sending traces, you can see the correlation in the APM Trace View: -1. Navigate to [**APM** > **Traces**][3]. +1. Navigate to [{{< ui >}}APM{{< /ui >}} > {{< ui >}}Traces{{< /ui >}}][3]. 2. Find and click on a trace from your instrumented service. 3. In the trace's flame graph, select a database span (for example, a span with `span.type: sql`) -4. In the details panel, click the **SQL Queries** tab. You should see performance metrics and execution plans for the query. +4. In the details panel, click the {{< ui >}}SQL Queries{{< /ui >}} tab. You should see performance metrics and execution plans for the query. ## Troubleshooting diff --git a/content/en/opentelemetry/correlate/metrics_and_traces.md b/content/en/opentelemetry/correlate/metrics_and_traces.md index ffc92741886..1e9a50025aa 100644 --- a/content/en/opentelemetry/correlate/metrics_and_traces.md +++ b/content/en/opentelemetry/correlate/metrics_and_traces.md @@ -63,10 +63,10 @@ For correlation to work, the `host.name` (or `container.id`) attribute on your t After your application is sending traces and the Collector is sending host metrics, you can see the correlation in the APM Trace View. -1. Navigate to [**APM** > **Traces**][3]. +1. Navigate to [{{< ui >}}APM{{< /ui >}} > {{< ui >}}Traces{{< /ui >}}][3]. 2. Find and click on a trace from your instrumented service. 3. In the trace's flame graph, select a span that ran on the instrumented host. -4. In the details panel, click the **Infrastructure** tab. You should see the host metrics, like CPU and memory utilization, from the host that executed that part of the request. +4. In the details panel, click the {{< ui >}}Infrastructure{{< /ui >}} tab. You should see the host metrics, like CPU and memory utilization, from the host that executed that part of the request. This allows you to immediately determine if a spike in host metrics corresponds with the performance of a specific request. diff --git a/content/en/opentelemetry/getting_started/otel_demo_to_datadog.md b/content/en/opentelemetry/getting_started/otel_demo_to_datadog.md index 9d75135bf00..2b0215a48e5 100644 --- a/content/en/opentelemetry/getting_started/otel_demo_to_datadog.md +++ b/content/en/opentelemetry/getting_started/otel_demo_to_datadog.md @@ -320,15 +320,15 @@ After a couple of seconds you can see data arriving in Datadog. View all services that are part of the OTel Demo: -1. Go to [**APM** > **Catalog**][11]. +1. Go to [{{< ui >}}APM{{< /ui >}} > {{< ui >}}Catalog{{< /ui >}}][11]. {{< img src="/getting_started/opentelemetry/otel_demo/software_catalog.png" alt="View Catalog page with list of services from OpenTelemetry demo application" style="width:90%;" >}} -2. Select **Map** to see how the services are connected. Change the **Map layout** to **Cluster** or **Flow** to view the map in different modes. +2. Select {{< ui >}}Map{{< /ui >}} to see how the services are connected. Change the {{< ui >}}Map layout{{< /ui >}} to {{< ui >}}Cluster{{< /ui >}} or {{< ui >}}Flow{{< /ui >}} to view the map in different modes. {{< img src="/getting_started/opentelemetry/otel_demo/software_catalog_flow.png" alt="View Service Map Flow with all services connected" style="width:90%;" >}} -3. Select the **Catalog** view, then select a service to view a performance summary in the side panel. +3. Select the {{< ui >}}Catalog{{< /ui >}} view, then select a service to view a performance summary in the side panel. {{< img src="/getting_started/opentelemetry/otel_demo/software_catalog_service.png" alt="View summary of performance and setup guidance from specific service" style="width:90%;" >}} @@ -336,7 +336,7 @@ View all services that are part of the OTel Demo: Explore traces received from the OTel Demo: -1. From **Performance** > **Setup Guidance**, click **View Traces** to open the Trace Explorer, with the selected service applied as a filter. +1. From {{< ui >}}Performance{{< /ui >}} > {{< ui >}}Setup Guidance{{< /ui >}}, click {{< ui >}}View Traces{{< /ui >}} to open the Trace Explorer, with the selected service applied as a filter. {{< img src="/getting_started/opentelemetry/otel_demo/traces_view.png" alt="Traces view with all indexed spans for checkout service" style="width:90%;" >}} @@ -356,9 +356,9 @@ Datadog allows you to filter and group the received OpenTelemetry data. For exam The OTel Demo sends `user.id` as span tags, so you can use this to filter all transactions triggered by the user: -1. From **Info** in the side panel, hover over the line with the user ID, click the **cog** icon, and select **filter by @app.user.id:**. +1. From {{< ui >}}Info{{< /ui >}} in the side panel, hover over the line with the user ID, click the {{< ui >}}cog{{< /ui >}} icon, and select {{< ui >}}filter by @app.user.id:{{< /ui >}}. -2. Remove any previous filters, leaving only **@app.user.id** applied to view all transactions containing spans with the specified user ID. +2. Remove any previous filters, leaving only {{< ui >}}@app.user.id{{< /ui >}} applied to view all transactions containing spans with the specified user ID. {{< img src="/getting_started/opentelemetry/otel_demo/trace_query.png" alt="Trace query filtering all spans that contain a specific app.user.id" style="width:90%;" >}} diff --git a/content/en/opentelemetry/guide/instrument_unsupported_runtimes.md b/content/en/opentelemetry/guide/instrument_unsupported_runtimes.md index d7a837c0f67..8907be1a7e9 100644 --- a/content/en/opentelemetry/guide/instrument_unsupported_runtimes.md +++ b/content/en/opentelemetry/guide/instrument_unsupported_runtimes.md @@ -163,7 +163,7 @@ For more manual instrumentation patterns, see the [OpenTelemetry JS instrumentat After your application handles a few requests: -1. Go to [**APM** > **Traces**][6] in Datadog. +1. Go to [{{< ui >}}APM{{< /ui >}} > {{< ui >}}Traces{{< /ui >}}][6] in Datadog. 2. Search for your service name. 3. Confirm that traces appear with the expected spans and metadata. diff --git a/content/en/opentelemetry/integrations/datadog_extension.md b/content/en/opentelemetry/integrations/datadog_extension.md index 8fc47cc2a39..1621ad7b6c9 100644 --- a/content/en/opentelemetry/integrations/datadog_extension.md +++ b/content/en/opentelemetry/integrations/datadog_extension.md @@ -271,7 +271,7 @@ The DaemonSet forwards to `monitoring/otelcol-gateway-l2`, the Layer-2 gateway f | `hostname` | Custom hostname for the Collector. | Auto-detected | | `http.endpoint` | Local HTTP server endpoint. | `localhost:9875` | | `http.path` | HTTP server path for metadata. | `/metadata` | -| `deployment_type` | Identifies how the Collector is deployed. This value appears in [Fleet Automation][7] and is required for [gateway topology](#5-optional-configure-gateway-topology-preview). One of: `gateway`, `daemonset`, or `unknown`. | `unknown` | +| `deployment_type` | Identifies how the Collector is deployed. This value appears in [Fleet Automation][7] and is required for [gateway topology](#5-optional-configure-gateway-topology-preview). One of: `gateway`, `daemonset`, or `unknown`. The default `unknown` means the deployment type was not set. | `unknown` | | `installation_method` | How the Collector was installed. One of: `kubernetes`, `bare-metal`, `docker`, `ecs-fargate`, `eks-fargate`, or unset. Available in Collector v0.148.0 and later. | unset | | `gateway_service` | Set on **gateway** Collectors only. The Kubernetes Service fronting the gateway Collector pods. Format: `service` or `namespace/service`. Available in Collector v0.150.0 and later. | - | | `gateway_destination` | Set on any Collector that forwards telemetry to a downstream gateway. The Kubernetes Service that this Collector forwards telemetry to. Must match `gateway_service` on the receiving gateway Collector. Format: `service` or `namespace/service`. Available in Collector v0.150.0 and later. | - | @@ -326,25 +326,25 @@ service: Once configured, you can view your OpenTelemetry Collector configuration and build information in various locations: ### Fleet Automation -1. Navigate to **[Integrations > Fleet Automation][7]**. +1. Navigate to [{{< ui >}}Integrations{{< /ui >}} > {{< ui >}}Fleet Automation{{< /ui >}}][7]. 2. Filter for OTel Collector hosts using the Collector facets, then click a host. -3. In the side panel, select the **Info** tab to view build information. -4. Select the **Configurations** tab to view the full YAML file or a pipeline visualization of your OTel Collector configurations. +3. In the side panel, select the {{< ui >}}Info{{< /ui >}} tab to view build information. +4. Select the {{< ui >}}Configurations{{< /ui >}} tab to view the full YAML file or a pipeline visualization of your OTel Collector configurations. {{< img src="/agent/fleet_automation/fleet-automation-yaml-view.png" alt="View OTel Collector configuration YAMLs in Fleet Automation" style="width:100%;" >}} ### Infrastructure List (Host List) -1. Navigate to **[Infrastructure > Hosts][2]** in your Datadog account. +1. Navigate to [{{< ui >}}Infrastructure{{< /ui >}} > {{< ui >}}Hosts{{< /ui >}}][2] in your Datadog account. 2. Click on any host running the OpenTelemetry Collector (**Note**: Filter by `field:apps:otel` to only show Collector instances). -3. In the host details panel, select the **OTel Collector** tab to see build info and full Collector configuration. +3. In the host details panel, select the {{< ui >}}OTel Collector{{< /ui >}} tab to see build info and full Collector configuration. ### Resource Catalog -1. Navigate to **[Infrastructure > Resource Catalog][3]** in your Datadog account +1. Navigate to [{{< ui >}}Infrastructure{{< /ui >}} > {{< ui >}}Resource Catalog{{< /ui >}}][3] in your Datadog account 2. Filter for hosts or search for your Collector instances. 3. Click on any host running the OpenTelemetry Collector. -4. Scroll down to **Collector** to see build info and full Collector configuration. +4. Scroll down to {{< ui >}}Collector{{< /ui >}} to see build info and full Collector configuration. ## Local HTTP server diff --git a/content/en/opentelemetry/integrations/podman_metrics.md b/content/en/opentelemetry/integrations/podman_metrics.md index 6ee73b73143..0c17e5f27b2 100644 --- a/content/en/opentelemetry/integrations/podman_metrics.md +++ b/content/en/opentelemetry/integrations/podman_metrics.md @@ -12,7 +12,7 @@ further_reading: The [Podman receiver][1] collects metrics that populate the [Containers - Overview][5] dashboard. Configure the receiver according to the specifications of the latest version of the `podmanreceiver`. -This dashboard displays metrics from all container runtimes. To view your Podman data, use the **runtime** template variable at the top of the dashboard to select `podman`. +This dashboard displays metrics from all container runtimes. To view your Podman data, use the {{< ui >}}runtime{{< /ui >}} template variable at the top of the dashboard to select `podman`. For more information, see the OpenTelemetry project documentation for the [Podman receiver][1]. diff --git a/content/en/opentelemetry/migrate/ddot_collector.md b/content/en/opentelemetry/migrate/ddot_collector.md index cfadfbce435..14077c53081 100644 --- a/content/en/opentelemetry/migrate/ddot_collector.md +++ b/content/en/opentelemetry/migrate/ddot_collector.md @@ -245,8 +245,8 @@ datadog: -f datadog-values.yaml \ --set-file datadog.otelCollector.config=collector-config.yaml ``` -1. Navigate to **Integrations** > **Fleet Automation**. -1. Select the **OTel Collector Version** facet. +1. Navigate to {{< ui >}}Integrations{{< /ui >}} > {{< ui >}}Fleet Automation{{< /ui >}}. +1. Select the {{< ui >}}OTel Collector Version{{< /ui >}} facet. 1. Select an Agent and inspect its configuration to verify the new Agent with OpenTelemetry Collector is installed successfully. ## Configure your application diff --git a/content/en/opentelemetry/reference/otel_metrics.md b/content/en/opentelemetry/reference/otel_metrics.md index d2537d89562..e64fad69d5e 100644 --- a/content/en/opentelemetry/reference/otel_metrics.md +++ b/content/en/opentelemetry/reference/otel_metrics.md @@ -38,11 +38,11 @@ For more information, read [Query Across Datadog and OpenTelemetry Metrics][14] ## Out-of-the-box dashboards -Datadog provides out-of-the-box dashboards that you can copy and customize. To use Datadog's out-of-the-box OpenTelemetry dashboards, go to **Dashboards** > **Dashboards list** and search for `opentelemetry`: +Datadog provides out-of-the-box dashboards that you can copy and customize. To use Datadog's out-of-the-box OpenTelemetry dashboards, go to {{< ui >}}Dashboards{{< /ui >}} > {{< ui >}}Dashboards list{{< /ui >}} and search for `opentelemetry`: {{< img src="metrics/otel/dashboard.png" alt="The Dashboards list, showing two OpenTelemetry out-of-the-box dashboards: Host Metrics and Collector Metrics." style="width:80%;">}} -The **Host Metrics** dashboard is for data collected from the [host metrics receiver][8]. The **Collector Metrics** dashboard is for any other types of metrics collected, depending on which [metrics receiver][9] you choose to enable. +The {{< ui >}}Host Metrics{{< /ui >}} dashboard is for data collected from the [host metrics receiver][8]. The {{< ui >}}Collector Metrics{{< /ui >}} dashboard is for any other types of metrics collected, depending on which [metrics receiver][9] you choose to enable. ## Further reading diff --git a/content/en/opentelemetry/setup/collector_exporter/oss_setup.md b/content/en/opentelemetry/setup/collector_exporter/oss_setup.md index d5836bc70fb..0c1b926940f 100644 --- a/content/en/opentelemetry/setup/collector_exporter/oss_setup.md +++ b/content/en/opentelemetry/setup/collector_exporter/oss_setup.md @@ -741,10 +741,10 @@ Apply [Unified Service Tagging][4] by setting the `service.name`, `deployment.en After your application sends telemetry to the Collector, verify that data appears in Datadog: -1. In Datadog, go to **APM > Services** and confirm that your `service.name` appears. -2. Open **APM > Traces** and search for your service. -3. Go to **Infrastructure > Host Map** and confirm that the host running the Collector appears. -4. If you send logs through OTLP, go to **Logs Explorer** and search for your service name. +1. In Datadog, go to {{< ui >}}APM{{< /ui >}} > {{< ui >}}Services{{< /ui >}} and confirm that your `service.name` appears. +2. Open {{< ui >}}APM{{< /ui >}} > {{< ui >}}Traces{{< /ui >}} and search for your service. +3. Go to {{< ui >}}Infrastructure{{< /ui >}} > {{< ui >}}Host Map{{< /ui >}} and confirm that the host running the Collector appears. +4. If you send logs through OTLP, go to {{< ui >}}Logs Explorer{{< /ui >}} and search for your service name. ## Key components diff --git a/content/en/opentelemetry/setup/ddot_collector/install/ecs_fargate.md b/content/en/opentelemetry/setup/ddot_collector/install/ecs_fargate.md index c97ea923472..f1f58877c50 100644 --- a/content/en/opentelemetry/setup/ddot_collector/install/ecs_fargate.md +++ b/content/en/opentelemetry/setup/ddot_collector/install/ecs_fargate.md @@ -142,7 +142,7 @@ Use the following task definition as a starting point: Replace the following placeholders: - ``: A name for your ECS task definition family. - ``: The ARN of the AWS Secrets Manager secret or SSM Parameter Store parameter that contains your Datadog API key. The task execution role must have `secretsmanager:GetSecretValue` (Secrets Manager) or `ssm:GetParameters` (SSM) permission to retrieve the secret. -- ``: Your [Datadog site][4]. Your site is {{< region-param key="dd_site" code="true" >}}. (Ensure the correct **DATADOG SITE** is selected on the right.) +- ``: Your [Datadog site][4]. Your site is {{< region-param key="dd_site" code="true" >}}. (Ensure the correct {{< ui >}}DATADOG SITE{{< /ui >}} is selected on the right.) - ``: The AWS region where your ECS tasks run (for example, `us-east-1`). - ``: The name of your application container. - ``: Your application container image. diff --git a/content/en/opentelemetry/setup/ddot_collector/install/eks_fargate.md b/content/en/opentelemetry/setup/ddot_collector/install/eks_fargate.md index aacf6fb813b..ebe30cd78ed 100644 --- a/content/en/opentelemetry/setup/ddot_collector/install/eks_fargate.md +++ b/content/en/opentelemetry/setup/ddot_collector/install/eks_fargate.md @@ -107,7 +107,7 @@ Replace the following placeholders: - ``: Your application container image. - ``: The version of your service. - ``: Your deployment environment (for example, `production`). -- ``: Your [Datadog site][5]. Your site is {{< region-param key="dd_site" code="true" >}}. (Ensure the correct **DATADOG SITE** is selected on the right.) +- ``: Your [Datadog site][5]. Your site is {{< region-param key="dd_site" code="true" >}}. (Ensure the correct {{< ui >}}DATADOG SITE{{< /ui >}} is selected on the right.) ### Configure EKS resource detection diff --git a/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_daemonset.md b/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_daemonset.md index ae1760b5336..4e41714f8d6 100644 --- a/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_daemonset.md +++ b/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_daemonset.md @@ -109,7 +109,7 @@ After deploying the Datadog Operator, create the `DatadogAgent` resource that tr {{< /code-block >}} - Replace `` with a name for your cluster. - - Replace `` with your [Datadog site][1]. Your site is {{< region-param key="dd_site" code="true" >}}. (Ensure the correct **DATADOG SITE** is selected on the right.) + - Replace `` with your [Datadog site][1]. Your site is {{< region-param key="dd_site" code="true" >}}. (Ensure the correct {{< ui >}}DATADOG SITE{{< /ui >}} is selected on the right.) {{% site-region region="gov,gov2" %}}
For FED, also set useFIPSAgent: true under spec.global to use the FIPS-compliant Agent image. See FIPS compliance.
diff --git a/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_gateway.md b/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_gateway.md index 0a2080c8d91..889d0fb7014 100644 --- a/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_gateway.md +++ b/content/en/opentelemetry/setup/ddot_collector/install/kubernetes_gateway.md @@ -1345,7 +1345,7 @@ The DDOT Collector gateway includes the [Datadog extension][11] by default. This To view your gateway pods: -1. Navigate to **Integrations > Fleet Automation**. +1. Navigate to {{< ui >}}Integrations{{< /ui >}} > {{< ui >}}Fleet Automation{{< /ui >}}. {{< img src="opentelemetry/embedded_collector/fleet_automation2.png" alt="Fleet Automation page showing DDOT gateway pods" style="width:100%;" >}} diff --git a/content/en/opentelemetry/setup/ddot_collector/install/linux.md b/content/en/opentelemetry/setup/ddot_collector/install/linux.md index 8656d937f9f..6028871e23c 100644 --- a/content/en/opentelemetry/setup/ddot_collector/install/linux.md +++ b/content/en/opentelemetry/setup/ddot_collector/install/linux.md @@ -73,7 +73,7 @@ Agent (v7.x.x) Log Level: info ``` -There will also be an **OTel Agent** status section that includes OpenTelemetry information: +There will also be an {{< ui >}}OTel Agent{{< /ui >}} status section that includes OpenTelemetry information: ```text ========== diff --git a/content/en/opentelemetry/setup/ddot_collector/install/windows.md b/content/en/opentelemetry/setup/ddot_collector/install/windows.md index c4f5801ac6f..1c74d87ccc4 100644 --- a/content/en/opentelemetry/setup/ddot_collector/install/windows.md +++ b/content/en/opentelemetry/setup/ddot_collector/install/windows.md @@ -75,7 +75,7 @@ Agent (v7.x.x) Log Level: info ``` -There will also be an **OTel Agent** status section that includes OpenTelemetry information: +There will also be an {{< ui >}}OTel Agent{{< /ui >}} status section that includes OpenTelemetry information: ```text ========== diff --git a/content/en/product_analytics/_index.md b/content/en/product_analytics/_index.md index 09fa10ab687..5c5ffad0108 100644 --- a/content/en/product_analytics/_index.md +++ b/content/en/product_analytics/_index.md @@ -58,7 +58,7 @@ To set up your application with a coding assistant, see [Agentic onboarding][17] ### Track server-side events (API) -After you set up client-side collection, you can use the [Product Analytics API][21] to send custom events from your server, such as completed checkouts or processed payments. +After you set up client-side collection, you can use the [Product Analytics API][21] to send custom events from your server, such as completed checkouts or processed payments. For more information, see [Track Server-Side Events][22].
Datadog bills server-side events separately. See the pricing page for details, and contact your Customer Success Manager with additional questions.
@@ -177,3 +177,4 @@ Use the following features to inform your product change decisions, such as chan [19]: /real_user_monitoring/guide/understanding-the-rum-event-hierarchy [20]: https://app.datadoghq.com/rum/sessions?query=%40type%3Aaction [21]: /api/latest/product-analytics/#send-server-side-events +[22]: /product_analytics/data_collected/server_side_events/ diff --git a/content/en/product_analytics/data_collected.md b/content/en/product_analytics/data_collected/_index.md similarity index 98% rename from content/en/product_analytics/data_collected.md rename to content/en/product_analytics/data_collected/_index.md index 3d235455a4d..b02f2ae2c41 100644 --- a/content/en/product_analytics/data_collected.md +++ b/content/en/product_analytics/data_collected/_index.md @@ -11,6 +11,9 @@ further_reading: - link: "/real_user_monitoring/application_monitoring/android/data_collected/" tag: "Documentation" text: "RUM Android Data Collected" +- link: "/product_analytics/data_collected/server_side_events/" + tag: "Documentation" + text: "Track Server-Side Events" --- ## Overview diff --git a/content/en/product_analytics/data_collected/server_side_events.md b/content/en/product_analytics/data_collected/server_side_events.md new file mode 100644 index 00000000000..6df0b0ab034 --- /dev/null +++ b/content/en/product_analytics/data_collected/server_side_events.md @@ -0,0 +1,48 @@ +--- +title: Track Server-Side Events +description: Send custom events from your server to supplement client-side data in Product Analytics. +further_reading: +- link: "/api/latest/product-analytics/#send-server-side-events" + tag: "API Reference" + text: "Product Analytics API" +- link: "/product_analytics/" + tag: "Documentation" + text: "Product Analytics" +- link: "/product_analytics/data_collected/" + tag: "Documentation" + text: "Product Analytics Data Collected" +--- + +## Overview + +Server-side events are custom events sent through the [Product Analytics API][1] from your server. Unlike client-side events captured by the RUM SDK, such as pageviews or button clicks, server-side events track actions that occur in your backend, such as a completed checkout or processed payment. + +Use server-side events to: + +- Capture events at the source of truth on the server, independent of client-side behavior +- Track backend actions with no client-side equivalent, such as a payment confirmation or subscription renewal +- Supplement client-side data with server-side context + +
Datadog bills server-side events separately. See the pricing page for details, and contact your Customer Success Manager with additional questions.
+ +## Prerequisites + +Before sending server-side events, [set up the Datadog SDK][2] for your application and [enable Product Analytics][3]. + +## Send server-side events + +Use the [Product Analytics API][1] to send events from your server. To associate a server-side event with a client session, include the `session_id` from the client's active RUM session. Including the session ID links server-side events to client-side data for a complete view of the user journey. + +For the full API reference, including authentication, required fields, and request parameters, see [Send server-side events][1]. + +## Analyze server-side events + +After you send server-side events, they are available in any Product Analytics chart. In the event picker, select **Server Events** to scope your analysis to server-side data. + +## Further reading + +{{< partial name="whats-next/whats-next.html" >}} + +[1]: /api/latest/product-analytics/#send-server-side-events +[2]: /product_analytics/#track-client-side-events-sdk +[3]: /product_analytics/#enable-product-analytics diff --git a/content/en/product_analytics/guide/_index.md b/content/en/product_analytics/guide/_index.md index 8034fda439c..ebf493d9346 100644 --- a/content/en/product_analytics/guide/_index.md +++ b/content/en/product_analytics/guide/_index.md @@ -11,6 +11,7 @@ cascade: {{< whatsnext desc="General Product Analytics:" >}} {{< nextlink href="product_analytics/guide/rum_and_product_analytics" >}}Understanding RUM and Product Analytics{{< /nextlink >}} + {{< nextlink href="product_analytics/data_collected/server_side_events" >}}Track server-side events{{< /nextlink >}} {{< nextlink href="session_replay/guide/diagnose-funnel-drop-offs-with-session-replay" >}}Diagnose funnel drop-offs with Session Replay{{< /nextlink >}} {{< nextlink href="product_analytics/guide/monitor-utm-campaigns-in-product-analytics" >}}Monitor UTM Campaigns{{< /nextlink >}} diff --git a/content/en/security/application_security/setup/dotnet/_index.md b/content/en/security/application_security/setup/dotnet/_index.md index d5be300224c..94ef770df76 100644 --- a/content/en/security/application_security/setup/dotnet/_index.md +++ b/content/en/security/application_security/setup/dotnet/_index.md @@ -10,6 +10,7 @@ aliases: - /security/application_security/threats_detection/dotnet - /security/application_security/setup/threat_detection/dotnet - /security/application_security/enabling/dotnet + - /security/application_security/setup/dotnet/compatibility further_reading: - link: "/security/application_security/add-user-info/" tag: "Documentation" @@ -64,4 +65,4 @@ further_reading: - [Compatibility Information][2] [1]: /security/application_security/setup/dotnet/troubleshooting -[2]: /security/application_security/setup/dotnet/compatibility +[2]: /security/application_security/setup/compatibility/dotnet diff --git a/content/en/security/application_security/setup/dotnet/aws-fargate.md b/content/en/security/application_security/setup/dotnet/aws-fargate.md index 8bd20a28b2d..d322a7654b1 100644 --- a/content/en/security/application_security/setup/dotnet/aws-fargate.md +++ b/content/en/security/application_security/setup/dotnet/aws-fargate.md @@ -163,7 +163,7 @@ If you encounter issues while setting up App and API Protection for your .net ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/dotnet/compatibility +[1]: /security/application_security/setup/compatibility/dotnet [2]: /security/application_security/setup/dotnet/troubleshooting diff --git a/content/en/security/application_security/setup/dotnet/compatibility.md b/content/en/security/application_security/setup/dotnet/compatibility.md deleted file mode 100644 index 09caeb88153..00000000000 --- a/content/en/security/application_security/setup/dotnet/compatibility.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: .NET Compatibility Requirements -aliases: - - /security/application_security/threats/setup/compatibility/dotnet ---- - -## App and API Protection capabilities - -The following App and API Protection capabilities are supported in the .NET library, for the specified tracer version: - -| App and API Protection capability | Minimum .NET tracer version | -| --------------------------------------- | ----------------------------| -| Threat Detection | 2.23.0 | -| Threat Protection | 2.26.0 | -| Customize response to blocked requests | 2.27.0 | -| Automatic user activity event tracking | 2.32.0 | -| API Security | 2.42.0 | - -The minimum tracer version to get all supported App and API Protection capabilities for .NET is 2.42.0. - -**Note**: Threat Protection requires enabling [Remote Configuration][1], which is included in the listed minimum tracer version. - -### Supported deployment types - -Threat Detection is supported for the following deployment types: - -- Docker -- Kubernetes -- Amazon ECS -- AWS Fargate -- AWS Lambda -- Azure App Service - -**Note**: Azure App Service is supported for **web applications only**. App and API Protection capabilities are not supported for Azure Functions. - -## Language and framework compatibility - -### Supported .NET versions - -The Datadog .NET SDK is open source. View the [GitHub repository][2] for more information. - -The .NET Tracer supports instrumentation from - - .NET Framework 4.6.1 and newer versions - - .NET Core 3.1 and newer versions - -These are supported on the following architectures: -- Linux (GNU) x86-64, ARM64 -- Alpine Linux (musl) x86-64, ARM64 -- macOS (Darwin) x86-64, ARM64 -- Windows (msvc) x86, x86-64 - -For a complete list of supported versions and operating systems, see the [.NET Core tracer documentation][3] and [.NET Framework tracer documentation][4]. - -You must be running Datadog Agent v7.41.1+ for App and API Protection features. - -## Integrations - -The .NET tracer includes support for the following frameworks, data stores, and libraries: - -### Web framework compatibility -- ASP.NET MVC -- ASP.NET Web API 2 - -### Data stores -- OracleDB -- ADO.NET -- SQL Server -- MySQL -- SQLite -- PostgreSQL - -### Other -- Kafka -- GraphQL - -For a complete list of supported integrations and their versions, see the [.NET Core tracer documentation][3] and [.NET Framework tracer documentation][4]. - -[1]: /agent/remote_config/#enabling-remote-configuration -[2]: https://github.com/DataDog/dd-trace-dotnet -[3]: /tracing/trace_collection/compatibility/dotnet-core -[4]: /tracing/trace_collection/compatibility/dotnet-framework diff --git a/content/en/security/application_security/setup/dotnet/docker.md b/content/en/security/application_security/setup/dotnet/docker.md index cf1d9502b80..bbc3ca3ed29 100644 --- a/content/en/security/application_security/setup/dotnet/docker.md +++ b/content/en/security/application_security/setup/dotnet/docker.md @@ -99,7 +99,7 @@ If you encounter issues while setting up App and API Protection for your .NET ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/dotnet/compatibility +[1]: /security/application_security/setup/compatibility/dotnet [2]: /security/application_security/setup/dotnet/troubleshooting [3]: /agent/?tab=cloud_and_container diff --git a/content/en/security/application_security/setup/dotnet/kubernetes.md b/content/en/security/application_security/setup/dotnet/kubernetes.md index 7b28944df8b..ea8ca6d21a3 100644 --- a/content/en/security/application_security/setup/dotnet/kubernetes.md +++ b/content/en/security/application_security/setup/dotnet/kubernetes.md @@ -125,5 +125,5 @@ If you encounter issues while setting up App and API Protection for your .NET ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/dotnet/compatibility +[1]: /security/application_security/setup/compatibility/dotnet [2]: /security/application_security/setup/dotnet/troubleshooting diff --git a/content/en/security/application_security/setup/dotnet/linux.md b/content/en/security/application_security/setup/dotnet/linux.md index dde6d4ab260..ed23857b709 100644 --- a/content/en/security/application_security/setup/dotnet/linux.md +++ b/content/en/security/application_security/setup/dotnet/linux.md @@ -128,7 +128,7 @@ If you encounter issues while setting up App and API Protection for your .NET ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/dotnet/compatibility +[1]: /security/application_security/setup/compatibility/dotnet [2]: /agent/?tab=Linux [3]: https://github.com/DataDog/dd-trace-dotnet/releases [4]: /security/application_security/setup/dotnet/troubleshooting diff --git a/content/en/security/application_security/setup/dotnet/windows.md b/content/en/security/application_security/setup/dotnet/windows.md index 4072f420469..a92f563820e 100644 --- a/content/en/security/application_security/setup/dotnet/windows.md +++ b/content/en/security/application_security/setup/dotnet/windows.md @@ -112,7 +112,7 @@ If you encounter issues while setting up App and API Protection for your .NET ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/dotnet/compatibility +[1]: /security/application_security/setup/compatibility/dotnet [2]: /agent/?tab=Windows [3]: https://github.com/DataDog/dd-trace-dotnet/releases [4]: /security/application_security/setup/dotnet/troubleshooting diff --git a/content/en/security/application_security/setup/java/_index.md b/content/en/security/application_security/setup/java/_index.md index bc48ed449ce..77d1c660c76 100644 --- a/content/en/security/application_security/setup/java/_index.md +++ b/content/en/security/application_security/setup/java/_index.md @@ -10,6 +10,7 @@ aliases: - /security/application_security/enabling/tracing_libraries/threat_detection/java - /security/application_security/enabling/java - /security/application_security/threats/setup/standalone/java + - /security/application_security/setup/java/compatibility further_reading: - link: "/security/application_security/add-user-info/" tag: "Documentation" @@ -65,4 +66,4 @@ further_reading: - [Compatibility Information][2] [1]: /security/application_security/setup/java/troubleshooting -[2]: /security/application_security/setup/java/compatibility +[2]: /security/application_security/setup/compatibility/java diff --git a/content/en/security/application_security/setup/java/aws-fargate.md b/content/en/security/application_security/setup/java/aws-fargate.md index 7a1d8fe99d1..305d0e96062 100644 --- a/content/en/security/application_security/setup/java/aws-fargate.md +++ b/content/en/security/application_security/setup/java/aws-fargate.md @@ -224,6 +224,6 @@ If you encounter issues while setting up App and API Protection for your Java ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/java/compatibility +[1]: /security/application_security/setup/compatibility/java [2]: /security/application_security/setup/java/troubleshooting diff --git a/content/en/security/application_security/setup/java/compatibility.md b/content/en/security/application_security/setup/java/compatibility.md deleted file mode 100644 index 2494c9eb6c7..00000000000 --- a/content/en/security/application_security/setup/java/compatibility.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: Java Compatibility Requirements -aliases: - - /security/application_security/threats/setup/compatibility/java ---- - -## App and API Protection capabilities - -The following App and API Protection capabilities are supported in the Java library, for the specified tracer version: - -| App and API Protection capability | Minimum Java tracer version | -| -------------------------------------------------- | --------------------------- | -| Threat Detection | 0.94.0 | -| Threat Protection | 0.94.0 | -| Customize response to blocked requests | 0.94.0 | -| Automatic user activity event tracking | 0.94.0 | -| API Security | 0.94.0 | - -The minimum tracer version to get all supported App and API Protection capabilities for Java is 0.94.0. - -**Note**: Threat Protection requires enabling [Remote Configuration][1], which is included in the listed minimum tracer version. - - - -### Supported deployment types - -Threat Detection is supported for the following deployment types: - -- Docker -- Kubernetes -- Amazon ECS -- AWS Fargate -- AWS Lambda -- Google Cloud Run - -## Language and framework compatibility - -### Supported Java versions - -The Datadog Java SDK is open source. View the [GitHub repository][2] for more information. - -The Datadog Java SDK supports Java 8 and newer versions. For optimal performance and feature support, we recommend using the latest LTS version of Java. - -You must be running Datadog Agent v7.41.1+ for App and API Protection features. - -## Integrations - -The Java tracer includes support for the following frameworks, data stores, and libraries: - -### Web frameworks -- Spring Boot -- Spring Web -- Spring WebFlux -- JAX-RS -- Play Framework -- Spark Java -- Vert.x -- gRPC - -### Data stores -- JDBC -- MongoDB -- Redis -- Elasticsearch -- Cassandra -- Couchbase - -### Message brokers -- Kafka -- RabbitMQ -- JMS - -### Other -- OkHttp -- Apache HttpClient -- JSP -- Servlet -- GraphQL - -For a complete list of supported integrations and their versions, see the [Java tracer documentation][3]. - -[1]: /agent/remote_config/#enabling-remote-configuration -[2]: https://github.com/DataDog/dd-trace-java -[3]: /tracing/trace_collection/compatibility_requirements/java diff --git a/content/en/security/application_security/setup/java/docker.md b/content/en/security/application_security/setup/java/docker.md index cb982fb3d35..0c653990b9d 100644 --- a/content/en/security/application_security/setup/java/docker.md +++ b/content/en/security/application_security/setup/java/docker.md @@ -129,7 +129,7 @@ If you encounter issues while setting up App and API Protection for your Java ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/java/compatibility +[1]: /security/application_security/setup/compatibility/java [2]: /security/application_security/setup/java/troubleshooting [3]: /agent/?tab=cloud_and_container diff --git a/content/en/security/application_security/setup/java/kubernetes.md b/content/en/security/application_security/setup/java/kubernetes.md index d777e6ba773..669e26706b7 100644 --- a/content/en/security/application_security/setup/java/kubernetes.md +++ b/content/en/security/application_security/setup/java/kubernetes.md @@ -202,6 +202,6 @@ If you encounter issues while setting up App and API Protection for your Java ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/java/compatibility +[1]: /security/application_security/setup/compatibility/java [2]: /security/application_security/setup/java/troubleshooting [3]: /agent/?tab=cloud_and_container diff --git a/content/en/security/application_security/setup/java/linux.md b/content/en/security/application_security/setup/java/linux.md index 23de94b1bdb..21a2e3b2880 100644 --- a/content/en/security/application_security/setup/java/linux.md +++ b/content/en/security/application_security/setup/java/linux.md @@ -114,7 +114,7 @@ If you encounter issues while setting up App and API Protection for your Java ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/java/compatibility +[1]: /security/application_security/setup/compatibility/java [2]: /security/application_security/setup/java/troubleshooting [3]: /agent/?tab=Linux diff --git a/content/en/security/application_security/setup/java/macos.md b/content/en/security/application_security/setup/java/macos.md index 87c023a5f8e..41d96885dcb 100644 --- a/content/en/security/application_security/setup/java/macos.md +++ b/content/en/security/application_security/setup/java/macos.md @@ -110,6 +110,6 @@ If you encounter issues while setting up App and API Protection for your Java ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/java/compatibility +[1]: /security/application_security/setup/compatibility/java [2]: /security/application_security/setup/java/troubleshooting [3]: /agent/?tab=macOS diff --git a/content/en/security/application_security/setup/java/windows.md b/content/en/security/application_security/setup/java/windows.md index 1050aafb9c5..50613cce1ac 100644 --- a/content/en/security/application_security/setup/java/windows.md +++ b/content/en/security/application_security/setup/java/windows.md @@ -110,6 +110,6 @@ If you encounter issues while setting up App and API Protection for your Java ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/java/compatibility +[1]: /security/application_security/setup/compatibility/java [2]: /security/application_security/setup/java/troubleshooting [3]: /agent/?tab=Windows diff --git a/content/en/security/application_security/setup/nginx/_index.md b/content/en/security/application_security/setup/nginx/_index.md index 14576993756..b46bd818851 100644 --- a/content/en/security/application_security/setup/nginx/_index.md +++ b/content/en/security/application_security/setup/nginx/_index.md @@ -38,4 +38,4 @@ Learn how to set up App and API Protection (AAP) on your NGINX proxy by selectin [1]: https://github.com/DataDog/nginx-datadog/ [2]: /security/application_security/setup/php/troubleshooting -[3]: /security/application_security/setup/php/compatibility +[3]: /security/application_security/setup/compatibility/nginx diff --git a/content/en/security/application_security/setup/nodejs/_index.md b/content/en/security/application_security/setup/nodejs/_index.md index a49629c7bb8..bf13e1db185 100644 --- a/content/en/security/application_security/setup/nodejs/_index.md +++ b/content/en/security/application_security/setup/nodejs/_index.md @@ -8,6 +8,7 @@ aliases: - /security/application_security/threats_detection/nodejs - /security/application_security/setup/aws/fargate/nodejs - /security/application_security/setup/standalone/nodejs + - /security/application_security/setup/nodejs/compatibility further_reading: - link: "/security/application_security/add-user-info/" tag: "Documentation" @@ -60,4 +61,4 @@ further_reading: ## Additional Resources - [Troubleshooting Guide](./troubleshooting) -- [Compatibility Information](./compatibility) +- [Compatibility Information](/security/application_security/setup/compatibility/nodejs) diff --git a/content/en/security/application_security/setup/nodejs/aws-fargate.md b/content/en/security/application_security/setup/nodejs/aws-fargate.md index 6564f597306..8231f73b408 100644 --- a/content/en/security/application_security/setup/nodejs/aws-fargate.md +++ b/content/en/security/application_security/setup/nodejs/aws-fargate.md @@ -165,5 +165,5 @@ If you encounter issues while setting up App and API Protection for your Node.js {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/nodejs/compatibility +[1]: /security/application_security/setup/compatibility/nodejs [2]: /security/application_security/setup/nodejs/troubleshooting diff --git a/content/en/security/application_security/setup/nodejs/compatibility.md b/content/en/security/application_security/setup/nodejs/compatibility.md deleted file mode 100644 index 7afcfbf3c3a..00000000000 --- a/content/en/security/application_security/setup/nodejs/compatibility.md +++ /dev/null @@ -1,165 +0,0 @@ ---- -title: Node.js Compatibility Requirements -code_lang: nodejs -type: multi-code-lang -code_lang_weight: 50 -aliases: - - /security/application_security/threats/setup/compatibility/nodejs ---- - -## App and API Protection capabilities - -The following App and API Protection capabilities are supported in the Node.js library, for the specified tracer version: - -| App and API Protection capability | Minimum Node.js tracer version | -|----------------------------------------|--------------------------------------------------| -| Threat Detection | 4.0.0 | -| Threat Protection | 4.0.0 | -| Customize response to blocked requests | 4.1.0 | -| Automatic user activity event tracking | 4.4.0 | -| API Security | 4.30.0 | - -The minimum tracer version to get all supported App and API Protection capabilities for Node.js is 4.30.0. - -**Note**: -- Threat Protection requires enabling [Remote Configuration][2], which is included in the listed minimum tracer version. - -### Supported deployment types - -| Type | Threat Detection support | -|-------------|--------------------------| -| Docker | {{< X >}} | -| Kubernetes | {{< X >}} | -| Amazon ECS | {{< X >}} | -| AWS Fargate | {{< X >}} | -| AWS Lambda | {{< X >}} | - - -## Language and framework compatibility - -### Node.js Version Support - -When the Node.js project drops support for an LTS major release line (when it goes End of Life), support for it is dropped in the next major version of `dd-trace`. -The last major supporting release line of `dd-trace` library supports that EOL version of Node.js for at least another year on a maintenance mode basis. - -Some issues cannot be solved in `dd-trace` and instead must be solved in Node.js. When this happens and the Node.js release in question is EOL, it's not possible to solve the issue without moving to another non-EOL release. -Datadog does not make new releases of `dd-trace` to provide specific support for non-LTS Node.js major release lines (odd numbered versions). - -For the best level of support, always run the latest LTS release of Node.js, and the latest major version of `dd-trace`. Whatever release line of Node.js you use, also use the latest version of Node.js on that release line, to ensure you have the latest security fixes. - -For more information about Node.js release, see the [official Node.js documentation][4]. - -### Operating system support - -The following operating systems are officially supported by `dd-trace`. Any operating system not listed is still likely to work, but with some features missing, for example App and API Protection capabilities, profiling, and runtime metrics. Generally speaking, operating systems that are actively maintained at the time of initial release for a major version are supported. - -| Operating System | Architectures | Minimum Versions | -|------------------|---------------|------------------------------------------| -| Linux (glibc) | arm64, x64 | CentOS 7, Debian 9, RHEL 7, Ubuntu 14.04 | -| Linux (musl) | arm64, x64 | Alpine 3.13 | -| macOS | arm64, x64 | Sonoma (14.0) | -| Windows | x64 | Windows 8.1, Windows Server 2012 | - -### Web framework compatibility - -- Attacker source HTTP request details -- Tags for the HTTP request (status code, method, etc) -- Distributed Tracing to see attack flows through your applications - -##### App and API Protection Capability Notes - -Although Threat Protection is available for express >= 4 versions, the blocking of payloads on the body is only supported for applications using either the [`body-parser`][45] or [`multer`][46] libraries. - -| Framework | Versions | Threat Detection supported? | Threat Protection supported? | -|-----------|----------|-----------------------------|------------------------------| -| express | `>=4` | {{< X >}} | {{< X >}} | -| fastify | `>=2` | {{< X >}} | {{< X >}} | -| nextjs | `>=11.1` | {{< X >}} | | - -
If you would like to see support added for any of the unsupported capabilities or for your Node.js framework, let us know! Fill out this short form to send details.
- -### Networking framework compatibility - -**Networking tracing provides:** - -- Distributed tracing through your applications -- Request-based blocking - -##### App and API Protection Capability Notes - -| Framework | Threat Detection supported? | Threat Protection supported? | -|-----------|-----------------------------|------------------------------| -| http | {{< X >}} | {{< X >}} | -| https | {{< X >}} | {{< X >}} | - - -
If you don't see your framework of choice listed, let us know! Fill out this short form to send details.
- -### Data store compatibility - -**Datastore tracing provides:** - -- Timing request to response -- Query info (for example, a sanitized query string) -- Error and stacktrace capturing - -##### App and API Protection Capability Notes - -- **Threat Protection** also works at the HTTP request (input) layer, and so works for all databases by default, even those not listed in the table below. - -| Framework | Versions | Threat Detection supported? | Threat Protection supported? | -|--------------------------|-----------|-----------------------------|------------------------------| -| [@apollo/server][43] | `>=4` | {{< X >}} | {{< X >}} | -| [apollo-server-core][44] | `>=3` | {{< X >}} | {{< X >}} | -| [cassandra-driver][28] | `>=3` | {{< X >}} | {{< X >}} | -| [couchbase][29] | `^2.4.2` | {{< X >}} | {{< X >}} | -| [elasticsearch][30] | `>=10` | {{< X >}} | {{< X >}} | -| [ioredis][31] | `>=2` | {{< X >}} | {{< X >}} | -| [knex][32] | `>=0.8` | {{< X >}} | {{< X >}} | -| [mariadb][5] | `>=3` | {{< X >}} | {{< X >}} | -| [memcached][33] | `>=2.2` | {{< X >}} | {{< X >}} | -| [mongodb-core][34] | `>=2` | {{< X >}} | {{< X >}} | -| [mysql][35] | `>=2` | {{< X >}} | {{< X >}} | -| [mysql2][36] | `>=1` | {{< X >}} | {{< X >}} | -| [oracledb][37] | `>=5` | {{< X >}} | {{< X >}} | -| [pg][38] | `>=4` | {{< X >}} | {{< X >}} | -| [redis][39] | `>=0.12` | {{< X >}} | {{< X >}} | -| [sharedb][40] | `>=1` | {{< X >}} | {{< X >}} | -| [tedious][41] | `>=1` | {{< X >}} | {{< X >}} | -| [sequelize][42] | `>=4` | {{< X >}} | {{< X >}} | - -### User Authentication Frameworks compatibility - -**Integrations to User Authentication Frameworks provide:** - -- User login events, including the user IDs -- The Account Takeover detection monitoring the user login events - -| Framework | Minimum Framework Version | -|-----------------|---------------------------| -| passport-local | 1.0.0 | -| passport-http | 0.3.0 | - -[1]: /tracing/trace_collection/compatibility/nodejs/ -[2]: /agent/remote_config/#enabling-remote-configuration -[4]: https://github.com/nodejs/release#release-schedule -[5]: https://github.com/mariadb-corporation/mariadb-connector-nodejs -[28]: https://github.com/datastax/nodejs-driver -[29]: https://github.com/couchbase/couchnode -[30]: https://github.com/elastic/elasticsearch-js -[31]: https://github.com/luin/ioredis -[32]: https://knexjs.org -[33]: https://github.com/3rd-Eden/memcached -[34]: https://www.mongodb.com/docs/drivers/node/current/ -[35]: https://github.com/mysqljs/mysql -[36]: https://github.com/sidorares/node-mysql2 -[37]: https://oracle.github.io/node-oracledb/ -[38]: https://node-postgres.com -[39]: https://github.com/NodeRedis/node_redis -[40]: https://share.github.io/sharedb/ -[41]: http://tediousjs.github.io/tedious -[42]: https://github.com/sequelize/sequelize -[43]: https://github.com/apollographql/apollo-server -[44]: https://www.npmjs.com/package/apollo-server-core -[45]: https://www.npmjs.com/package/body-parser -[46]: https://www.npmjs.com/package/multer diff --git a/content/en/security/application_security/setup/nodejs/docker.md b/content/en/security/application_security/setup/nodejs/docker.md index 94d77df946c..189686bacf9 100644 --- a/content/en/security/application_security/setup/nodejs/docker.md +++ b/content/en/security/application_security/setup/nodejs/docker.md @@ -118,5 +118,5 @@ If you encounter issues while setting up App and API Protection for your Node.js {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/nodejs/compatibility +[1]: /security/application_security/setup/compatibility/nodejs [2]: /security/application_security/setup/nodejs/troubleshooting diff --git a/content/en/security/application_security/setup/nodejs/kubernetes.md b/content/en/security/application_security/setup/nodejs/kubernetes.md index c45917ab20f..ef45e36be25 100644 --- a/content/en/security/application_security/setup/nodejs/kubernetes.md +++ b/content/en/security/application_security/setup/nodejs/kubernetes.md @@ -128,5 +128,5 @@ If you encounter issues while setting up App and API Protection for your Node.js {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/nodejs/compatibility +[1]: /security/application_security/setup/compatibility/nodejs [2]: /security/application_security/setup/nodejs/troubleshooting diff --git a/content/en/security/application_security/setup/nodejs/linux.md b/content/en/security/application_security/setup/nodejs/linux.md index 09042ce68e0..248a7d0fab6 100644 --- a/content/en/security/application_security/setup/nodejs/linux.md +++ b/content/en/security/application_security/setup/nodejs/linux.md @@ -79,5 +79,5 @@ If you encounter issues while setting up App and API Protection for your Node.js {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/nodejs/compatibility +[1]: /security/application_security/setup/compatibility/nodejs [2]: /security/application_security/setup/nodejs/troubleshooting diff --git a/content/en/security/application_security/setup/nodejs/macos.md b/content/en/security/application_security/setup/nodejs/macos.md index e7f485e075e..5aba0145081 100644 --- a/content/en/security/application_security/setup/nodejs/macos.md +++ b/content/en/security/application_security/setup/nodejs/macos.md @@ -77,5 +77,5 @@ If you encounter issues while setting up App and API Protection for your Node.js {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/nodejs/compatibility +[1]: /security/application_security/setup/compatibility/nodejs [2]: /security/application_security/setup/nodejs/troubleshooting diff --git a/content/en/security/application_security/setup/nodejs/troubleshooting.md b/content/en/security/application_security/setup/nodejs/troubleshooting.md index 45dad57cb19..371e2798166 100644 --- a/content/en/security/application_security/setup/nodejs/troubleshooting.md +++ b/content/en/security/application_security/setup/nodejs/troubleshooting.md @@ -73,7 +73,7 @@ If you're still experiencing problems: 4. Contact [Datadog support][5]. [1]: /security/application_security/troubleshooting -[2]: /security/application_security/setup/nodejs/compatibility +[2]: /security/application_security/setup/compatibility/nodejs [3]: /tracing/trace_collection/compatibility/nodejs/#performance [4]: /tracing/trace_collection/compatibility/nodejs/ [5]: /help diff --git a/content/en/security/application_security/setup/nodejs/windows.md b/content/en/security/application_security/setup/nodejs/windows.md index 9be676015f6..e7526186d7a 100644 --- a/content/en/security/application_security/setup/nodejs/windows.md +++ b/content/en/security/application_security/setup/nodejs/windows.md @@ -85,5 +85,5 @@ If you encounter issues while setting up App and API Protection for your Node.js {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/nodejs/compatibility +[1]: /security/application_security/setup/compatibility/nodejs [2]: /security/application_security/setup/nodejs/troubleshooting diff --git a/content/en/security/application_security/setup/php/_index.md b/content/en/security/application_security/setup/php/_index.md index 954a9a969ec..32296466f96 100644 --- a/content/en/security/application_security/setup/php/_index.md +++ b/content/en/security/application_security/setup/php/_index.md @@ -9,6 +9,7 @@ aliases: - /security/application_security/setup/threat_detection/php - /security/application_security/setup/standalone/php - /security/application_security/enabling/compatibility/php + - /security/application_security/setup/php/compatibility --- {{< partial name="app_and_api_protection/callout.html" >}} @@ -45,4 +46,4 @@ aliases: ## Additional Resources - [Troubleshooting Guide](/security/application_security/setup/php/troubleshooting) -- [Compatibility Information](/security/application_security/setup/php/compatibility) +- [Compatibility Information](/security/application_security/setup/compatibility/php) diff --git a/content/en/security/application_security/setup/php/aws-fargate.md b/content/en/security/application_security/setup/php/aws-fargate.md index 79584772e7b..a5100fe9ac3 100644 --- a/content/en/security/application_security/setup/php/aws-fargate.md +++ b/content/en/security/application_security/setup/php/aws-fargate.md @@ -174,5 +174,5 @@ If you encounter issues while setting up App and API Protection for your PHP app {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/php/compatibility +[1]: /security/application_security/setup/compatibility/php [2]: /security/application_security/setup/php/troubleshooting diff --git a/content/en/security/application_security/setup/php/compatibility.md b/content/en/security/application_security/setup/php/compatibility.md deleted file mode 100644 index 4e7a5154f4d..00000000000 --- a/content/en/security/application_security/setup/php/compatibility.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: PHP Compatibility Requirements ---- - -## App and API Protection capabilities support - -The following App and API Protection capabilities are supported in the PHP library, for the specified tracer version: - -| App and API Protection capability | Minimum PHP tracer version | -| -------------------------------- |----------------------------| -| Threat Detection | 0.84.0 | -| Threat Protection | 0.86.0 | -| Customize response to blocked requests | 0.86.0 | -| Automatic user activity event tracking | 0.89.0 | -| API Security | 0.98.0 | - -The minimum tracer version to get all supported App and API Protection capabilities for PHP is 0.98.0. - - -
If you would like to see support added for any of the unsupported capabilities, let us know! Fill out this short form to send details.
- -### Supported deployment types -| Type | Threat Detection support | -|-------------|--------------------------| -| Docker | {{< X >}} | -| Kubernetes | {{< X >}} | -| Amazon ECS | {{< X >}} | -| AWS Fargate | {{< X >}} | -| AWS Lambda | | - -## Language and framework compatibility - -
-Note: -It's recommended to use officially supported versions of PHP, especially 8.0, 8.1 and 8.2. -
- -| PHP Version | Support level | Package version | -|:---------------|:--------------------------------------|:----------------| -| 8.3.x | General Availability | > `0.95.0+` | -| 8.2.x | General Availability | > `0.82.0+` | -| 8.1.x | General Availability | > `0.66.0+` | -| 8.0.x | General Availability | > `0.52.0+` | -| 7.4.x | General Availability | All | -| 7.3.x | General Availability | All | -| 7.2.x | General Availability | All | -| 7.1.x | General Availability | All | -| 7.0.x | General Availability | All | - -App and API Protection capabilities for PHP support the following SAPI's: - -| SAPI | Support type | -|:---------------|:----------------| -| apache2handler | Fully Supported | -| cli | Fully Supported | -| fpm-fcgi | Fully Supported | -| cgi-fcgi | Fully Supported | -| FrankenPHP | Fully Supported | - -## Supported processor architectures - -App and API Protection capabilities for PHP support the following architectures: - -| Processor architectures | Support level | Package version | -| ------------------------------------------|-----------------------|----------------------------------------| -| Linux GNU amd64 (`x86-64-linux-gnu`) | GA | All | -| Linux MUSL amd64 (`x86-64-linux-musl`) | GA | All | -| Linux GNU arm64 (aarch64-linux-gnu) | GA | > `0.95.0` | -| Linux MUSL arm64 (aarch64-linux-musl) | GA | > `0.95.0` | -| Windows | Not supported | | - -The Datadog PHP library supports PHP version 7.0 and above on the following architectures: - -- Linux (GNU) x86-64 and arm64 -- Alpine Linux (musl) x86-64 and arm64 - -The library supports the use of all PHP frameworks, and also the use of no framework. - - -### Web framework compatibility - -- Attacker source HTTP request details -- Tags for the HTTP request (status code, method, etc) -- Distributed Tracing to see attack flows through your applications - -##### App and API Protection Capability Notes - -The following frameworks aren't directly instrumented by App and API Protection, but indirectly supported through runtime instrumentation. - -| Framework | Versions | Threat Detection supported? | Threat Protection supported? | -| ------------------------ | ----------- | --------------- | ---------------------------------------------- | -| CakePHP | 2.x | {{< X >}} | {{< X >}} | -| CodeIgniter | 2.x | {{< X >}} | {{< X >}} | -| FuelPHP | 1.1 | {{< X >}} | {{< X >}} | -| Laravel | 4.2, 5.x, 6.x, 8.x(tracer 0.52.0+), 9.x, 10.x | {{< X >}} | {{< X >}} | -| Lumen | 5.2+ | {{< X >}} | {{< X >}} | -| Magento | 1, 2 | {{< X >}} | {{< X >}} | -| Neos Flow | 3.0.x | {{< X >}} | {{< X >}} | -| Phalcon | 3.1+ | {{< X >}} | {{< X >}} | -| Slim | 3.1+ | {{< X >}} | {{< X >}} | -| Symfony | 3.1+, 4.x, 5.x, 6.x | {{< X >}} | {{< X >}} | -| Wordpress | 3.1+, 4.x, 5.x, 6.x | {{< X >}} | {{< X >}} | -| Yii | 3.1+ | {{< X >}} | {{< X >}} | -| Zend | 3.1+ | {{< X >}} | {{< X >}} | -| RoadRunner | 2.x | {{< X >}} | {{< X >}} | - - -### Data store compatibility - -**Datastore tracing provides:** - -- SQL attack detection -- query info (for example, a sanitized query string) -- error and stacktrace capturing - -##### App and API Protection Capability Notes -- **Threat Protection** also works at the HTTP request (input) layer, and so works for all databases by default, even those not listed in the table below. - -| Framework | Versions | Threat Detection supported? | Threat Protection supported?| -|-------------------|-----------------|-----------------|---------------| -| Amazon RDS | Any supported PHP | {{< X >}} | {{< X >}} | -| Eloquent | Laravel supported versions | {{< X >}} | {{< X >}} | -| Memcached | Any supported PHP | {{< X >}} | {{< X >}} | -| MySQLi | Any supported PHP | {{< X >}} | {{< X >}} | -| PDO | Any supported PHP| {{< X >}}| {{< X >}} | -| PHPRedis | 3, 4, 5 | {{< X >}} | {{< X >}} | -| Predis | 1.1 | {{< X >}} | {{< X >}} | - -### User Authentication Frameworks compatibility - -**Integrations to User Authentication Frameworks provide:** - -- User login events, including the user IDs -- Account Takeover detection monitoring for user login events - -| Framework | Minimum Framework Version | -|-----------|---------------------------| -| Laravel | 4.2 | -| Symfony | 3.3 | -| Wordpress | 4.8 | - diff --git a/content/en/security/application_security/setup/php/docker.md b/content/en/security/application_security/setup/php/docker.md index 00832cd52fe..a9295d76e9d 100644 --- a/content/en/security/application_security/setup/php/docker.md +++ b/content/en/security/application_security/setup/php/docker.md @@ -96,5 +96,5 @@ If you encounter issues while setting up App and API Protection for your PHP app {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/php/compatibility +[1]: /security/application_security/setup/compatibility/php [2]: /security/application_security/setup/php/troubleshooting diff --git a/content/en/security/application_security/setup/php/kubernetes.md b/content/en/security/application_security/setup/php/kubernetes.md index 7db4b5cb991..b0f1572d291 100644 --- a/content/en/security/application_security/setup/php/kubernetes.md +++ b/content/en/security/application_security/setup/php/kubernetes.md @@ -120,5 +120,5 @@ If you encounter issues while setting up App and API Protection for your PHP app {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/php/compatibility +[1]: /security/application_security/setup/compatibility/php [2]: /security/application_security/setup/php/troubleshooting diff --git a/content/en/security/application_security/setup/php/linux.md b/content/en/security/application_security/setup/php/linux.md index 45d6336fcc5..d769668c0ed 100644 --- a/content/en/security/application_security/setup/php/linux.md +++ b/content/en/security/application_security/setup/php/linux.md @@ -87,5 +87,5 @@ If you encounter issues while setting up App and API Protection for your PHP app {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/php/compatibility +[1]: /security/application_security/setup/compatibility/php [2]: /security/application_security/setup/php/troubleshooting diff --git a/content/en/security/application_security/setup/python/_index.md b/content/en/security/application_security/setup/python/_index.md index 294b54bec0e..2b29f4226d5 100644 --- a/content/en/security/application_security/setup/python/_index.md +++ b/content/en/security/application_security/setup/python/_index.md @@ -9,6 +9,7 @@ aliases: - /security/application_security/setup/threat_detection/python - /security/application_security/setup/standalone/python - /security/application_security/enabling/python + - /security/application_security/setup/python/compatibility further_reading: - link: "/security/application_security/how-it-works/add-user-info/?tab=python" tag: "Documentation" @@ -61,4 +62,4 @@ further_reading: ## Additional Resources - [Troubleshooting Guide](/security/application_security/setup/python/troubleshooting) -- [Compatibility Information](/security/application_security/setup/python/compatibility) +- [Compatibility Information](/security/application_security/setup/compatibility/python) diff --git a/content/en/security/application_security/setup/python/aws-fargate.md b/content/en/security/application_security/setup/python/aws-fargate.md index b4b9b15c08d..1a0b85d572f 100644 --- a/content/en/security/application_security/setup/python/aws-fargate.md +++ b/content/en/security/application_security/setup/python/aws-fargate.md @@ -165,5 +165,5 @@ If you encounter issues while setting up App and API Protection for your Python {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/python/compatibility +[1]: /security/application_security/setup/compatibility/python [2]: /security/application_security/setup/python/troubleshooting diff --git a/content/en/security/application_security/setup/python/compatibility.md b/content/en/security/application_security/setup/python/compatibility.md deleted file mode 100644 index 1fce454df99..00000000000 --- a/content/en/security/application_security/setup/python/compatibility.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: Python App and API Protection Compatibility -code_lang: python -type: multi-code-lang -code_lang_weight: 10 -further_reading: - - link: "/security/application_security/how-it-works/" - tag: "Documentation" - text: "How App and API Protection Works" - - link: "/security/default_rules/?category=cat-application-security" - tag: "Documentation" - text: "OOTB App and API Protection Rules" - - link: "/security/application_security/troubleshooting" - tag: "Documentation" - text: "Troubleshooting App and API Protection" ---- - -## App and API Protection capabilities support - -The following App and API Protection capabilities are supported in the Python library, for the specified tracer version: - -{{< partial name="app_and_api_protection/python/capabilities.html" >}} - -
Datadog strongly encourages you to always use the last stable release of the SDK.
- -
Threat Protection requires enabling [Remote Configuration][2], which is included in the listed minimum tracer version.
- -### Supported deployment types - -| Type | Threat Detection support | -|-------------|--------------------------| -| Docker | {{< X >}} | -| Kubernetes | {{< X >}} | -| Amazon ECS | {{< X >}} | -| AWS Fargate | {{< X >}} | -| AWS Lambda | {{< X >}} | - - -## Language and framework compatibility - -### Supported Python versions - -The Python App and API Protection Client library follows a [versioning policy][3] that specifies the support level for the different versions of the library and Python runtime. - -Two release branches are supported: - -{{< partial name="trace_collection/python/supported_versions.html" >}} - -And the library supports the following runtimes: - -{{< partial name="trace_collection/python/supported_runtimes.html" >}} - -### Web framework compatibility - -- Attacker source HTTP request details -- Tags for the HTTP request (status code, method, etc) -- Distributed Tracing to see attack flows through your applications - -### Supported frameworks - -**Note:** Tornado support is available starting in ddtrace Python version 4.4. - -| Framework | Versions | Threat Detection supported? | Threat Protection supported? | -|-----------|------------|-----------------------------|------------------------------| -| Django | 2.2 | {{< X >}} | {{< X >}} | -| FastAPI | 0.86 | {{< X >}} | {{< X >}} | -| Flask | 1.1 | {{< X >}} | {{< X >}} | -| Tornado | 6.3 | {{< X >}} | {{< X >}} | - - -
If you don't see your framework of choice listed, let us know! Fill out this short form to send details.
- -### Data store compatibility - - -**Datastore tracing provides:** - -- timing request to response -- query info (for example, a sanitized query string) -- error and stacktrace capturing - -##### App and API Protection Capability Notes - -- **Threat Protection** also works at the HTTP request (input) layer, and so works for all databases by default, even those not listed in the table below. - -The Python library supports the [database API specifications][4] and supports all generic SQL databases. This includes databases such as SQLite, MySQL, PostgreSQL, and MariaDB. - -### User Authentication Frameworks compatibility - -**Integrations to User Authentication Frameworks provide:** - -- User login events, including the user IDs -- Account Takeover detection monitoring for user login events - -| Framework | Framework Versions | -|------------------|------------------------| -| Django | 1.11, 2.2, 3.2, >= 4.0 | - -[1]: /tracing/trace_collection/compatibility/python/ -[2]: /agent/remote_config/#enabling-remote-configuration -[3]: https://ddtrace.readthedocs.io/en/stable/versioning.html -[4]: https://peps.python.org/pep-0249/ diff --git a/content/en/security/application_security/setup/python/docker.md b/content/en/security/application_security/setup/python/docker.md index 39f5305fccd..b1f4aeba7de 100644 --- a/content/en/security/application_security/setup/python/docker.md +++ b/content/en/security/application_security/setup/python/docker.md @@ -99,5 +99,5 @@ If you encounter issues while setting up App and API Protection for your Python {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/python/compatibility +[1]: /security/application_security/setup/compatibility/python [2]: /security/application_security/setup/python/troubleshooting diff --git a/content/en/security/application_security/setup/python/kubernetes.md b/content/en/security/application_security/setup/python/kubernetes.md index 060ef39594b..d39aad17a4e 100644 --- a/content/en/security/application_security/setup/python/kubernetes.md +++ b/content/en/security/application_security/setup/python/kubernetes.md @@ -121,5 +121,5 @@ If you encounter issues while setting up App and API Protection for your Python {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/python/compatibility +[1]: /security/application_security/setup/compatibility/python [2]: /security/application_security/setup/python/troubleshooting diff --git a/content/en/security/application_security/setup/python/linux.md b/content/en/security/application_security/setup/python/linux.md index c8a6b6ff242..2baa8a5839c 100644 --- a/content/en/security/application_security/setup/python/linux.md +++ b/content/en/security/application_security/setup/python/linux.md @@ -90,5 +90,5 @@ If you encounter issues while setting up App and API Protection for your Python {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/python/compatibility +[1]: /security/application_security/setup/compatibility/python [2]: /security/application_security/setup/python/troubleshooting diff --git a/content/en/security/application_security/setup/python/macos.md b/content/en/security/application_security/setup/python/macos.md index 27edc17444b..9d514fa78d3 100644 --- a/content/en/security/application_security/setup/python/macos.md +++ b/content/en/security/application_security/setup/python/macos.md @@ -88,5 +88,5 @@ If you encounter issues while setting up App and API Protection for your Python {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/python/compatibility +[1]: /security/application_security/setup/compatibility/python [2]: /security/application_security/setup/python/troubleshooting diff --git a/content/en/security/application_security/setup/python/troubleshooting.md b/content/en/security/application_security/setup/python/troubleshooting.md index 553bffbd67a..48ed81a54c0 100644 --- a/content/en/security/application_security/setup/python/troubleshooting.md +++ b/content/en/security/application_security/setup/python/troubleshooting.md @@ -92,7 +92,7 @@ If you're still experiencing problems: {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/python/compatibility +[1]: /security/application_security/setup/compatibility/python [2]: /security/application_security/troubleshooting [3]: /tracing/trace_collection/compatibility/python [4]: /help diff --git a/content/en/security/application_security/setup/python/windows.md b/content/en/security/application_security/setup/python/windows.md index abd9432770e..d15341c8d97 100644 --- a/content/en/security/application_security/setup/python/windows.md +++ b/content/en/security/application_security/setup/python/windows.md @@ -85,5 +85,5 @@ If you encounter issues while setting up App and API Protection for your Python {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/python/compatibility +[1]: /security/application_security/setup/compatibility/python [2]: /security/application_security/setup/python/troubleshooting diff --git a/content/en/security/application_security/setup/ruby/_index.md b/content/en/security/application_security/setup/ruby/_index.md index f19214f2194..67ed291f009 100644 --- a/content/en/security/application_security/setup/ruby/_index.md +++ b/content/en/security/application_security/setup/ruby/_index.md @@ -10,6 +10,7 @@ aliases: - /security/application_security/setup/standalone/ruby - /security/application_security/setup/threat_detection/ruby - /security/application_security/enabling/ruby + - /security/application_security/setup/ruby/compatibility further_reading: - link: "/security/application_security/add-user-info/" tag: "Documentation" @@ -64,5 +65,5 @@ further_reading: ## Additional Resources -- [Compatibility Information](/security/application_security/setup/ruby/compatibility) +- [Compatibility Information](/security/application_security/setup/compatibility/ruby) - [Troubleshooting Guide](/security/application_security/setup/ruby/troubleshooting) diff --git a/content/en/security/application_security/setup/ruby/aws-fargate.md b/content/en/security/application_security/setup/ruby/aws-fargate.md index 8ffd1749549..244e2bddb5a 100644 --- a/content/en/security/application_security/setup/ruby/aws-fargate.md +++ b/content/en/security/application_security/setup/ruby/aws-fargate.md @@ -251,5 +251,5 @@ If you encounter issues while setting up App and API Protection for your Ruby ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/ruby/compatibility +[1]: /security/application_security/setup/compatibility/ruby [2]: /security/application_security/setup/ruby/troubleshooting diff --git a/content/en/security/application_security/setup/ruby/compatibility.md b/content/en/security/application_security/setup/ruby/compatibility.md deleted file mode 100644 index ddc0d4c7b71..00000000000 --- a/content/en/security/application_security/setup/ruby/compatibility.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Ruby Compatibility Requirements -aliases: - - /security/application_security/threats/setup/compatibility/ruby ---- - -## App and API Protection capabilities - -The following App and API Protection capabilities are supported in the Ruby library, for the specified tracer version: - -| App and API Protection capability | Minimum Ruby tracer version | -| -------------------------------------------------- | --------------------------- | -| Threat Detection | 1.9.0 | -| Threat Protection | 1.11.0 | -| Customize response to blocked requests | 1.15.0 | -| Automatic user activity event tracking | 1.14.0 | -| API Security | 2.17.0 | - -The minimum tracer version to get all supported App and API Protection capabilities for Ruby is 2.17.0. - -### Supported deployment types - -| Type | Threat Detection support | -|------------------ | ------------------------ | -| Docker | {{< X >}} | -| Kubernetes | {{< X >}} | -| Amazon ECS | {{< X >}} | -| AWS Fargate | {{< X >}} | -| AWS Lambda | | -| Google Cloud Run | | - -## Language and framework compatibility - -### Supported Ruby interpreters - -The Datadog Ruby SDK is open source. View the [GitHub repository][1] for more information. - -- MRI versions 2.5 to 3.5 -- JRuby versions 9.2.21.0+ and 9.4 - -These are supported on the following architectures: - -- Linux (GNU) x86-64, aarch64 -- Alpine Linux (musl) x86-64, aarch64 -- macOS (Darwin) x86-64, arm64 - -You must be running Datadog Agent v7.41.1+ for App and API Protection features. - -## Integrations - -The Ruby tracer includes support for the following frameworks, ORMs, and libraries: - -### Web and API frameworks - -- Rails -- Sinatra -- Grape - -### ORMs - -- ActiveRecord - -### HTTP clients - -- Faraday -- Excon -- RestClient - -### Other - -- GraphQL -- Rack - - -[1]: https://github.com/DataDog/dd-trace-rb diff --git a/content/en/security/application_security/setup/ruby/docker.md b/content/en/security/application_security/setup/ruby/docker.md index 2a0a164b6f9..822d0efbd75 100644 --- a/content/en/security/application_security/setup/ruby/docker.md +++ b/content/en/security/application_security/setup/ruby/docker.md @@ -170,5 +170,5 @@ If you encounter issues while setting up App and API Protection for your Ruby ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/ruby/compatibility +[1]: /security/application_security/setup/compatibility/ruby [2]: /security/application_security/setup/ruby/troubleshooting diff --git a/content/en/security/application_security/setup/ruby/kubernetes.md b/content/en/security/application_security/setup/ruby/kubernetes.md index 35f17502df8..ef17f1aa4d6 100644 --- a/content/en/security/application_security/setup/ruby/kubernetes.md +++ b/content/en/security/application_security/setup/ruby/kubernetes.md @@ -208,5 +208,5 @@ If you encounter issues while setting up App and API Protection for your Ruby ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/ruby/compatibility +[1]: /security/application_security/setup/compatibility/ruby [2]: /security/application_security/setup/ruby/troubleshooting diff --git a/content/en/security/application_security/setup/ruby/linux.md b/content/en/security/application_security/setup/ruby/linux.md index 5d77df009d6..d1b1030849d 100644 --- a/content/en/security/application_security/setup/ruby/linux.md +++ b/content/en/security/application_security/setup/ruby/linux.md @@ -188,5 +188,5 @@ If you encounter issues while setting up App and API Protection for your Ruby ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/ruby/compatibility +[1]: /security/application_security/setup/compatibility/ruby [2]: /security/application_security/setup/ruby/troubleshooting diff --git a/content/en/security/application_security/setup/ruby/macos.md b/content/en/security/application_security/setup/ruby/macos.md index 5373e850065..bf779c83bee 100644 --- a/content/en/security/application_security/setup/ruby/macos.md +++ b/content/en/security/application_security/setup/ruby/macos.md @@ -187,5 +187,5 @@ If you encounter issues while setting up App and API Protection for your Ruby ap {{< partial name="whats-next/whats-next.html" >}} -[1]: /security/application_security/setup/ruby/compatibility +[1]: /security/application_security/setup/compatibility/ruby [2]: /security/application_security/setup/ruby/troubleshooting diff --git a/content/en/serverless/google_cloud_run/containers/in_container/dotnet.md b/content/en/serverless/google_cloud_run/containers/in_container/dotnet.md index 2988f58133d..d934986c4ab 100644 --- a/content/en/serverless/google_cloud_run/containers/in_container/dotnet.md +++ b/content/en/serverless/google_cloud_run/containers/in_container/dotnet.md @@ -84,7 +84,7 @@ logger.LogInformation("Hello World!"); ## Troubleshooting -{{% serverless-init-troubleshooting productNames="Cloud Run services" %}} +{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}} ## Further reading diff --git a/content/en/serverless/google_cloud_run/containers/in_container/go.md b/content/en/serverless/google_cloud_run/containers/in_container/go.md index 62f6c7cc095..c2d96cc4d94 100644 --- a/content/en/serverless/google_cloud_run/containers/in_container/go.md +++ b/content/en/serverless/google_cloud_run/containers/in_container/go.md @@ -79,7 +79,7 @@ go get github.com/DataDog/dd-trace-go/contrib/net/http/v2 ## Troubleshooting -{{% serverless-init-troubleshooting productNames="Cloud Run services" %}} +{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}} ## Further reading diff --git a/content/en/serverless/google_cloud_run/containers/in_container/java.md b/content/en/serverless/google_cloud_run/containers/in_container/java.md index 2691938d45f..2c3df9b2ccb 100644 --- a/content/en/serverless/google_cloud_run/containers/in_container/java.md +++ b/content/en/serverless/google_cloud_run/containers/in_container/java.md @@ -96,7 +96,7 @@ logger.info("Hello World!"); ## Troubleshooting -{{% serverless-init-troubleshooting productNames="Cloud Run services" %}} +{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}} ## Further reading diff --git a/content/en/serverless/google_cloud_run/containers/in_container/nodejs.md b/content/en/serverless/google_cloud_run/containers/in_container/nodejs.md index bff6d73a43c..603d69c13b5 100644 --- a/content/en/serverless/google_cloud_run/containers/in_container/nodejs.md +++ b/content/en/serverless/google_cloud_run/containers/in_container/nodejs.md @@ -147,7 +147,7 @@ gcloud pubsub subscriptions update \ ## Troubleshooting -{{% serverless-init-troubleshooting productNames="Cloud Run services" %}} +{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}} ## Further reading diff --git a/content/en/serverless/google_cloud_run/containers/in_container/php.md b/content/en/serverless/google_cloud_run/containers/in_container/php.md index a5f69a6ee28..f609636f4e3 100644 --- a/content/en/serverless/google_cloud_run/containers/in_container/php.md +++ b/content/en/serverless/google_cloud_run/containers/in_container/php.md @@ -63,7 +63,7 @@ apk add libgcc ## Troubleshooting -{{% serverless-init-troubleshooting productNames="Cloud Run services" %}} +{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}} ## Further reading diff --git a/content/en/serverless/google_cloud_run/containers/in_container/python.md b/content/en/serverless/google_cloud_run/containers/in_container/python.md index 0620c511d5f..426cd01d934 100644 --- a/content/en/serverless/google_cloud_run/containers/in_container/python.md +++ b/content/en/serverless/google_cloud_run/containers/in_container/python.md @@ -96,7 +96,7 @@ logger.info("Hello world!") ## Troubleshooting -{{% serverless-init-troubleshooting productNames="Cloud Run services" %}} +{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}} ## Further reading diff --git a/content/en/serverless/google_cloud_run/containers/in_container/ruby.md b/content/en/serverless/google_cloud_run/containers/in_container/ruby.md index 619649faa67..076eb6e240a 100644 --- a/content/en/serverless/google_cloud_run/containers/in_container/ruby.md +++ b/content/en/serverless/google_cloud_run/containers/in_container/ruby.md @@ -66,7 +66,7 @@ logger.info "Hello world!" ## Troubleshooting -{{% serverless-init-troubleshooting productNames="Cloud Run services" %}} +{{% serverless-init-troubleshooting productNames="Cloud Run services" in_container="true" %}} ## Further reading diff --git a/content/en/tracing/trace_collection/compatibility/java.md b/content/en/tracing/trace_collection/compatibility/java.md index 660d218eed0..4810d844da4 100644 --- a/content/en/tracing/trace_collection/compatibility/java.md +++ b/content/en/tracing/trace_collection/compatibility/java.md @@ -105,7 +105,7 @@ Integrations in Preview are disabled by default but can be enabled individually: | Ratpack | 1.5+ | Fully Supported | `ratpack` | | Restlet HTTP Server | 2.2 - 2.4 | Fully Supported | `restlet-http`. | | Spark Java | 2.3+ | [Preview](#framework-integrations-disabled-by-default) | `sparkjava` (requires `jetty`) | -| Spring Boot | 1.5+ | Fully Supported | `spring-web` or `spring-webflux` | +| Spring Boot | 1.5 - 3.X | Fully Supported | `spring-web` or `spring-webflux` | | Spring Web (MVC) | 4.0+ | Fully Supported | `spring-web` | | Spring WebFlux | 5.0+ | Fully Supported | `spring-webflux` | | Tomcat | 5.5+ | Fully Supported | `tomcat` | diff --git a/data/api/v2/full_spec.yaml b/data/api/v2/full_spec.yaml index cd47e5637db..f249d8ddf0d 100644 --- a/data/api/v2/full_spec.yaml +++ b/data/api/v2/full_spec.yaml @@ -13171,6 +13171,20 @@ components: BudgetAttributes: description: The attributes of a budget. properties: + costs: + $ref: "#/components/schemas/BudgetAttributesCosts" + description: Aggregated cost data for the budget. Present only when `actual=true` or `forecast=true` is requested. + costs_period_end: + description: The end of the period used to compute cost data, in milliseconds since epoch. + format: int64 + type: integer + costs_period_start: + description: The start of the period used to compute cost data, in milliseconds since epoch. + format: int64 + type: integer + costs_unit: + $ref: "#/components/schemas/BudgetAttributesCostsUnit" + description: The unit used for all cost values in the response. created_at: description: The timestamp when the budget was created. example: 1738258683590 @@ -13223,6 +13237,53 @@ components: example: 00000000-0a0a-0a0a-aaa0-00000000000a type: string type: object + BudgetAttributesCosts: + description: Aggregated cost data for the budget over the requested period. + properties: + actual: + description: The total actual cost. Present only when `actual=true` is requested. + format: double + nullable: true + type: number + amount: + description: The total budgeted amount over the requested period. + format: double + nullable: true + type: number + forecast: + description: The total forecast cost, with any custom forecast overrides applied. Present only when `forecast=true` is requested. + format: double + nullable: true + type: number + ootb_forecast: + description: The out-of-the-box ML forecast before custom overrides. Present only when `forecast=true` is requested. + format: double + nullable: true + type: number + type: object + BudgetAttributesCostsUnit: + description: The unit used for all cost values in the response. + properties: + family: + description: The unit family (for example, `currency`). + type: string + id: + description: The unique identifier for the unit. + type: string + name: + description: The full name of the unit. + type: string + plural: + description: The plural form of the unit name. + type: string + scale_factor: + description: The scale factor applied to raw cost values. + format: double + type: number + short_name: + description: The abbreviated unit name. + type: string + type: object BudgetValidationRequest: description: The request object for validating a budget configuration before creating or updating it. example: @@ -13388,6 +13449,9 @@ components: description: The budgeted amount for this entry. format: double type: number + costs: + $ref: "#/components/schemas/BudgetWithEntriesDataAttributesEntriesItemsCosts" + description: Cost data for this entry. Present only when `actual=true` or `forecast=true` is requested. month: description: The month this budget entry applies to, in YYYYMM format. format: int64 @@ -13398,6 +13462,36 @@ components: $ref: "#/components/schemas/BudgetWithEntriesDataAttributesEntriesItemsTagFiltersItems" type: array type: object + BudgetWithEntriesDataAttributesEntriesItemsCosts: + description: Cost data for a single budget entry. + properties: + actual: + description: The actual cost for this entry. Present only when `actual=true` is requested. + format: double + nullable: true + type: number + amount: + description: The budgeted amount for this entry. + format: double + nullable: true + type: number + custom_forecast: + description: |- + The custom forecast override for this entry. `null` when `forecast=true` is requested but no custom forecast has been set for this entry's month. A numeric value, including `0`, indicates an explicit custom forecast override. Omitted when `forecast=false` or the feature is not available for the organization. + format: double + nullable: true + type: number + forecast: + description: The final forecast for this entry, with any custom forecast override applied. Present only when `forecast=true` is requested. + format: double + nullable: true + type: number + ootb_forecast: + description: The out-of-the-box ML forecast for this entry, before custom overrides. Present only when `forecast=true` is requested. + format: double + nullable: true + type: number + type: object BudgetWithEntriesDataAttributesEntriesItemsTagFiltersItems: description: A tag filter used to scope a budget entry to specific resource tags. properties: @@ -25075,7 +25169,7 @@ components: text: "Example annotation." connectionEnvs: - connections: - - connectionId: "11111111-1111-1111-1111-111111111111" + - connectionId: "e1e64943-c7c5-4487-aece-25aaec7d3aad" label: "INTEGRATION_DATADOG" env: "default" handle: "my-handle" @@ -27070,6 +27164,156 @@ components: $ref: "#/components/schemas/CustomDestinationResponseDefinition" type: array type: object + CustomForecastEntry: + description: A monthly entry of a custom budget forecast. + properties: + amount: + description: Forecast amount for the month. + example: 400 + format: double + type: number + month: + description: Month the custom forecast entry applies to, in `YYYYMM` format. + example: 202501 + format: int64 + type: integer + tag_filters: + description: Tag filters that scope this custom forecast entry to specific resources. + items: + $ref: "#/components/schemas/CustomForecastEntryTagFilter" + type: array + required: + - month + - amount + - tag_filters + type: object + CustomForecastEntryTagFilter: + description: A tag filter that scopes a custom forecast entry to specific resource tags. + properties: + tag_key: + description: The tag key to filter on. + example: service + type: string + tag_value: + description: The tag value to filter on. + example: ec2 + type: string + required: + - tag_key + - tag_value + type: object + CustomForecastResponse: + description: Response object containing the custom forecast for a budget. + properties: + data: + $ref: "#/components/schemas/CustomForecastResponseData" + required: + - data + type: object + CustomForecastResponseData: + description: Custom forecast resource wrapper in a response. + properties: + attributes: + $ref: "#/components/schemas/CustomForecastResponseDataAttributes" + id: + description: The unique identifier of the custom forecast. + example: 11111111-1111-1111-1111-111111111111 + type: string + type: + $ref: "#/components/schemas/CustomForecastType" + required: + - id + - type + - attributes + type: object + CustomForecastResponseDataAttributes: + description: Attributes of a custom forecast. + properties: + budget_uid: + description: The UUID of the budget that this custom forecast belongs to. + example: 00000000-0000-0000-0000-000000000001 + type: string + created_at: + description: Timestamp the custom forecast was created, in Unix milliseconds. + example: 1738258683590 + format: int64 + type: integer + created_by: + description: The id of the user that created the custom forecast. + example: 00000000-0a0a-0a0a-aaa0-00000000000a + type: string + entries: + description: Monthly custom forecast entries. + items: + $ref: "#/components/schemas/CustomForecastEntry" + type: array + updated_at: + description: Timestamp the custom forecast was last updated, in Unix milliseconds. + example: 1738258683590 + format: int64 + type: integer + updated_by: + description: The id of the user that last updated the custom forecast. + example: 00000000-0a0a-0a0a-aaa0-00000000000a + type: string + required: + - budget_uid + - created_at + - updated_at + - created_by + - updated_by + - entries + type: object + CustomForecastType: + default: custom_forecast + description: The type of the custom forecast resource. Must be `custom_forecast`. + enum: + - custom_forecast + example: custom_forecast + type: string + x-enum-varnames: + - CUSTOM_FORECAST + CustomForecastUpsertRequest: + description: Request body to upsert (create or replace) the custom forecast for a budget. + properties: + data: + $ref: "#/components/schemas/CustomForecastUpsertRequestData" + required: + - data + type: object + CustomForecastUpsertRequestData: + description: Custom forecast resource wrapper in an upsert request. + properties: + attributes: + $ref: "#/components/schemas/CustomForecastUpsertRequestDataAttributes" + id: + description: Unused on upsert; the resource is keyed by `budget_uid`. Send an empty string. + example: "" + type: string + type: + $ref: "#/components/schemas/CustomForecastType" + required: + - type + - attributes + type: object + CustomForecastUpsertRequestDataAttributes: + description: Attributes of a custom forecast upsert request. + properties: + budget_uid: + description: The UUID of the budget that this custom forecast belongs to. + example: 00000000-0000-0000-0000-000000000001 + type: string + entries: + description: |- + Monthly custom forecast entries. An empty list deletes any existing + custom forecast for the budget. + items: + $ref: "#/components/schemas/CustomForecastEntry" + type: array + required: + - budget_uid + - entries + type: object CustomFrameworkControl: description: Framework Control. properties: @@ -35038,6 +35282,12 @@ components: $ref: "#/components/schemas/ExternalUserMeta" name: $ref: "#/components/schemas/ExternalUserNameType" + roles: + description: Datadog roles assigned to the user. Provide the role UUID in `value` when provisioning or updating roles through SCIM. + items: + $ref: "#/components/schemas/ExternalUserRole" + maxItems: 50 + type: array schemas: description: User JSON Schemas. example: @@ -35233,10 +35483,12 @@ components: $ref: "#/components/schemas/ExternalUserPatchRequestOperationsItemsOp" path: description: An attribute path describing the target of the operation. - example: title + example: roles type: string value: - description: New value to use for the patch operation. + description: New value to use for the patch operation. When `path` is `roles`, use an array of role objects with each role UUID in `value`. + example: + - value: 00000000-0000-0000-0000-000000000001 type: object ExternalUserPatchRequestOperationsItemsOp: description: The operation to be performed. @@ -35247,6 +35499,21 @@ components: x-enum-varnames: - ADD - REPLACE + ExternalUserRole: + description: Datadog role assigned to a SCIM user. + properties: + display: + description: Human-readable Datadog role name returned in responses. + example: Datadog Read Only Role + readOnly: true + type: string + value: + description: Datadog role UUID. + example: 00000000-0000-0000-0000-000000000001 + type: string + required: + - value + type: object FacetInfoRequest: description: Request body for retrieving facet value information for a specified attribute with optional filtering. example: @@ -41767,6 +42034,404 @@ components: - impact_hint - status type: object + GovernanceControlAttributes: + description: The attributes of a governance control. + properties: + active_detections_count: + description: The number of active detections for the control. + example: 12 + format: int64 + type: integer + category: + description: The value driver the control is grouped under, such as `security` or `cost`. + example: "security" + type: string + created_at: + description: The time the control configuration was created. + example: "2024-01-15T09:30:00Z" + format: date-time + type: string + created_by: + description: The UUID of the user who created the control configuration. + example: "11111111-2222-3333-4444-555555555555" + type: string + description: + description: A human-readable description of what the control detects. + example: "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials." + type: string + detection_frequency: + description: How often detections are evaluated for the control. + example: "daily" + type: string + detection_parameters: + $ref: "#/components/schemas/GovernanceControlParametersMap" + nullable: true + detection_type: + description: The detection type that uniquely identifies the control. + example: "unused_api_keys" + type: string + feature_flags: + description: The feature flags that gate the control. + example: [] + items: + description: A feature flag that gates the control. + type: string + type: array + insights: + description: The insight slugs associated with the control. + example: [] + items: + description: An insight slug associated with the control. + type: string + type: array + last_detection_at: + description: The time of the most recent detection for the control. `null` when there are no detections. + example: "2024-03-01T12:00:00Z" + format: date-time + nullable: true + type: string + mitigated_detections_count: + description: The number of mitigated detections for the control. + example: 3 + format: int64 + type: integer + mitigation_parameters: + $ref: "#/components/schemas/GovernanceControlParametersMap" + nullable: true + mitigation_type: + description: The configured mitigation type for the control. Empty when not configured. + example: "revoke_api_key" + type: string + mitigations: + $ref: "#/components/schemas/GovernanceControlMitigationDefinitionArray" + name: + description: Human-readable name of the control. + example: "Unused API Keys" + type: string + next_steps: + description: Guidance on the next steps to remediate detections for the control. + example: "Review and revoke API keys that are no longer in use to maintain a secure authentication posture." + type: string + notification_frequency: + description: The configured notification frequency for the control. Empty when not configured. + example: "" + type: string + notification_parameters: + $ref: "#/components/schemas/GovernanceControlParametersMap" + nullable: true + notification_type: + description: The configured notification type for the control. Empty when not configured. + example: "" + type: string + priority: + description: The priority of the control, such as `High`. + example: "High" + type: string + product: + description: The product the control belongs to. + example: "api_keys" + type: string + release_status: + description: The release status of the control, such as `prod` or `beta`. + example: "prod" + type: string + resource_type: + description: The type of resource the control evaluates. + example: "api_key" + type: string + resource_type_display_name: + description: The human-readable name of the resource type. + example: "API Key" + type: string + supported_detection_parameters: + $ref: "#/components/schemas/GovernanceControlParameterDefinitionArray" + supported_notification_parameters: + $ref: "#/components/schemas/GovernanceControlParameterDefinitionArray" + task: + description: A short description of the remediation task for the control. + example: "Review and revoke unused API keys." + type: string + type: + description: The control type, such as `Proactive` or `Detection`. + example: "Proactive" + type: string + usage_concern: + description: The usage concern the control addresses, such as `Security` or `Cost Optimization`. + example: "Security" + type: string + required: + - name + - description + - detection_type + - supported_detection_parameters + - supported_notification_parameters + - resource_type + - resource_type_display_name + - product + - category + - insights + - mitigations + - task + - next_steps + - release_status + - feature_flags + - type + - priority + - usage_concern + - detection_parameters + - detection_frequency + - notification_type + - notification_parameters + - notification_frequency + - mitigation_type + - mitigation_parameters + - created_at + - created_by + - active_detections_count + - mitigated_detections_count + - last_detection_at + type: object + GovernanceControlData: + description: A governance control resource. + properties: + attributes: + $ref: "#/components/schemas/GovernanceControlAttributes" + id: + description: The unique identifier of the control. + example: "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a" + type: string + type: + $ref: "#/components/schemas/GovernanceControlResourceType" + required: + - id + - type + - attributes + type: object + GovernanceControlMitigationDefinition: + description: The definition of a mitigation available for a control. + properties: + action_verb: + description: The verb describing the mitigation action, such as `revoke` or `delete`. + example: "revoke" + type: string + description: + description: A human-readable description of the mitigation. + example: "Automatically identifies and revokes inactive API keys to improve security and reduce potential attack surface." + type: string + execution_modes: + description: The execution modes the mitigation supports, such as `manual` or `automatic`. + example: + - "manual" + - "automatic" + items: + description: An execution mode the mitigation supports. + type: string + type: array + feature_flags: + description: The feature flags that gate the mitigation. + example: [] + items: + description: A feature flag that gates the mitigation. + type: string + type: array + id: + description: The unique identifier of the mitigation. + example: "revoke_api_key" + type: string + manual_mitigation_warning: + description: A warning shown to the user before applying the mitigation manually. + example: "These API keys will be revoked immediately upon confirmation. To revoke future API keys, you must go through this flow again." + type: string + permissions: + description: The permissions required to apply the mitigation. + example: + - "api_keys_write" + - "api_keys_delete" + items: + description: A permission required to apply the mitigation. + type: string + type: array + requires_ai: + description: Whether the mitigation requires AI to be enabled. + example: false + type: boolean + supported_parameters: + $ref: "#/components/schemas/GovernanceControlParameterDefinitionArray" + title: + description: A short, human-readable name for the mitigation. + example: "Revoke Unused API Keys" + type: string + required: + - id + - title + - description + - action_verb + - supported_parameters + - permissions + - manual_mitigation_warning + - feature_flags + - requires_ai + type: object + GovernanceControlMitigationDefinitionArray: + description: The mitigations available for a control. + items: + $ref: "#/components/schemas/GovernanceControlMitigationDefinition" + type: array + GovernanceControlParameterDefinition: + description: The definition of a configurable parameter on a control or mitigation. + properties: + default_value: + description: The default value of the parameter. The JSON type depends on the parameter's `type`. + example: 30 + description: + description: A human-readable description of the parameter. + example: "Number of days of inactivity before an API key is considered unused." + type: string + display_name: + description: The human-readable name of the parameter. + example: "Unused API Key Threshold" + type: string + hidden: + description: Whether the parameter is hidden from the UI. + example: false + type: boolean + name: + description: The machine-readable name of the parameter. + example: "api_key_threshold" + type: string + required: + description: Whether the parameter must be provided. + example: false + type: boolean + supported_values: + $ref: "#/components/schemas/GovernanceControlSupportedValueArray" + type: + description: The type of the parameter, such as `integer`, `string`, `boolean`, `enum`, or `pattern_list`. + example: "integer" + type: string + required: + - name + - display_name + - description + - type + - required + - hidden + - supported_values + - default_value + type: object + GovernanceControlParameterDefinitionArray: + description: An array of parameter definitions. + items: + $ref: "#/components/schemas/GovernanceControlParameterDefinition" + type: array + GovernanceControlParametersMap: + additionalProperties: {} + description: A free-form map of parameter names to their configured values. + type: object + GovernanceControlResourceType: + description: JSON:API resource type for a governance control. + enum: + - governance_control + example: "governance_control" + type: string + x-enum-varnames: + - GOVERNANCE_CONTROL + GovernanceControlResponse: + description: A single governance control. + properties: + data: + $ref: "#/components/schemas/GovernanceControlData" + required: + - data + type: object + GovernanceControlSupportedValue: + description: A supported value for an enumerated parameter. + properties: + label: + description: The human-readable label for the value. + example: "30 days" + type: string + value: + description: The machine-readable value. + example: "thirty" + type: string + required: + - value + - label + type: object + GovernanceControlSupportedValueArray: + description: The supported values for an enumerated parameter. + items: + $ref: "#/components/schemas/GovernanceControlSupportedValue" + type: array + GovernanceControlUpdateAttributes: + description: The attributes of a governance control that can be updated. Only the attributes present in the request are modified. + properties: + detection_frequency: + description: How often detections should be evaluated for the control. + example: "daily" + type: string + detection_parameters: + $ref: "#/components/schemas/GovernanceControlParametersMap" + nullable: true + mitigation_parameters: + $ref: "#/components/schemas/GovernanceControlParametersMap" + nullable: true + mitigation_type: + description: The mitigation type to configure for the control. + example: "revoke_api_key" + type: string + name: + description: A new human-readable name for the control. + example: "Unused API Keys" + type: string + notification_frequency: + description: The notification frequency to configure for the control. + example: "daily" + type: string + notification_parameters: + $ref: "#/components/schemas/GovernanceControlParametersMap" + nullable: true + notification_type: + description: The notification type to configure for the control. + example: "slack" + type: string + type: object + GovernanceControlUpdateData: + description: The data of a governance control update request. + properties: + attributes: + $ref: "#/components/schemas/GovernanceControlUpdateAttributes" + id: + description: The unique identifier of the control. + example: "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a" + type: string + type: + $ref: "#/components/schemas/GovernanceControlResourceType" + required: + - type + type: object + GovernanceControlUpdateRequest: + description: A request to update a governance control. + properties: + data: + $ref: "#/components/schemas/GovernanceControlUpdateData" + required: + - data + type: object + GovernanceControlsDataArray: + description: An array of governance control resources. + items: + $ref: "#/components/schemas/GovernanceControlData" + type: array + GovernanceControlsResponse: + description: A list of governance controls. + properties: + data: + $ref: "#/components/schemas/GovernanceControlsDataArray" + required: + - data + type: object GovernanceInsightAttributes: description: The attributes of a governance insight. properties: @@ -56152,6 +56817,9 @@ components: resourceType: User name: formatted: John Doe + roles: + - display: Datadog Read Only Role + value: 00000000-0000-0000-0000-000000000001 schemas: - urn:ietf:params:scim:schemas:core:2.0:User title: Mr. @@ -56169,6 +56837,9 @@ components: resourceType: User name: formatted: Jane Doe + roles: + - display: Datadog Standard Role + value: 00000000-0000-0000-0000-000000000002 schemas: - urn:ietf:params:scim:schemas:core:2.0:User title: Mrs. @@ -56229,6 +56900,12 @@ components: $ref: "#/components/schemas/ExternalUserMeta" name: $ref: "#/components/schemas/ExternalUserNameType" + roles: + description: Datadog roles assigned to the user. Provide the role UUID in `value` when provisioning or updating roles through SCIM. + items: + $ref: "#/components/schemas/ExternalUserRole" + maxItems: 50 + type: array schemas: description: User JSON Schemas. example: @@ -107200,7 +107877,7 @@ components: text: "Example annotation." connectionEnvs: - connections: - - connectionId: "11111111-1111-1111-1111-111111111111" + - connectionId: "e1e64943-c7c5-4487-aece-25aaec7d3aad" label: "INTEGRATION_DATADOG" env: "default" handle: "my-handle" @@ -125522,6 +126199,83 @@ paths: tags: - Cloud Cost Management x-menu-order: 36 + /api/v2/cost/budget/custom-forecast: + put: + description: |- + Create or replace the custom forecast for an existing budget. + Pass an empty `entries` list to delete the custom forecast for the budget. + operationId: UpsertCustomForecast + requestBody: + content: + application/json: + examples: + default: + value: + data: + attributes: + budget_uid: 00000000-0000-0000-0000-000000000001 + entries: + - amount: 400 + month: 202501 + tag_filters: + - tag_key: service + tag_value: ec2 + - amount: 450 + month: 202502 + tag_filters: + - tag_key: service + tag_value: ec2 + id: "" + type: custom_forecast + schema: + $ref: "#/components/schemas/CustomForecastUpsertRequest" + required: true + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + attributes: + budget_uid: 00000000-0000-0000-0000-000000000001 + created_at: 1738258683590 + created_by: 00000000-0a0a-0a0a-aaa0-00000000000a + entries: + - amount: 400 + month: 202501 + tag_filters: + - tag_key: service + tag_value: ec2 + - amount: 450 + month: 202502 + tag_filters: + - tag_key: service + tag_value: ec2 + updated_at: 1738258683590 + updated_by: 00000000-0a0a-0a0a-aaa0-00000000000a + id: 11111111-1111-1111-1111-111111111111 + type: custom_forecast + schema: + $ref: "#/components/schemas/CustomForecastResponse" + description: OK + "400": + $ref: "#/components/responses/BadRequestResponse" + "404": + $ref: "#/components/responses/NotFoundResponse" + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + summary: Create or replace a budget's custom forecast + tags: + - Cloud Cost Management + x-menu-order: 67 + x-unstable: |- + **Note**: This endpoint is in preview and is subject to change. + If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). /api/v2/cost/budget/validate: post: description: Validate a budget configuration without creating or modifying it @@ -125604,10 +126358,36 @@ paths: - Cloud Cost Management x-menu-order: 38 get: - description: Get a budget + description: Get a budget by ID. Pass `actual=true` or `forecast=true` to include cost data in the response. Use `start` and `end` (millisecond epochs, both required) to set the cost window. When `forecast=true`, each entry also includes `ootb_forecast` (the ML forecast before overrides) and `custom_forecast` (`null` if no override is set, a number if one is). operationId: GetBudget parameters: - $ref: "#/components/parameters/BudgetID" + - description: When `true`, includes actual cost data in the response. + in: query + name: actual + required: false + schema: + type: boolean + - description: When `true`, includes forecast cost data in the response, including `ootb_forecast` and `custom_forecast` per entry. + in: query + name: forecast + required: false + schema: + type: boolean + - description: Start of the cost window in milliseconds since epoch. Must be used together with `end`. + in: query + name: start + required: false + schema: + format: int64 + type: integer + - description: End of the cost window in milliseconds since epoch. Must be used together with `start`. + in: query + name: end + required: false + schema: + format: int64 + type: integer responses: "200": content: @@ -125617,11 +126397,31 @@ paths: value: data: attributes: + costs: + actual: 850.25 + amount: 1000.0 + forecast: 1100.5 + ootb_forecast: 1100.5 + costs_period_end: 1740873600000 + costs_period_start: 1738281600000 + costs_unit: + family: currency + id: "1" + name: dollar + plural: dollars + scale_factor: 1.0 + short_name: $ created_at: 1738258683590 created_by: 00000000-0a0a-0a0a-aaa0-00000000000a end_month: 202502 entries: - amount: 500 + costs: + actual: 425.5 + amount: 500.0 + custom_forecast: + forecast: 550.25 + ootb_forecast: 550.25 month: 202501 tag_filters: - tag_key: service @@ -125638,6 +126438,10 @@ paths: schema: $ref: "#/components/schemas/BudgetWithEntries" description: OK + "400": + $ref: "#/components/responses/BadRequestResponse" + "404": + $ref: "#/components/responses/NotFoundResponse" "429": $ref: "#/components/responses/TooManyRequestsResponse" security: @@ -125647,6 +126451,31 @@ paths: tags: - Cloud Cost Management x-menu-order: 37 + /api/v2/cost/budget/{budget_id}/custom-forecast: + delete: + description: Delete the custom forecast for a budget. + operationId: DeleteCustomForecast + parameters: + - $ref: "#/components/parameters/BudgetID" + responses: + "204": + description: No Content + "400": + $ref: "#/components/responses/BadRequestResponse" + "404": + $ref: "#/components/responses/NotFoundResponse" + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + summary: Delete a budget's custom forecast + tags: + - Cloud Cost Management + x-menu-order: 68 + x-unstable: |- + **Note**: This endpoint is in preview and is subject to change. + If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). /api/v2/cost/budgets: get: description: List budgets. @@ -135542,6 +136371,322 @@ paths: operator: OR permissions: - user_access_read + /api/v2/governance/control: + get: + description: |- + Retrieve the list of governance controls configured for the organization. Each control pairs a + detection definition with the organization's current detection, notification, and mitigation + configuration, along with counts of active and mitigated detections. + operationId: ListGovernanceControls + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + - attributes: + active_detections_count: 12 + category: "security" + created_at: "2024-01-15T09:30:00Z" + created_by: "11111111-2222-3333-4444-555555555555" + description: "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials." + detection_frequency: "daily" + detection_parameters: + api_key_threshold: 30 + detection_type: "unused_api_keys" + feature_flags: [] + insights: [] + last_detection_at: "2024-03-01T12:00:00Z" + mitigated_detections_count: 3 + mitigation_parameters: {} + mitigation_type: "" + mitigations: + - action_verb: "revoke" + description: "Automatically identifies and revokes inactive API keys to improve security and reduce potential attack surface." + execution_modes: + - "manual" + - "automatic" + feature_flags: [] + id: "revoke_api_key" + manual_mitigation_warning: "These API keys will be revoked immediately upon confirmation. To revoke future API keys, you must go through this flow again." + permissions: + - "api_keys_write" + - "api_keys_delete" + requires_ai: false + supported_parameters: [] + title: "Revoke Unused API Keys" + name: "Unused API Keys" + next_steps: "Review and revoke API keys that are no longer in use to maintain a secure authentication posture." + notification_frequency: "" + notification_parameters: {} + notification_type: "" + priority: "High" + product: "api_keys" + release_status: "prod" + resource_type: "api_key" + resource_type_display_name: "API Key" + supported_detection_parameters: + - default_value: 30 + description: "Number of days of inactivity before an API key is considered unused." + display_name: "Unused API Key Threshold" + hidden: false + name: "api_key_threshold" + required: false + supported_values: [] + type: "integer" + supported_notification_parameters: + - default_value: false + description: "Enables the Governance Console to automatically assign ownership of detections based off of tagging and other internal heuristics." + display_name: "Automatic Ownership Assignment" + hidden: false + name: "governance_auto_assignment" + required: false + supported_values: [] + type: "boolean" + task: "Review and revoke unused API keys." + type: "Proactive" + usage_concern: "Security" + id: "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a" + type: "governance_control" + schema: + $ref: "#/components/schemas/GovernanceControlsResponse" + description: OK + "400": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Bad Request + "401": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Unauthorized + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + summary: List governance controls + tags: + - Governance Controls + x-menu-order: 2 + x-unstable: |- + **Note**: This endpoint is in preview and is subject to change. + If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). + /api/v2/governance/control/{detection_type}: + get: + description: |- + Retrieve a single governance control by its detection type, including the organization's current + detection, notification, and mitigation configuration and detection counts. + operationId: GetGovernanceControl + parameters: + - description: The detection type that identifies the control, for example `unused_api_keys`. + example: "unused_api_keys" + in: path + name: detection_type + required: true + schema: + type: string + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + attributes: + active_detections_count: 12 + category: "security" + created_at: "2024-01-15T09:30:00Z" + created_by: "11111111-2222-3333-4444-555555555555" + description: "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials." + detection_frequency: "daily" + detection_parameters: + api_key_threshold: 30 + detection_type: "unused_api_keys" + feature_flags: [] + insights: [] + last_detection_at: "2024-03-01T12:00:00Z" + mitigated_detections_count: 3 + mitigation_parameters: {} + mitigation_type: "revoke_api_key" + mitigations: [] + name: "Unused API Keys" + next_steps: "Review and revoke API keys that are no longer in use to maintain a secure authentication posture." + notification_frequency: "" + notification_parameters: {} + notification_type: "" + priority: "High" + product: "api_keys" + release_status: "prod" + resource_type: "api_key" + resource_type_display_name: "API Key" + supported_detection_parameters: + - default_value: 30 + description: "Number of days of inactivity before an API key is considered unused." + display_name: "Unused API Key Threshold" + hidden: false + name: "api_key_threshold" + required: false + supported_values: [] + type: "integer" + supported_notification_parameters: [] + task: "Review and revoke unused API keys." + type: "Proactive" + usage_concern: "Security" + id: "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a" + type: "governance_control" + schema: + $ref: "#/components/schemas/GovernanceControlResponse" + description: OK + "400": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Bad Request + "401": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Unauthorized + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "404": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Not Found + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + summary: Get a governance control + tags: + - Governance Controls + x-menu-order: 3 + x-unstable: |- + **Note**: This endpoint is in preview and is subject to change. + If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). + patch: + description: |- + Update the detection, notification, and mitigation configuration of a governance control. Only + the attributes present in the request are modified. Changing the mitigation type or its + parameters may require additional permissions. + operationId: UpdateGovernanceControl + parameters: + - description: The detection type that identifies the control, for example `unused_api_keys`. + example: "unused_api_keys" + in: path + name: detection_type + required: true + schema: + type: string + requestBody: + content: + application/json: + examples: + default: + value: + data: + attributes: + detection_parameters: + api_key_threshold: 60 + mitigation_type: "revoke_api_key" + type: "governance_control" + schema: + $ref: "#/components/schemas/GovernanceControlUpdateRequest" + required: true + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + attributes: + active_detections_count: 12 + category: "security" + created_at: "2024-01-15T09:30:00Z" + created_by: "11111111-2222-3333-4444-555555555555" + description: "Identifies API keys that have not been used within your specified time threshold, helping reduce security risks from dormant credentials." + detection_frequency: "daily" + detection_parameters: + api_key_threshold: 60 + detection_type: "unused_api_keys" + feature_flags: [] + insights: [] + last_detection_at: "2024-03-01T12:00:00Z" + mitigated_detections_count: 3 + mitigation_parameters: {} + mitigation_type: "revoke_api_key" + mitigations: [] + name: "Unused API Keys" + next_steps: "Review and revoke API keys that are no longer in use to maintain a secure authentication posture." + notification_frequency: "" + notification_parameters: {} + notification_type: "" + priority: "High" + product: "api_keys" + release_status: "prod" + resource_type: "api_key" + resource_type_display_name: "API Key" + supported_detection_parameters: [] + supported_notification_parameters: [] + task: "Review and revoke unused API keys." + type: "Proactive" + usage_concern: "Security" + id: "0d4e6f8a-1b2c-3d4e-5f6a-7b8c9d0e1f2a" + type: "governance_control" + schema: + $ref: "#/components/schemas/GovernanceControlResponse" + description: OK + "400": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Bad Request + "401": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Unauthorized + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "404": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Not Found + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + summary: Update a governance control + tags: + - Governance Controls + x-menu-order: 4 + x-unstable: |- + **Note**: This endpoint is in preview and is subject to change. + If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). /api/v2/governance/insights: get: description: |- @@ -169829,6 +170974,29 @@ paths: returned: default type: boolean uniqueness: none + - description: Datadog roles assigned to the user. + multiValued: true + mutability: readWrite + name: roles + required: false + returned: default + subAttributes: + - description: Datadog role UUID. + mutability: readWrite + name: value + required: true + returned: default + type: string + uniqueness: none + - description: Human-readable Datadog role name. + mutability: readOnly + name: display + required: false + returned: default + type: string + uniqueness: none + type: complex + uniqueness: none description: User Schema id: urn:ietf:params:scim:schemas:core:2.0:User meta: @@ -169858,6 +171026,7 @@ paths: List users in the organization. Results are paginated by `startIndex` and `count` parameters. Results can be narrowed down by the `filter` parameter. + Responses include the Datadog roles assigned to each user in the `roles` attribute. operationId: ListSCIMUsers parameters: - description: |- @@ -169904,6 +171073,9 @@ paths: id: 00000000-0000-0000-0000-000000000001 name: formatted: Example Name + roles: + - display: Datadog Read Only Role + value: 00000000-0000-0000-0000-000000000001 schemas: - urn:ietf:params:scim:schemas:core:2.0:User userName: test@example.com @@ -169932,6 +171104,7 @@ paths: post: description: |- Create a new user. + To assign Datadog roles to the user, include a `roles` array containing role UUIDs in the `value` field. operationId: CreateSCIMUser requestBody: content: @@ -169946,6 +171119,8 @@ paths: value: john.doe@datadoghq.com name: formatted: John Doe + roles: + - value: 00000000-0000-0000-0000-000000000001 schemas: - urn:ietf:params:scim:schemas:core:2.0:User title: Mr. @@ -169959,6 +171134,8 @@ paths: value: john.doe@datadoghq.com name: formatted: John Doe + roles: + - value: 00000000-0000-0000-0000-000000000001 schemas: - urn:ietf:params:scim:schemas:core:2.0:User title: Mr. @@ -169981,6 +171158,9 @@ paths: id: 00000000-0000-0000-0000-000000000001 name: formatted: Example Name + roles: + - display: Datadog Read Only Role + value: 00000000-0000-0000-0000-000000000001 schemas: - urn:ietf:params:scim:schemas:core:2.0:User userName: test@example.com @@ -170035,6 +171215,7 @@ paths: get: description: |- Get a single user using the `user_uuid`. + The response includes the Datadog roles assigned to the user in the `roles` attribute. operationId: GetSCIMUser parameters: - description: None @@ -170058,6 +171239,9 @@ paths: id: 00000000-0000-0000-0000-000000000001 name: formatted: Example Name + roles: + - display: Datadog Read Only Role + value: 00000000-0000-0000-0000-000000000001 schemas: - urn:ietf:params:scim:schemas:core:2.0:User userName: test@example.com @@ -170081,6 +171265,7 @@ paths: patch: description: |- Patch the user with the given `user_uuid`. + To update Datadog roles, send an operation with `path` set to `roles` and `value` set to an array of role objects containing role UUIDs. operationId: PatchSCIMUser parameters: - description: None @@ -170099,6 +171284,10 @@ paths: - op: replace path: title value: CEO + - op: replace + path: roles + value: + - value: 00000000-0000-0000-0000-000000000001 - op: replace value: name: @@ -170111,6 +171300,10 @@ paths: - op: replace path: title value: CEO + - op: replace + path: roles + value: + - value: 00000000-0000-0000-0000-000000000001 - op: replace value: name: @@ -170135,6 +171328,9 @@ paths: id: 00000000-0000-0000-0000-000000000001 name: formatted: Example Name + roles: + - display: Datadog Read Only Role + value: 00000000-0000-0000-0000-000000000001 schemas: - urn:ietf:params:scim:schemas:core:2.0:User userName: test@example.com @@ -170162,6 +171358,7 @@ paths: put: description: |- Update the user with the given `user_uuid`. + To update Datadog roles, include a `roles` array containing role UUIDs in the `value` field. operationId: UpdateSCIMUser parameters: - description: None @@ -170184,6 +171381,8 @@ paths: id: e43536e9-33fe-43f8-90b8-d3e39a7dd6ad name: formatted: John Doe + roles: + - value: 00000000-0000-0000-0000-000000000001 schemas: - urn:ietf:params:scim:schemas:core:2.0:User title: Mr. @@ -170198,6 +171397,8 @@ paths: id: e43536e9-33fe-43f8-90b8-d3e39a7dd6ad name: formatted: John Doe + roles: + - value: 00000000-0000-0000-0000-000000000001 schemas: - urn:ietf:params:scim:schemas:core:2.0:User title: Mr. @@ -170220,6 +171421,9 @@ paths: id: 00000000-0000-0000-0000-000000000001 name: formatted: Example Name + roles: + - display: Datadog Read Only Role + value: 00000000-0000-0000-0000-000000000001 schemas: - urn:ietf:params:scim:schemas:core:2.0:User userName: test@example.com @@ -196621,7 +197825,7 @@ paths: text: Example annotation. connectionEnvs: - connections: - - connectionId: 11111111-1111-1111-1111-111111111111 + - connectionId: e1e64943-c7c5-4487-aece-25aaec7d3aad label: INTEGRATION_DATADOG env: default handle: my-handle @@ -196829,7 +198033,7 @@ paths: text: Example annotation. connectionEnvs: - connections: - - connectionId: 11111111-1111-1111-1111-111111111111 + - connectionId: e1e64943-c7c5-4487-aece-25aaec7d3aad label: INTEGRATION_DATADOG env: default handle: my-handle @@ -197379,6 +198583,12 @@ tags: description: For more information about the Datadog Google Chat integration, see the integration page. url: https://docs.datadoghq.com/integrations/google-hangouts-chat/ name: Google Chat Integration + - description: |- + Governance Controls pair a detection definition with an organization's detection, notification, + and mitigation configuration within the Governance Console. Each control reports how a class of + governance issue (such as unused API keys or unqueried metrics) is detected and remediated, along + with counts of active and mitigated detections. + name: Governance Controls - description: |- Governance Insights surface key usage, configuration, and best-practice signals for an organization within the Governance Console. Each insight reports a current value (and, diff --git a/data/api/v2/translate_actions.json b/data/api/v2/translate_actions.json index e54e3e14609..6677e010bd7 100644 --- a/data/api/v2/translate_actions.json +++ b/data/api/v2/translate_actions.json @@ -1238,6 +1238,12 @@ "ValidateCsvBudget": { "summary": "Validate CSV budget" }, + "UpsertCustomForecast": { + "description": "Create or replace the custom forecast for an existing budget.\nPass an empty `entries` list to delete the custom forecast for the budget.", + "summary": "Create or replace a budget's custom forecast", + "request_description": "", + "request_schema_description": "Request body to upsert (create or replace) the custom forecast for a budget." + }, "ValidateBudget": { "description": "Validate a budget configuration without creating or modifying it", "summary": "Validate budget", @@ -1249,9 +1255,13 @@ "summary": "Delete budget" }, "GetBudget": { - "description": "Get a budget", + "description": "Get a budget by ID. Pass `actual=true` or `forecast=true` to include cost data in the response. Use `start` and `end` (millisecond epochs, both required) to set the cost window. When `forecast=true`, each entry also includes `ootb_forecast` (the ML forecast before overrides) and `custom_forecast` (`null` if no override is set, a number if one is).", "summary": "Get budget" }, + "DeleteCustomForecast": { + "description": "Delete the custom forecast for a budget.", + "summary": "Delete a budget's custom forecast" + }, "ListBudgets": { "description": "List budgets.", "summary": "List budgets" @@ -1948,6 +1958,20 @@ "description": "Returns organizations across regions for the authenticated user. The `user_handle` query parameter must match the authenticated user's handle.", "summary": "List global orgs" }, + "ListGovernanceControls": { + "description": "Retrieve the list of governance controls configured for the organization. Each control pairs a\ndetection definition with the organization's current detection, notification, and mitigation\nconfiguration, along with counts of active and mitigated detections.", + "summary": "List governance controls" + }, + "GetGovernanceControl": { + "description": "Retrieve a single governance control by its detection type, including the organization's current\ndetection, notification, and mitigation configuration and detection counts.", + "summary": "Get a governance control" + }, + "UpdateGovernanceControl": { + "description": "Update the detection, notification, and mitigation configuration of a governance control. Only\nthe attributes present in the request are modified. Changing the mitigation type or its\nparameters may require additional permissions.", + "summary": "Update a governance control", + "request_description": "", + "request_schema_description": "A request to update a governance control." + }, "ListGovernanceInsights": { "description": "Retrieve the list of governance insights available to the organization. By default, only\ninsight metadata is returned; pass `withValues=true` to also compute and include each\ninsight's current and previous values. Insights can be filtered by product.", "summary": "List governance insights" @@ -4742,11 +4766,11 @@ "summary": "Get schema" }, "ListSCIMUsers": { - "description": "List users in the organization.\nResults are paginated by `startIndex` and `count` parameters.\nResults can be narrowed down by the `filter` parameter.", + "description": "List users in the organization.\nResults are paginated by `startIndex` and `count` parameters.\nResults can be narrowed down by the `filter` parameter.\nResponses include the Datadog roles assigned to each user in the `roles` attribute.", "summary": "List users" }, "CreateSCIMUser": { - "description": "Create a new user.", + "description": "Create a new user.\nTo assign Datadog roles to the user, include a `roles` array containing role UUIDs in the `value` field.", "summary": "Create user", "request_description": "", "request_schema_description": "Definition of a user." @@ -4756,17 +4780,17 @@ "summary": "Delete user" }, "GetSCIMUser": { - "description": "Get a single user using the `user_uuid`.", + "description": "Get a single user using the `user_uuid`.\nThe response includes the Datadog roles assigned to the user in the `roles` attribute.", "summary": "Get user" }, "PatchSCIMUser": { - "description": "Patch the user with the given `user_uuid`.", + "description": "Patch the user with the given `user_uuid`.\nTo update Datadog roles, send an operation with `path` set to `roles` and `value` set to an array of role objects containing role UUIDs.", "summary": "Patch user", "request_description": "", "request_schema_description": "Request object for patching a user." }, "UpdateSCIMUser": { - "description": "Update the user with the given `user_uuid`.", + "description": "Update the user with the given `user_uuid`.\nTo update Datadog roles, include a `roles` array containing role UUIDs in the `value` field.", "summary": "Update user", "request_description": "", "request_schema_description": "Definition of a user." diff --git a/data/api/v2/translate_tags.json b/data/api/v2/translate_tags.json index 65785e0df81..b4e27272915 100644 --- a/data/api/v2/translate_tags.json +++ b/data/api/v2/translate_tags.json @@ -223,6 +223,10 @@ "name": "Google Chat Integration", "description": "Configure your [Datadog Google Chat integration](https://docs.datadoghq.com/integrations/google-hangouts-chat/)\ndirectly through the Datadog API." }, + "governance-controls": { + "name": "Governance Controls", + "description": "Governance Controls pair a detection definition with an organization's detection, notification,\nand mitigation configuration within the Governance Console. Each control reports how a class of\ngovernance issue (such as unused API keys or unqueried metrics) is detected and remediated, along\nwith counts of active and mitigated detections." + }, "governance-insights": { "name": "Governance Insights", "description": "Governance Insights surface key usage, configuration, and best-practice signals for an\norganization within the Governance Console. Each insight reports a current value (and,\noptionally, a previous value for comparison) along with the query used to compute it, so\nthat the Console can render trends and highlight areas that need attention." diff --git a/data/reference/functions.json b/data/reference/functions.json index 0f0a47e85f2..74a270679f9 100644 --- a/data/reference/functions.json +++ b/data/reference/functions.json @@ -435,8 +435,40 @@ }, { "title": "Chunks do not respect unicode code point boundaries", - "source": "chunks(\"ab你好\", 4)", - "return": "[\"ab�\",\"�好\"]" + "source": "chunks(\"ab\u4f60\u597d\", 4)", + "return": "[\"ab\ufffd\",\"\ufffd\u597d\"]" + } + ], + "deprecated": false, + "pure": true + }, + { + "anchor": "pop", + "name": "pop", + "category": "Array", + "description": "Removes the last item from the `value` array, returning a new array without the last element.", + "notices": [], + "arguments": [ + { + "name": "value", + "description": "The array to pop from.", + "required": true, + "type": [ + "array" + ] + } + ], + "internal_failure_reasons": [], + "return": { + "types": [ + "array" + ] + }, + "examples": [ + { + "title": "Pop an item from an array", + "source": "pop([1, 2, 3])", + "return": "[1,2]" } ], "deprecated": false, @@ -2493,12 +2525,12 @@ }, { "title": "UTF-8 string with bytes segmentation", - "source": "floor(shannon_entropy(\"test123%456.فوائد.net.\"), precision: 4)", + "source": "floor(shannon_entropy(\"test123%456.\u0641\u0648\u0627\u0626\u062f.net.\"), precision: 4)", "return": "4.0784" }, { "title": "UTF-8 string with grapheme segmentation", - "source": "floor(shannon_entropy(\"test123%456.فوائد.net.\", segmentation: \"grapheme\"), precision: 4)", + "source": "floor(shannon_entropy(\"test123%456.\u0641\u0648\u0627\u0626\u062f.net.\", segmentation: \"grapheme\"), precision: 4)", "return": "3.9362" } ], @@ -2556,12 +2588,12 @@ "examples": [ { "title": "Sieve with regex", - "source": "sieve(\"test123%456.فوائد.net.\", r'[a-z0-9.]')", + "source": "sieve(\"test123%456.\u0641\u0648\u0627\u0626\u062f.net.\", r'[a-z0-9.]')", "return": "\"test123456..net.\"" }, { "title": "Custom replacements", - "source": "sieve(\"test123%456.فوائد.net.\", r'[a-z.0-9]', replace_single: \"X\", replace_repeated: \"\")", + "source": "sieve(\"test123%456.\u0641\u0648\u0627\u0626\u062f.net.\", r'[a-z.0-9]', replace_single: \"X\", replace_repeated: \"\")", "return": "\"test123X456..net.\"" } ], @@ -3509,7 +3541,7 @@ "examples": [ { "title": "strlen", - "source": "strlen(\"ñandú\")", + "source": "strlen(\"\u00f1and\u00fa\")", "return": "5" } ], @@ -3943,17 +3975,17 @@ { "title": "Decode EUC-KR string", "source": "decode_charset!(decode_base64!(\"vsiz58fPvLy/5A==\"), \"euc-kr\")", - "return": "\"안녕하세요\"" + "return": "\"\uc548\ub155\ud558\uc138\uc694\"" }, { "title": "Decode EUC-JP string", "source": "decode_charset!(decode_base64!(\"pLOk86TLpMGkzw==\"), \"euc-jp\")", - "return": "\"こんにちは\"" + "return": "\"\u3053\u3093\u306b\u3061\u306f\"" }, { "title": "Decode GB2312 string", "source": "decode_charset!(decode_base64!(\"xOO6ww==\"), \"gb2312\")", - "return": "\"你好\"" + "return": "\"\u4f60\u597d\"" } ], "deprecated": false, @@ -4140,7 +4172,7 @@ { "title": "Decode a punycode encoded internationalized domain name", "source": "decode_punycode!(\"www.xn--caf-dma.com\")", - "return": "\"www.café.com\"" + "return": "\"www.caf\u00e9.com\"" }, { "title": "Decode an ASCII only string", @@ -4150,7 +4182,7 @@ { "title": "Ignore validation", "source": "decode_punycode!(\"xn--8hbb.xn--fiba.xn--8hbf.xn--eib.\", validate: false)", - "return": "\"١٠.٦٦.٣٠.٥.\"" + "return": "\"\u0661\u0660.\u0666\u0666.\u0663\u0660.\u0665.\"" } ], "deprecated": false, @@ -4389,17 +4421,17 @@ "examples": [ { "title": "Encode UTF8 string to EUC-KR", - "source": "encode_base64(encode_charset!(\"안녕하세요\", \"euc-kr\"))", + "source": "encode_base64(encode_charset!(\"\uc548\ub155\ud558\uc138\uc694\", \"euc-kr\"))", "return": "\"vsiz58fPvLy/5A==\"" }, { "title": "Encode UTF8 string to EUC-JP", - "source": "encode_base64(encode_charset!(\"こんにちは\", \"euc-jp\"))", + "source": "encode_base64(encode_charset!(\"\u3053\u3093\u306b\u3061\u306f\", \"euc-jp\"))", "return": "\"pLOk86TLpMGkzw==\"" }, { "title": "Encode UTF8 string to GB2312", - "source": "encode_base64(encode_charset!(\"你好\", \"gb2312\"))", + "source": "encode_base64(encode_charset!(\"\u4f60\u597d\", \"gb2312\"))", "return": "\"xOO6ww==\"" } ], @@ -4818,12 +4850,12 @@ "examples": [ { "title": "Encode an internationalized domain name", - "source": "encode_punycode!(\"www.café.com\")", + "source": "encode_punycode!(\"www.caf\u00e9.com\")", "return": "\"www.xn--caf-dma.com\"" }, { "title": "Encode an internationalized domain name with mixed case", - "source": "encode_punycode!(\"www.CAFé.com\")", + "source": "encode_punycode!(\"www.CAF\u00e9.com\")", "return": "\"www.xn--caf-dma.com\"" }, { @@ -6176,6 +6208,110 @@ } ], "IP": [ + { + "anchor": "decrypt_ip", + "name": "decrypt_ip", + "category": "IP", + "description": "Decrypts an IP address encrypted with `encrypt_ip`, returning the original IP address.\n\nSupported modes:\n\n* `aes128` - Reverses AES-128 ipcrypt-deterministic encryption. Key must be exactly 16 bytes.\n* `pfx` - Reverses prefix-preserving ipcrypt-pfx encryption. Key must be exactly 32 bytes.\n\nThe key and mode must match those used during encryption.", + "notices": [], + "arguments": [ + { + "name": "ip", + "description": "The encrypted IP address to decrypt (IPv4 or IPv6).", + "required": true, + "type": [ + "string" + ] + }, + { + "name": "key", + "description": "The decryption key as raw bytes. Must match the key used for encryption: 16 bytes for `aes128`, 32 bytes for `pfx`.", + "required": true, + "type": [ + "string" + ] + }, + { + "name": "mode", + "description": "The decryption mode: `aes128` or `pfx`. Must match the mode used for encryption.", + "required": true, + "type": [ + "string" + ] + } + ], + "internal_failure_reasons": [ + "`ip` is not a valid IP address.", + "`mode` is not a supported mode (`aes128` or `pfx`).", + "`key` length does not match the mode requirements (16 bytes for `aes128`, 32 bytes for `pfx`)." + ], + "return": { + "types": [ + "string" + ] + }, + "examples": [ + { + "title": "Decrypt an encrypted IPv4 address", + "source": "decrypt_ip!(\"72b9:a747:f2e9:72af:76ca:5866:6dcf:c3b0\", key: \"sixteen byte key\", mode: \"aes128\")", + "return": "\"192.168.1.1\"" + } + ], + "deprecated": false, + "pure": true + }, + { + "anchor": "encrypt_ip", + "name": "encrypt_ip", + "category": "IP", + "description": "Encrypts an IP address, transforming it into a different valid IP address of the same version.\n\nSupported modes:\n\n* `aes128` - Scrambles the IP using AES-128 encryption (ipcrypt-deterministic). Accepts IPv4 or IPv6; key must be exactly 16 bytes.\n* `pfx` - Prefix-preserving encryption (ipcrypt-pfx), that maintains network hierarchy so addresses in the same subnet encrypt to addresses sharing the same prefix. Key must be exactly 32 bytes.\n\nEncryption is deterministic: the same input IP, key, and mode always produce the same output.", + "notices": [], + "arguments": [ + { + "name": "ip", + "description": "The IP address to encrypt (IPv4 or IPv6).", + "required": true, + "type": [ + "string" + ] + }, + { + "name": "key", + "description": "The encryption key as raw bytes. Must be 16 bytes for `aes128` mode or 32 bytes for `pfx` mode.", + "required": true, + "type": [ + "string" + ] + }, + { + "name": "mode", + "description": "The encryption mode: `aes128` or `pfx`.", + "required": true, + "type": [ + "string" + ] + } + ], + "internal_failure_reasons": [ + "`ip` is not a valid IP address.", + "`mode` is not a supported mode (`aes128` or `pfx`).", + "`key` length does not match the mode requirements (16 bytes for `aes128`, 32 bytes for `pfx`)." + ], + "return": { + "types": [ + "string" + ] + }, + "examples": [ + { + "title": "Encrypt an IPv4 address", + "source": "encrypt_ip!(\"192.168.1.1\", key: \"sixteen byte key\", mode: \"aes128\")", + "return": "\"72b9:a747:f2e9:72af:76ca:5866:6dcf:c3b0\"" + } + ], + "deprecated": false, + "pure": true + }, { "anchor": "ip_aton", "name": "ip_aton", @@ -7397,7 +7533,7 @@ "enum": { "ns": "Nanoseconds (1 billion nanoseconds in a second)", "us": "Microseconds (1 million microseconds in a second)", - "µs": "Microseconds (1 million microseconds in a second)", + "\u00b5s": "Microseconds (1 million microseconds in a second)", "ms": "Milliseconds (1 thousand microseconds in a second)", "cs": "Centiseconds (100 centiseconds in a second)", "ds": "Deciseconds (10 deciseconds in a second)", @@ -7775,7 +7911,7 @@ }, { "name": "lossy", - "description": "Whether to parse the JSON in a lossy manner. Replaces invalid UTF-8 characters\nwith the Unicode character `�` (U+FFFD) if set to true, otherwise returns an error\nif there are any invalid UTF-8 characters present.", + "description": "Whether to parse the JSON in a lossy manner. Replaces invalid UTF-8 characters\nwith the Unicode character `\ufffd` (U+FFFD) if set to true, otherwise returns an error\nif there are any invalid UTF-8 characters present.", "required": false, "default": true, "type": [ @@ -8512,12 +8648,12 @@ }, { "title": "Parse URL with internationalized domain name", - "source": "parse_url!(\"https://www.café.com\")", + "source": "parse_url!(\"https://www.caf\u00e9.com\")", "return": "{\"scheme\":\"https\",\"username\":\"\",\"password\":\"\",\"host\":\"www.xn--caf-dma.com\",\"port\":null,\"path\":\"/\",\"query\":{},\"fragment\":null}" }, { "title": "Parse URL with mixed case internationalized domain name", - "source": "parse_url!(\"https://www.CAFé.com\")", + "source": "parse_url!(\"https://www.CAF\u00e9.com\")", "return": "{\"scheme\":\"https\",\"username\":\"\",\"password\":\"\",\"host\":\"www.xn--caf-dma.com\",\"port\":null,\"path\":\"/\",\"query\":{},\"fragment\":null}" } ], @@ -9235,5 +9371,77 @@ "deprecated": false, "pure": true } + ], + "Map": [ + { + "anchor": "haversine", + "name": "haversine", + "category": "Map", + "description": "Calculates the [haversine](https://en.wikipedia.org/wiki/Haversine_formula) great-circle distance and bearing between two geographic coordinates.", + "notices": [], + "arguments": [ + { + "name": "latitude1", + "description": "Latitude of the first point in decimal degrees.", + "required": true, + "type": [ + "float" + ] + }, + { + "name": "longitude1", + "description": "Longitude of the first point in decimal degrees.", + "required": true, + "type": [ + "float" + ] + }, + { + "name": "latitude2", + "description": "Latitude of the second point in decimal degrees.", + "required": true, + "type": [ + "float" + ] + }, + { + "name": "longitude2", + "description": "Longitude of the second point in decimal degrees.", + "required": true, + "type": [ + "float" + ] + }, + { + "name": "measurement_unit", + "description": "Unit for the returned distance: `kilometers` or `miles`.", + "required": false, + "type": [ + "string" + ], + "default": "kilometers" + } + ], + "internal_failure_reasons": [], + "return": { + "types": [ + "object" + ] + }, + "examples": [ + { + "title": "Calculate distance and bearing in kilometers", + "source": "haversine(0.0, 0.0, 10.0, 10.0)", + "return": "{\"bearing\":44.561,\"distance\":1568.5227233}" + }, + { + "title": "Calculate distance in miles", + "source": "haversine(0.0, 0.0, 10.0, 10.0, measurement_unit: \"miles\")", + "return": "{\"bearing\":44.561,\"distance\":974.6348468}" + } + ], + "deprecated": false, + "pure": true + } ] -} \ No newline at end of file +} diff --git a/data/synthetics_worker_versions.json b/data/synthetics_worker_versions.json index d867354334a..51f1880e141 100644 --- a/data/synthetics_worker_versions.json +++ b/data/synthetics_worker_versions.json @@ -1,6 +1,6 @@ [ { "client": "synthetics-windows-pl", - "version": "1.68.0" + "version": "1.69.0" } ] \ No newline at end of file diff --git a/layouts/_default/list.partners.json b/layouts/_default/list.partners.json index 8b65cc7e4ed..09b8128677d 100644 --- a/layouts/_default/list.partners.json +++ b/layouts/_default/list.partners.json @@ -1,4 +1,4 @@ -{{- if (or (eq hugo.Environment "live") (in (slice "typesense_sync_preview:manual") (os.Getenv "CI_JOB_NAME" | default "" ))) -}} +{{- if (in (slice "live" "preview") hugo.Environment) -}} {{ $.Scratch.Add "partners_collection" slice }} {{- range where .Site.AllPages "Type" "=" "partners" -}} diff --git a/layouts/_default/list.search.json b/layouts/_default/list.search.json index 54645fd3da9..f742ac6522a 100644 --- a/layouts/_default/list.search.json +++ b/layouts/_default/list.search.json @@ -1,4 +1,4 @@ -{{- if (or (eq hugo.Environment "live") (eq hugo.Environment "preview") (in (slice "typesense_sync_preview:manual" "algolia_sync_preview:manual") (os.Getenv "CI_JOB_NAME" | default "" ))) -}} +{{- if (in (slice "live" "preview") hugo.Environment) -}} {{ $.Scratch.Add "algoliaindex" slice }} {{ $section := $.Site.GetPage "section" .Section }} {{ $hugo_context := . }} diff --git a/layouts/shortcodes/aap/aap_and_api_protection_dotnet_overview.md b/layouts/shortcodes/aap/aap_and_api_protection_dotnet_overview.md index 7035c753937..645272fc702 100644 --- a/layouts/shortcodes/aap/aap_and_api_protection_dotnet_overview.md +++ b/layouts/shortcodes/aap/aap_and_api_protection_dotnet_overview.md @@ -3,7 +3,7 @@ ## Overview App and API Protection leverages the [Datadog .NET library](https://github.com/DataDog/dd-trace-dotnet/) to monitor and secure your .NET service. The library integrates seamlessly with your existing application without requiring code changes. -For detailed compatibility information, including supported .NET versions, frameworks, and deployment environments, see [.NET Compatibility Requirements](/security/application_security/setup/dotnet/compatibility). +For detailed compatibility information, including supported .NET versions, frameworks, and deployment environments, see [.NET Compatibility Requirements](/security/application_security/setup/compatibility/dotnet). {{ if $showSetup }} This guide explains how to set up App and API Protection (AAP) for .NET applications. The setup involves: diff --git a/layouts/shortcodes/aap/aap_and_api_protection_nodejs_overview.md b/layouts/shortcodes/aap/aap_and_api_protection_nodejs_overview.md index d1cff92241d..c89fbb8d002 100644 --- a/layouts/shortcodes/aap/aap_and_api_protection_nodejs_overview.md +++ b/layouts/shortcodes/aap/aap_and_api_protection_nodejs_overview.md @@ -3,7 +3,7 @@ ## Overview App and API Protection works by leveraging the [Datadog Node.js library](https://github.com/DataDog/dd-trace-js/) to monitor and secure your Node.js service. The library integrates seamlessly with your existing application without requiring code changes. -For detailed compatibility information, including supported Node.js versions, frameworks, and deployment environments, see [Node.js Compatibility Requirements](/security/application_security/setup/nodejs/compatibility). +For detailed compatibility information, including supported Node.js versions, frameworks, and deployment environments, see [Node.js Compatibility Requirements](/security/application_security/setup/compatibility/nodejs). {{ if $showSetup }} This guide explains how to set up App and API Protection (AAP) for Node.js applications. The setup involves: diff --git a/layouts/shortcodes/app-and-api-protection-ruby-overview.md b/layouts/shortcodes/app-and-api-protection-ruby-overview.md index d539be87d00..9b823009d22 100644 --- a/layouts/shortcodes/app-and-api-protection-ruby-overview.md +++ b/layouts/shortcodes/app-and-api-protection-ruby-overview.md @@ -4,7 +4,7 @@ App and API Protection works by leveraging the [Datadog Ruby library](https://github.com/DataDog/dd-trace-rb/) to monitor and secure your Ruby service. The library integrates seamlessly with your existing application without requiring code changes. -For detailed compatibility information, including supported Ruby versions, frameworks, and deployment environments, see [Ruby Compatibility Requirements](/security/application_security/setup/ruby/compatibility). +For detailed compatibility information, including supported Ruby versions, frameworks, and deployment environments, see [Ruby Compatibility Requirements](/security/application_security/setup/compatibility/ruby). {{ if $showSetup }} This guide explains how to set up App and API Protection (AAP) for Ruby applications. The setup involves: diff --git a/layouts/shortcodes/app_and_api_protection_java_overview.md b/layouts/shortcodes/app_and_api_protection_java_overview.md index 7197c8b8299..81379e76ba5 100644 --- a/layouts/shortcodes/app_and_api_protection_java_overview.md +++ b/layouts/shortcodes/app_and_api_protection_java_overview.md @@ -3,7 +3,7 @@ ## Overview App and API Protection leverages the [Datadog Java library](https://github.com/DataDog/dd-trace-java/) to monitor and secure your Java service. The library integrates seamlessly with your existing application without requiring code changes. -For detailed compatibility information, including supported Java versions, frameworks, and deployment environments, see [Java Compatibility Requirements](/security/application_security/setup/java/compatibility). +For detailed compatibility information, including supported Java versions, frameworks, and deployment environments, see [Java Compatibility Requirements](/security/application_security/setup/compatibility/java). {{ if $showSetup }} This guide explains how to set up App and API Protection (AAP) for Java applications. The setup involves: diff --git a/layouts/shortcodes/app_and_api_protection_php_overview.md b/layouts/shortcodes/app_and_api_protection_php_overview.md index 65f14ae76af..b54b80f5d20 100644 --- a/layouts/shortcodes/app_and_api_protection_php_overview.md +++ b/layouts/shortcodes/app_and_api_protection_php_overview.md @@ -3,7 +3,7 @@ ## Overview App and API Protection leverages the [Datadog PHP library](https://github.com/DataDog/dd-trace-php/) to monitor and secure your PHP service. The library integrates seamlessly with your existing application without requiring code changes. -For detailed compatibility information, including supported PHP versions, frameworks, and deployment environments, see [PHP Compatibility Requirements](/security/application_security/setup/php/compatibility). +For detailed compatibility information, including supported PHP versions, frameworks, and deployment environments, see [PHP Compatibility Requirements](/security/application_security/setup/compatibility/php). {{ if $showSetup }} This guide explains how to set up App and API Protection (AAP) for PHP applications. The setup involves: diff --git a/layouts/shortcodes/app_and_api_protection_python_overview.md b/layouts/shortcodes/app_and_api_protection_python_overview.md index 0de4ead1943..ebc73c7c4be 100644 --- a/layouts/shortcodes/app_and_api_protection_python_overview.md +++ b/layouts/shortcodes/app_and_api_protection_python_overview.md @@ -3,7 +3,7 @@ ## Overview App and API Protection leverages the [Datadog Python library](https://github.com/DataDog/dd-trace-py/) to monitor and secure your Python service. The library integrates seamlessly with your existing application without requiring code changes. -For detailed compatibility information, including supported Python versions, frameworks, and deployment environments, see [Python Compatibility Requirements](/security/application_security/setup/python/compatibility). +For detailed compatibility information, including supported Python versions, frameworks, and deployment environments, see [Python Compatibility Requirements](/security/application_security/setup/compatibility/python). {{ if $showSetup }} This guide explains how to set up App and API Protection (AAP) for Python applications. The setup involves: diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/android.mdoc.md new file mode 100644 index 00000000000..e32b4b5f331 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/android.mdoc.md @@ -0,0 +1,13 @@ +### Track attributes + +```kotlin +// Adds an attribute to all future RUM events +GlobalRumMonitor.get().addAttribute(key, value) + +// Removes an attribute to all future RUM events +GlobalRumMonitor.get().removeAttribute(key) +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/android +[3]: /real_user_monitoring/android/data_collected diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/flutter.mdoc.md new file mode 100644 index 00000000000..6bba5ee4092 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/flutter.mdoc.md @@ -0,0 +1,9 @@ +### Set a custom global attribute + +To set a custom global attribute, use `DdRum.addAttribute`. + +* To add or update an attribute, use `DdRum.addAttribute`. +* To remove the key, use `DdRum.removeAttribute`. + +[1]: https://app.datadoghq.com/rum/application/create +[14]: /real_user_monitoring/application_monitoring/flutter/data_collected diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/ios.mdoc.md new file mode 100644 index 00000000000..cef6393d089 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/ios.mdoc.md @@ -0,0 +1,15 @@ +### Set a custom global attribute + +To set a custom global attribute, use `RUMMonitor.shared().addAttribute(forKey:value:)`. + +* To add an attribute, use `RUMMonitor.shared().addAttribute(forKey: "", value: "")`. +* To update the value, use `RUMMonitor.shared().addAttribute(forKey: "", value: "")`. +* To remove the key, use `RUMMonitor.shared().removeAttribute(forKey: "")`. + +For better performance in bulk operations (modifying multiple attributes at once), use `.addAttributes(_:)` and `.removeAttributes(forKeys:)`. + +**Note**: You can't create facets on custom attributes if you use spaces or special characters in your key names. For example, use `forKey: "store_id"` instead of `forKey: "Store ID"`. + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/ios +[6]: /real_user_monitoring/application_monitoring/ios/data_collected/?tab=session#default-attributes diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/kotlin_multiplatform.mdoc.md new file mode 100644 index 00000000000..030db2df492 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/kotlin_multiplatform.mdoc.md @@ -0,0 +1,12 @@ +### Track attributes + +```kotlin +// Adds an attribute to all future RUM events +GlobalRumMonitor.get().addAttribute(key, value) + +// Removes an attribute to all future RUM events +GlobalRumMonitor.get().removeAttribute(key) +``` + +[1]: https://app.datadoghq.com/rum/application/create +[3]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/react_native.mdoc.md new file mode 100644 index 00000000000..af9ce01c9a1 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/react_native.mdoc.md @@ -0,0 +1,52 @@ +### Global attributes + +You can keep global attributes to track information about a specific session, such as A/B testing configuration, ad campaign origin, or cart status. These attributes are attached to all future Logs, Spans, and RUM events. + +**Add multiple global attributes** + +Use `addAttributes` to add or update several attributes at once. + +```js +DdSdkReactNative.addAttributes({ + profile_mode: 'wall', + chat_enabled: true, + campaign_origin: 'example_ad_network' +}); +``` + +**Add a single global attribute** + +Use `addAttribute` when you want to add or update a single attribute. + +```js +DdSdkReactNative.addAttribute('profile_mode', 'wall'); +DdSdkReactNative.addAttribute('chat_enabled', true); +``` + +If the attribute already exists, its value is overwritten. + +**Remove a single global attribute** + +Use `removeAttribute` to remove a specific attribute from the global context. + +```js +DdSdkReactNative.removeAttribute('campaign_origin'); +``` + +After removal, the attribute is no longer attached to future Logs, Spans, or RUM events. + +**Remove multiple global attributes** + +Use `removeAttributes` to remove several attributes at once. + +```js +DdSdkReactNative.removeAttributes([ + 'profile_mode', + 'chat_enabled' +]); +``` + +This is useful when cleaning up session-specific data, such as when a user logs out or exits a feature flow. + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/react_native diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/roku.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/roku.mdoc.md new file mode 100644 index 00000000000..9a839614754 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/roku.mdoc.md @@ -0,0 +1,10 @@ +### Track custom global attributes + +In addition to the default attributes captured by the SDK automatically, you can choose to add additional contextual information, such as custom attributes, to your Logs and RUM events to enrich your observability within Datadog. Custom attributes allow you to filter and group information about observed user behavior (for example by cart value, merchant tier, or ad campaign) with code-level information (such as backend services, session timeline, error logs, and network health). + +```text + m.global.setField("datadogContext", { foo: "Some value", bar: 123}) +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/roku/setup diff --git a/layouts/shortcodes/mdoc/en/sdk/add_custom_context/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/unity.mdoc.md new file mode 100644 index 00000000000..74317147c51 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/add_custom_context/unity.mdoc.md @@ -0,0 +1,9 @@ +### Set a custom global attribute + +To set a custom global attribute, use `DdRum.AddAttribute`. + +* To add or update an attribute, use `DdRum.AddAttribute`. +* To remove the key, use `DdRum.RemoveAttribute`. + +[1]: https://app.datadoghq.com/rum/application/create +[3]: /real_user_monitoring/application_monitoring/unity/data_collected/ diff --git a/layouts/shortcodes/mdoc/en/sdk/advanced_config/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/advanced_config/flutter.mdoc.md index b18b0e3e7af..e7464a5b023 100644 --- a/layouts/shortcodes/mdoc/en/sdk/advanced_config/flutter.mdoc.md +++ b/layouts/shortcodes/mdoc/en/sdk/advanced_config/flutter.mdoc.md @@ -66,7 +66,7 @@ The flavor (variant) of the application. For stack trace deobfuscation, this mus `firstPartyHosts` : Optional **Type**: List<String> -A list of first party hosts, used in conjunction with Datadog network tracking packages. Overrides any values set in `firstPartyHostsWithTracinHeaders`. To specify different headers per host, use `firstPartyHostsWithTracingHeaders` instead. +A list of first party hosts, used in conjunction with Datadog network tracking packages. Overrides any values set in `firstPartyHostsWithTracingHeaders`. To specify different headers per host, use `firstPartyHostsWithTracingHeaders` instead. `firstPartyHostsWithTracingHeaders` : Optional @@ -208,9 +208,44 @@ To enable Datadog [distributed tracing][13], you must set the `DatadogConfigurat - `DatadogRumConfiguration.traceSampleRate` sets a default sampling rate of 20%. If you want all resources requests to generate a full distributed trace, set this value to `100.0`. +### Capture resource headers + +When [tracking resources automatically][10], you can capture HTTP request and response headers on RUM Resources by setting `trackResourceHeaders` on `DatadogRumConfiguration`. This option applies to all Datadog HTTP tracking clients (Tracking HTTP Client, `DatadogClient`, Dio Interceptor, and GQL Link), but does not apply to the gRPC Interceptor. This option is disabled by default. + +Captured headers appear on the RUM Resource event under `resource.request.headers` and `resource.response.headers`. You can query them in the RUM Explorer. + +```dart +DatadogRumConfiguration( + applicationId: '', + trackResourceHeaders: ResourceHeadersExtractor(), +) +``` + +With no arguments, `ResourceHeadersExtractor` captures a predefined set of safe headers: + +| Direction | Headers | +|-----------|---------| +| Request | `cache-control`, `content-type` | +| Response | `age`, `cache-control`, `content-encoding`, `content-length`, `content-type`, `etag`, `expires`, `server-timing`, `vary`, `x-cache` | + +To capture additional headers in addition to the defaults, pass them through `captureHeaders`. To skip the defaults, set `includeDefaults: false`. + +```dart +DatadogRumConfiguration( + applicationId: '', + trackResourceHeaders: ResourceHeadersExtractor( + captureHeaders: ['x-request-id', 'x-custom-header'], + ), +) +``` + +{% alert level="info" %} +Sensitive headers, such as tokens and API keys, are filtered out automatically, even if you list them explicitly. +{% /alert %} + ### Track resources from other packages -While `Datadog Tracking HTTP Client` can track most common network calls in Flutter, Datadog supplies packages for integration into specific networking libraries, including gRPC, GraphQL and Dio. For more information about these libraries, see [Integrated Libraries][22]. +While [Datadog Tracking HTTP Client][10] can track most common network calls in Flutter, Datadog supplies packages for integration into specific networking libraries, including gRPC, GraphQL and Dio. For more information about these libraries, see [Integrated Libraries][22]. ## Enrich user sessions diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/android.mdoc.md new file mode 100644 index 00000000000..5516cd7d0e2 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/android.mdoc.md @@ -0,0 +1,79 @@ +## Event and data management + +The Android SDK first stores events and only uploads events when the [intake specifications][8] conditions are met. + +### Clear all data + +You have the option of deleting all unsent data stored by the SDK with the `clearAllData` API. + +```kotlin +fun clearAllData(sdkCore: SdkCore = getInstance()) { + sdkCore.clearAllData() +} +``` + +### Stop data collection + +You can use the `StopInstance` API to stop the SDK instance assigned to the given name (or the default instance if the name is null) from collecting and uploading data further. + +```kotlin +fun stopInstance(instanceName: String? = null) { + synchronized(registry) { + val instance = registry.unregister(instanceName) + (instance as? DatadogCore)?.stop() + } +} +``` + +### Control event buildup + +Many operations, such as data processing and event I/O, are queued in background threads to handle edge cases where the queue has grown so much that there could be delayed processing, high memory usage, or Application Not Responding (ANR) errors. + +You can control the buildup of events on the SDK with the `setBackpressureStrategy` API. This API ignores new tasks if a queue reaches 1024 items. + +```kotlin +fun setBackpressureStrategy(backpressureStrategy: BackPressureStrategy): Builder { + coreConfig = coreConfig.copy(backpressureStrategy = backpressureStrategy) + return this +} +``` + +See an [example of this API][9] being used. + +### Set remote log threshold + +You can define the minimum log level (priority) to send events to Datadog in a logger instance. If the log priority is below the one you set at this threshold, it does not get sent. The default value is -1 (allow all). + +```kotlin +fun setRemoteLogThreshold(minLogThreshold: Int): Builder { + minDatadogLogsPriority = minLogThreshold + return this +} +``` + +## Retrieve the RUM session ID + +Retrieving the RUM session ID can be helpful for troubleshooting. For example, you can attach the session ID to support requests, emails, or bug reports so that your support team can later find the user session in Datadog. + +You can access the RUM session ID at runtime without waiting for the `sessionStarted` event: + +```kotlin +GlobalRumMonitor.get().getCurrentSessionId { sessionId -> + currentSessionId = sessionId +} +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/android +[3]: /real_user_monitoring/android/data_collected +[4]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-views +[5]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#initialization-parameters +[6]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-network-requests +[7]: /real_user_monitoring/android/data_collected/#event-specific-attributes +[8]: /real_user_monitoring/application_monitoring/android/setup/#sending-data-when-device-is-offline +[9]: https://github.com/DataDog/dd-sdk-android/blob/eaa15cd344d1723fafaf179fcebf800d6030c6bb/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt#L279 +[10]: https://github.com/DataDog/dd-sdk-android/tree/master/sample/kotlin/src/main/kotlin/com/datadog/android/sample/widget +[11]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#time-to-network-settled +[12]: https://square.github.io/okhttp/features/events/ +[13]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#interaction-to-next-view +[14]: /real_user_monitoring/application_monitoring/android/setup?tab=kotlin#setup diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/flutter.mdoc.md new file mode 100644 index 00000000000..1a3acb075ab --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/flutter.mdoc.md @@ -0,0 +1,66 @@ +## Tracking from background isolates + +Starting with v3, Datadog Flutter SDK is capable of monitoring from multiple isolates, but monitoring must be initialized from the background isolate: + +When initializing your background isolate, call `DatadogSdk.instance.attachToBackgroundIsolate`. For example: + +```dart +Future _spawnIsolate() async { + final receivePort = ReceivePort(); + receivePort.listen((message) { + // + }); + await Isolate.spawn(_backgroundWork, receivePort.sendPort); + } + +void _backgroundWork(SendPort port) async { + await DatadogSdk.instance.attachToBackgroundIsolate(); + + // Your background work +} +``` + +`attachToBackgroundIsolate` must be called **after** Datadog is initialized in your main isolate, otherwise the call silently fails and tracking is not available. + +If you are using [Datadog Tracking HTTP Client][10] to automatically track resources, `attachToBackgroundIsolate` automatically starts tracking resources from the calling isolate. However, using `Client` from the `http` package or `Dio` requires you to re-initialize HTTP tracking for those packages from the background isolate. + +## Clear all data + +Use `clearAllData` to clear all data that has not been sent to Datadog. + +```dart +DatadogSdk.instance.clearAllData(); +``` + +## Retrieve the RUM session ID + +Retrieving the RUM session ID can be helpful for troubleshooting. For example, you can attach the session ID to support requests, emails, or bug reports so that your support team can later find the user session in Datadog. + +You can access the RUM session ID at runtime without waiting for the `sessionStarted` event: + +```dart +final sessionId = await DatadogSdk.instance.rum?.getCurrentSessionId() +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/flutter/setup/ +[3]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries/ +[4]: /getting_started/tagging/#defining-tags +[5]: /real_user_monitoring/connect_rum_and_traces/?tab=browserrum#how-are-rum-resources-linked-to-traces +[6]: https://github.com/openzipkin/b3-propagation#single-headers +[7]: https://github.com/openzipkin/b3-propagation#multiple-headers +[8]: https://www.w3.org/TR/trace-context/#tracestate-header +[9]: /real_user_monitoring/application_monitoring/browser/frustration_signals/ +[10]: https://pub.dev/packages/datadog_tracking_http_client +[11]: https://api.flutter.dev/flutter/dart-io/HttpOverrides/current.html +[12]: https://pub.dev/documentation/datadog_tracking_http_client/latest/datadog_tracking_http_client/DatadogTrackingHttpOverrides-class.html +[13]: /serverless/aws_lambda/distributed_tracing/ +[14]: /real_user_monitoring/application_monitoring/flutter/data_collected +[15]: /real_user_monitoring/explorer/?tab=measures#setup-facets-and-measures +[16]: https://github.com/DataDog/dd-sdk-flutter/tree/main/packages/datadog_tracking_http_client +[17]: https://pub.dev/documentation/datadog_flutter_plugin/latest/datadog_flutter_plugin/ +[18]: /real_user_monitoring/application_monitoring/mobile_vitals/?tab=flutter +[19]: https://pub.dev/packages/datadog_grpc_interceptor +[20]: https://pub.dev/packages/datadog_gql_link +[21]: https://pub.dev/packages/datadog_dio +[22]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/ios.mdoc.md new file mode 100644 index 00000000000..685f5091802 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/ios.mdoc.md @@ -0,0 +1,85 @@ +## Track background events + +{% alert level="info" %} +Tracking background events may lead to additional sessions, which can impact billing. For questions, [contact Datadog support](https://docs.datadoghq.com/help/). +{% /alert %} + +You can track events such as crashes and network requests when your application is in the background (for example, no active view is available). + +To track background events, add the following snippet during initialization in your Datadog configuration: + +```swift +import DatadogRUM + +RUM.enable( + with: RUM.Configuration( + ... + trackBackgroundEvents: true + ) +) +``` + +## Retrieve the RUM session ID + +Retrieving the RUM session ID can be helpful for troubleshooting. For example, you can attach the session ID to support requests, emails, or bug reports so that your support team can later find the user session in Datadog. + +You can access the RUM session ID at runtime without waiting for the `sessionStarted` event: + +```swift +RumMonitor.shared().currentSessionID(completion: { sessionId in + currentSessionId = sessionId +}) +``` + +## Set tracking consent (GDPR compliance) + +To be compliant with the GDPR regulation, the RUM iOS SDK requires the tracking consent value at initialization. + +The `trackingConsent` setting can be one of the following values: + +1. `.pending`: The RUM iOS SDK starts collecting and batching the data but does not send it to Datadog. The RUM iOS SDK waits for the new tracking consent value to decide what to do with the batched data. +2. `.granted`: The RUM iOS SDK starts collecting the data and sends it to Datadog. +3. `.notGranted`: The RUM iOS SDK does not collect any data. No logs, traces, or RUM events are sent to Datadog. + +To change the tracking consent value after the RUM iOS SDK is initialized, use the `Datadog.set(trackingConsent:)` API call. The RUM iOS SDK changes its behavior according to the new value. + +For example, if the current tracking consent is `.pending`: + +- If you change the value to `.granted`, the RUM iOS SDK sends all current and future data to Datadog. +- If you change the value to `.notGranted`, the RUM iOS SDK wipes all current data and does not collect future data. + +## Data management + +The iOS SDK first stores events locally and only uploads events when the [intake specifications][9] conditions are met. + +### Clear all data + +You have the option of deleting all unsent data stored by the SDK with the `Datadog.clearAllData()` API. + +```swift +import DatadogCore + +Datadog.clearAllData() +``` + +### Stop data collection + +You can use the `Datadog.stopInstance()` API to stop a named SDK instance (or the default instance if the name is `nil`) from collecting and uploading data further. + +```swift +import DatadogCore + +Datadog.stopInstance() +``` + +Calling this method disables the SDK and all active features, such as RUM. To resume data collection, you must reinitialize the SDK. You can use this API if you want to change configurations dynamically. + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/ios +[3]: /real_user_monitoring/application_monitoring/ios/data_collected/ +[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift +[5]: /real_user_monitoring/application_monitoring/ios/data_collected/?tab=error#error-attributes +[6]: /real_user_monitoring/application_monitoring/ios/data_collected/?tab=session#default-attributes +[7]: https://www.ntppool.org/en/ +[8]: /real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting +[9]: /real_user_monitoring/application_monitoring/ios/setup diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/kotlin_multiplatform.mdoc.md new file mode 100644 index 00000000000..e4e44d98c3c --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/kotlin_multiplatform.mdoc.md @@ -0,0 +1,67 @@ +## Event and data management + +The Kotlin Multiplatform SDK first stores events. It only uploads these events when the [intake specification][9] conditions are met. + +### Clear all data + +You have the option of deleting all unsent data stored by the SDK with the `clearAllData` API. + +```kotlin +Datadog.clearAllData() +``` + +### Stop data collection + +You can use the `stopInstance` API to stop the SDK instance from collecting and uploading data further. + +```kotlin +Datadog.stopInstance() +``` + +### Set remote log threshold + +You can define the minimum log level (priority) to send events to Datadog in a logger instance. If the log priority is below the one you set at this threshold, it does not get sent. The default value is to allow all. + +```kotlin +val logger = Logger.Builder() + .setRemoteLogThreshold(LogLevel.INFO) + .build() +``` + +## Track background events + +You can track events such as crashes and network requests when your application is in the background (for example, no active view is available). + +Add the following snippet during RUM configuration: + +```kotlin +.trackBackgroundEvents(true) +``` + +{% alert level="info" %} +Tracking background events may lead to additional sessions, which can impact billing. For questions, [contact Datadog support][a1]. +{% /alert %} + +## Retrieve the RUM session ID + +Retrieving the RUM session ID can be helpful for troubleshooting. For example, you can attach the session ID to support requests, emails, or bug reports so that your support team can later find the user session in Datadog. + +You can access the RUM session ID at runtime without waiting for the `sessionStarted` event: + +```kotlin +GlobalRumMonitor.get().getCurrentSessionId { sessionId -> + currentSessionId = sessionId +} +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/kotlin_multiplatform +[3]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected +[4]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#automatically-track-views +[5]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#initialization-parameters +[6]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#initialize-rum-ktor-plugin-to-track-network-events-made-with-ktor +[7]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected +[8]: /real_user_monitoring/explorer/search/#setup-facets-and-measures +[9]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#sending-data-when-device-is-offline +[10]: /real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting +[a1]: https://docs.datadoghq.com/help/ diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/react_native.mdoc.md new file mode 100644 index 00000000000..0d5071ea301 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/react_native.mdoc.md @@ -0,0 +1,43 @@ +## Clear all data + +Use `clearAllData` to clear all data that has not been sent to Datadog. + +```js +DdSdkReactNative.clearAllData(); +``` + +## Retrieve the RUM session ID + +Retrieving the RUM session ID can be helpful for troubleshooting. For example, you can attach the session ID to support requests, emails, or bug reports so that your support team can later find the user session in Datadog. + +You can access the RUM session ID at runtime with: + +```javascript +import { DdRum } from '@datadog/mobile-react-native'; + +const rumSessionId = await DdRum.getCurrentSessionId(); +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/react_native +[3]: https://jestjs.io/ +[4]: /account_management/api-app-keys/#client-tokens +[5]: /getting_started/tagging/#define-tags +[6]: /getting_started/site/ +[7]: /real_user_monitoring/application_monitoring/browser/frustration_signals/ +[8]: /real_user_monitoring/correlate_with_other_telemetry/apm?tab=reactnativerum +[9]: /real_user_monitoring/guide/proxy-mobile-rum-data/ +[10]: https://github.com/wix/react-native-navigation +[11]: /real_user_monitoring/application_monitoring/react_native/integrated_libraries/ +[12]: https://github.com/react-navigation/react-navigation +[13]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation +[14]: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/683ec4a2b420ff6bd3873a7338416ad3ec0b6595/types/react-native-side-menu/index.d.ts#L2 +[15]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest +[16]: https://reactnative.dev/docs/global-requestIdleCallback +[17]: https://reactnative.dev/docs/interactionmanager#runafterinteractions +[18]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation-async +[19]: /real_user_monitoring/guide/monitor-hybrid-react-native-applications +[20]: /real_user_monitoring/error_tracking/mobile/ios/?tab=cocoapods#configure-the-app-hang-threshold +[21]: #rum-configuration +[22]: #logs-configuration +[23]: #trace-configuration diff --git a/layouts/shortcodes/mdoc/en/sdk/manage_sessions/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/unity.mdoc.md new file mode 100644 index 00000000000..c97e8571d65 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/manage_sessions/unity.mdoc.md @@ -0,0 +1,11 @@ +## Clear all data + +Use `ClearAllData` to clear all data that has not been sent to Datadog. + +```csharp +DatadogSdk.instance.ClearAllData(); +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/unity/setup/ +[3]: /real_user_monitoring/application_monitoring/unity/data_collected/ diff --git a/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/android.mdoc.md new file mode 100644 index 00000000000..c583589974b --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/android.mdoc.md @@ -0,0 +1,68 @@ +## Modify or drop RUM events + +To modify some attributes in your RUM events, or to drop some of the events entirely before batching, provide an implementation of `EventMapper` when initializing the RUM Android SDK: + +{% tabs %} +{% tab label="Kotlin" %} + +```kotlin +val rumConfig = RumConfiguration.Builder(applicationId) + // ... + .setErrorEventMapper(rumErrorEventMapper) + .setActionEventMapper(rumActionEventMapper) + .setResourceEventMapper(rumResourceEventMapper) + .setViewEventMapper(rumViewEventMapper) + .setLongTaskEventMapper(rumLongTaskEventMapper) + .build() +``` + +{% /tab %} +{% tab label="Java" %} + +```java +RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId) + // ... + .setErrorEventMapper(rumErrorEventMapper) + .setActionEventMapper(rumActionEventMapper) + .setResourceEventMapper(rumResourceEventMapper) + .setViewEventMapper(rumViewEventMapper) + .setLongTaskEventMapper(rumLongTaskEventMapper) + .build(); +``` + +{% /tab %} +{% /tabs %} + +When implementing the `EventMapper` interface, only some attributes are modifiable for each event type: + +| Event type | Attribute key | Description | +| ------------- | -------------------- | ------------------------------------------------ | +| ViewEvent | `view.referrer` | URL that linked to the initial view of the page. | +| | `view.url` | URL of the view. | +| | `view.name` | Name of the view. | +| ActionEvent | | | +| | `action.target.name` | Target name. | +| | `view.referrer` | URL that linked to the initial view of the page. | +| | `view.url` | URL of the view. | +| | `view.name` | Name of the view. | +| ErrorEvent | | | +| | `error.message` | Error message. | +| | `error.stack` | Stacktrace of the error. | +| | `error.resource.url` | URL of the resource. | +| | `view.referrer` | URL that linked to the initial view of the page. | +| | `view.url` | URL of the view. | +| | `view.name` | Name of the view. | +| ResourceEvent | | | +| | `resource.url` | URL of the resource. | +| | `view.referrer` | URL that linked to the initial view of the page. | +| | `view.url` | URL of the view. | +| | `view.name` | Name of the view. | +| LongTaskEvent | | | +| | `view.referrer` | URL that linked to the initial view of the page. | +| | `view.url` | URL of the view. | +| | `view.name` | Name of the view. | + +**Note**: If you return null from the `EventMapper` implementation, the event is kept and sent as-is. + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/android diff --git a/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/flutter.mdoc.md new file mode 100644 index 00000000000..1d64f3d8e40 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/flutter.mdoc.md @@ -0,0 +1,53 @@ +## Modify or drop RUM events + +**Note**: This feature is not yet available for Flutter web applications. + +To modify attributes of a RUM event before it is sent to Datadog or to drop an event entirely, use the Event Mappers API when configuring the Flutter RUM SDK: + +```dart +final config = DatadogConfiguration( + // other configuration... + rumConfiguration: DatadogRumConfiguration( + applicationId: '', + rumViewEventMapper = (event) => event, + rumActionEventMapper = (event) => event, + rumResourceEventMapper = (event) => event, + rumErrorEventMapper = (event) => event, + rumLongTaskEventMapper = (event) => event, + ), +); +``` + +Each mapper is a function with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it is sent, or dropping the event entirely. + +For example, to redact sensitive information in a RUM Resource's `url`, implement a custom `redacted` function and use it in `rumResourceEventMapper`: + +```dart + rumResourceEventMapper = (event) { + var resourceEvent = resourceEvent + resourceEvent.resource.url = redacted(resourceEvent.resource.url) + return resourceEvent + } +``` + +Returning `null` from the error, resource, or action mapper drops the event entirely; the event is not sent to Datadog. The value returned from the view event mapper must not be `null`. + +Depending on the event's type, only some specific properties can be modified: + +| Event Type | Attribute key | Description | +| ---------------- | --------------------------------- | ------------------------------------------- | +| RumViewEvent | `viewEvent.view.url` | URL of the view. | +| | `viewEvent.view.referrer` | Referrer of the view. | +| RumActionEvent | `actionEvent.action.target?.name` | Name of the action. | +| | `actionEvent.view.referrer` | Referrer of the view linked to this action. | +| | `actionEvent.view.url` | URL of the view linked to this action. | +| RumErrorEvent | `errorEvent.error.message` | Error message. | +| | `errorEvent.error.stack` | Stacktrace of the error. | +| | `errorEvent.error.resource?.url` | URL of the resource the error refers to. | +| | `errorEvent.view.referrer` | Referrer of the view linked to this action. | +| | `errorEvent.view.url` | URL of the view linked to this error. | +| RumResourceEvent | `resourceEvent.resource.url` | URL of the resource. | +| | `resourceEvent.view.referrer` | Referrer of the view linked to this action. | +| | `resourceEvent.view.url` | URL of the view linked to this resource. | + +[1]: https://app.datadoghq.com/rum/application/create diff --git a/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/ios.mdoc.md new file mode 100644 index 00000000000..74f8495ae6d --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/ios.mdoc.md @@ -0,0 +1,110 @@ +## Modify or drop RUM events + +To modify attributes of a RUM event before it is sent to Datadog or to drop an event entirely, use the Event Mappers API when configuring the RUM iOS SDK: + +{% tabs %} +{% tab label="Swift" %} + +```swift +let configuration = RUM.Configuration( + applicationID: "", + viewEventMapper: { RUMViewEvent in + return RUMViewEvent + } + resourceEventMapper: { RUMResourceEvent in + return RUMResourceEvent + } + actionEventMapper: { RUMActionEvent in + return RUMActionEvent + } + errorEventMapper: { RUMErrorEvent in + return RUMErrorEvent + } + longTaskEventMapper: { RUMLongTaskEvent in + return RUMLongTaskEvent + } +) +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; + +[configuration setViewEventMapper:^DDRUMViewEvent * _Nonnull(DDRUMViewEvent * _Nonnull RUMViewEvent) { + return RUMViewEvent; +}]; + +[configuration setErrorEventMapper:^DDRUMErrorEvent * _Nullable(DDRUMErrorEvent * _Nonnull RUMErrorEvent) { + return RUMErrorEvent; +}]; + +[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) { + return RUMResourceEvent; +}]; + +[configuration setActionEventMapper:^DDRUMActionEvent * _Nullable(DDRUMActionEvent * _Nonnull RUMActionEvent) { + return RUMActionEvent; +}]; + +[configuration setLongTaskEventMapper:^DDRUMLongTaskEvent * _Nullable(DDRUMLongTaskEvent * _Nonnull RUMLongTaskEvent) { + return RUMLongTaskEvent; +}]; +``` + +{% /tab %} +{% /tabs %} + +Each mapper is a Swift closure with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it is sent. + +For example, to redact sensitive information in a RUM Resource's `url`, implement a custom `redacted(_:) -> String` function and use it in `resourceEventMapper`: + +{% tabs %} +{% tab label="Swift" %} + +```swift +let configuration = RUM.Configuration( + applicationID: "", + resourceEventMapper: { RUMResourceEvent in + var RUMResourceEvent = RUMResourceEvent + RUMResourceEvent.resource.url = redacted(RUMResourceEvent.resource.url) + return RUMResourceEvent + } +) +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; + +[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) { + return RUMResourceEvent; +}]; +``` + +{% /tab %} +{% /tabs %} + +Returning `nil` from the error, resource, or action mapper drops the event entirely; the event is not sent to Datadog. The value returned from the view event mapper must not be `nil` (to drop views, customize your implementation of `UIKitRUMViewsPredicate`; read more in [tracking views automatically](#automatically-track-views)). + +Depending on the event's type, only some specific properties can be modified: + +| Event Type | Attribute key | Description | +| ---------------- | ------------------------------------ | ------------------------------------------------ | +| RUMActionEvent | `RUMActionEvent.action.target?.name` | Name of the action. | +| | `RUMActionEvent.view.url` | URL of the view linked to this action. | +| RUMErrorEvent | `RUMErrorEvent.error.message` | Error message. | +| | `RUMErrorEvent.error.stack` | Stacktrace of the error. | +| | `RUMErrorEvent.error.resource?.url` | URL of the resource the error refers to. | +| | `RUMErrorEvent.view.url` | URL of the view linked to this error. | +| RUMResourceEvent | `RUMResourceEvent.resource.url` | URL of the resource. | +| | `RUMResourceEvent.view.url` | URL of the view linked to this resource. | +| RUMViewEvent | `RUMViewEvent.view.name` | Name of the view. | +| | `RUMViewEvent.view.url` | URL of the view. | +| | `RUMViewEvent.view.referrer` | URL that linked to the initial view of the page. | + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/ios diff --git a/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/kotlin_multiplatform.mdoc.md new file mode 100644 index 00000000000..d93372709fa --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/kotlin_multiplatform.mdoc.md @@ -0,0 +1,44 @@ +## Modify or drop RUM events + +To modify some attributes in your RUM events, or to drop some of the events entirely before batching, provide an implementation of `EventMapper` when initializing the RUM Kotlin Multiplatform SDK: + +```kotlin +val rumConfig = RumConfiguration.Builder(applicationId) + // ... + .setErrorEventMapper(rumErrorEventMapper) + .setActionEventMapper(rumActionEventMapper) + .setResourceEventMapper(rumResourceEventMapper) + .setViewEventMapper(rumViewEventMapper) + .setLongTaskEventMapper(rumLongTaskEventMapper) + .build() +``` + +When implementing the `EventMapper` interface, only some attributes are modifiable for each event type: + +| Event type | Attribute key | Description | +| ------------- | -------------------- | ------------------------------------------------ | +| ViewEvent | `view.referrer` | URL that linked to the initial view of the page. | +| | `view.url` | URL of the view. | +| | `view.name` | Name of the view. | +| ActionEvent | `action.target.name` | Target name. | +| | `view.referrer` | URL that linked to the initial view of the page. | +| | `view.url` | URL of the view. | +| | `view.name` | Name of the view. | +| ErrorEvent | `error.message` | Error message. | +| | `error.stack` | Stacktrace of the error. | +| | `error.resource.url` | URL of the resource. | +| | `view.referrer` | URL that linked to the initial view of the page. | +| | `view.url` | URL of the view. | +| | `view.name` | Name of the view. | +| ResourceEvent | `resource.url` | URL of the resource. | +| | `view.referrer` | URL that linked to the initial view of the page. | +| | `view.url` | URL of the view. | +| | `view.name` | Name of the view. | +| LongTaskEvent | `view.referrer` | URL that linked to the initial view of the page. | +| | `view.url` | URL of the view. | +| | `view.name` | Name of the view. | + +**Note**: If you return null from the `EventMapper` implementation, the event is dropped. + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/kotlin_multiplatform diff --git a/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/react_native.mdoc.md new file mode 100644 index 00000000000..aa0acbf3dae --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/modify_drop_events/react_native.mdoc.md @@ -0,0 +1,84 @@ +## Modify or drop RUM events + +To modify attributes of a RUM event before it is sent to Datadog, or to drop an event entirely, use the Event Mappers API when configuring the RUM React Native SDK: + +```javascript +import { + SdkVerbosity, + DatadogProvider, + DatadogProviderConfiguration, + RumConfiguration, + LogsConfiguration, + TraceConfiguration +} from '@datadog/mobile-react-native'; + +const config = new DatadogProviderConfiguration( + '', + '', + { + rumConfiguration: { + applicationId: '', + trackInteractions: true, // Track user interactions (such as a tap on buttons). + trackResources: true, // Track XHR resources + trackErrors: true, // Track errors + // RUM Event Mappers + errorEventMapper: (event) => event, + resourceEventMapper: (event) => event, + actionEventMapper: (event) => event + }, + + // Log Event Mappers + logsConfiguration: { + logEventMapper: (event) => event + }, + + traceConfiguration: {} + } +) +``` + +Each mapper is a function with a signature of `(T) -> T?`, where `T` is a concrete RUM event type. This allows changing portions of the event before it is sent, or dropping the event entirely. + +For example, to redact sensitive information from a RUM error `message`, implement a custom `redacted` function and use it in `errorEventMapper`: + +```javascript +config.rumConfiguration.errorEventMapper = (event) => { + event.message = redacted(event.message); + return event; +}; +``` + +Returning `null` from the error, resource, or action mapper drops the event entirely; the event is not sent to Datadog. + +Depending on the event type, only some specific properties can be modified: + +| Event Type | Attribute key | Description | +| ------------- | ------------------------ | ---------------------------------- | +| LogEvent | `logEvent.message` | Message of the log. | +| | `logEvent.context` | Custom attributes of the log. | +| ActionEvent | `actionEvent.context` | Custom attributes of the action. | +| ErrorEvent | `errorEvent.message` | Error message. | +| | `errorEvent.source` | Source of the error. | +| | `errorEvent.stacktrace` | Stacktrace of the error. | +| | `errorEvent.context` | Custom attributes of the error. | +| | `errorEvent.timestampMs` | Timestamp of the error. | +| ResourceEvent | `resourceEvent.context` | Custom attributes of the resource. | + +Events include additional context: + +| Event Type | Context attribute key | Description | +| ------------- | ------------------------------------------------ | ----------------------------------------------------------------------- | +| LogEvent | `logEvent.additionalInformation.userInfo` | Contains the global user info set by `DdSdkReactNative.setUserInfo`. | +| | `logEvent.additionalInformation.attributes` | Contains the global attributes set by `DdSdkReactNative.addAttributes`. | +| ActionEvent | `actionEvent.actionContext` | [GestureResponderEvent][14] corresponding to the action or `undefined`. | +| | `actionEvent.additionalInformation.userInfo` | Contains the global user info set by `DdSdkReactNative.setUserInfo`. | +| | `actionEvent.additionalInformation.attributes` | Contains the global attributes set by `DdSdkReactNative.addAttributes`. | +| ErrorEvent | `errorEvent.additionalInformation.userInfo` | Contains the global user info set by `DdSdkReactNative.setUserInfo`. | +| | `errorEvent.additionalInformation.attributes` | Contains the global attributes set by `DdSdkReactNative.addAttributes`. | +| ResourceEvent | `resourceEvent.resourceContext` | [XMLHttpRequest][15] corresponding to the resource or `undefined`. | +| | `resourceEvent.additionalInformation.userInfo` | Contains the global user info set by `DdSdkReactNative.setUserInfo`. | +| | `resourceEvent.additionalInformation.attributes` | Contains the global attributes set by `DdSdkReactNative.addAttributes`. | + +[1]: https://app.datadoghq.com/rum/application/create +[14]: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/683ec4a2b420ff6bd3873a7338416ad3ec0b6595/types/react-native-side-menu/index.d.ts#L2 +[15]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest diff --git a/layouts/shortcodes/mdoc/en/sdk/setup/browser.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/setup/browser.mdoc.md index 2efbd22b6b3..8e9da1ecb60 100644 --- a/layouts/shortcodes/mdoc/en/sdk/setup/browser.mdoc.md +++ b/layouts/shortcodes/mdoc/en/sdk/setup/browser.mdoc.md @@ -362,7 +362,7 @@ To request support for a web server that is not listed here, [fill out this form Visualize the [data collected][11] in [dashboards][12] or create a search query in the [RUM Explorer][5]. -Your application appears as pending on the Applications page until Datadog starts receiving data. +Your application appears as pending on the Applications page until Datadog starts receiving data. If data takes time to appear, see [Troubleshooting Browser SDK Issues][15]. [1]: /real_user_monitoring/ [2]: /error_tracking/frontend/browser @@ -378,4 +378,5 @@ Your application appears as pending on the Applications page until Datadog start [12]: /real_user_monitoring/platform/dashboards/ [13]: /private-beta/rum-sdk-auto-injection/ [14]: /real_user_monitoring/application_monitoring/browser/setup/client +[15]: /real_user_monitoring/browser/troubleshooting/#data-to-the-datadog-intake diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/android.mdoc.md new file mode 100644 index 00000000000..804cf50ff7d --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/android.mdoc.md @@ -0,0 +1,22 @@ +### Custom errors + +To track specific errors, notify the monitor when an error occurs with the message, source, exception, and additional attributes. See the [Error Attributes documentation][7]. + +```kotlin +GlobalRumMonitor.get().addError(message, source, throwable, attributes) +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/android +[3]: /real_user_monitoring/android/data_collected +[4]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-views +[5]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#initialization-parameters +[6]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-network-requests +[7]: /real_user_monitoring/android/data_collected/#event-specific-attributes +[8]: /real_user_monitoring/application_monitoring/android/setup/#sending-data-when-device-is-offline +[9]: https://github.com/DataDog/dd-sdk-android/blob/eaa15cd344d1723fafaf179fcebf800d6030c6bb/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt#L279 +[10]: https://github.com/DataDog/dd-sdk-android/tree/master/sample/kotlin/src/main/kotlin/com/datadog/android/sample/widget +[11]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#time-to-network-settled +[12]: https://square.github.io/okhttp/features/events/ +[13]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#interaction-to-next-view +[14]: /real_user_monitoring/application_monitoring/android/setup?tab=kotlin#setup diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/flutter.mdoc.md new file mode 100644 index 00000000000..eba27be2f50 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/flutter.mdoc.md @@ -0,0 +1,30 @@ +### Track custom errors + +To track specific errors, notify `DdRum` when an error occurs with the message, source, exception, and additional attributes. + +```dart +DatadogSdk.instance.rum?.addError("This is an error message."); +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/flutter/setup/ +[3]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries/ +[4]: /getting_started/tagging/#defining-tags +[5]: /real_user_monitoring/connect_rum_and_traces/?tab=browserrum#how-are-rum-resources-linked-to-traces +[6]: https://github.com/openzipkin/b3-propagation#single-headers +[7]: https://github.com/openzipkin/b3-propagation#multiple-headers +[8]: https://www.w3.org/TR/trace-context/#tracestate-header +[9]: /real_user_monitoring/application_monitoring/browser/frustration_signals/ +[10]: https://pub.dev/packages/datadog_tracking_http_client +[11]: https://api.flutter.dev/flutter/dart-io/HttpOverrides/current.html +[12]: https://pub.dev/documentation/datadog_tracking_http_client/latest/datadog_tracking_http_client/DatadogTrackingHttpOverrides-class.html +[13]: /serverless/aws_lambda/distributed_tracing/ +[14]: /real_user_monitoring/application_monitoring/flutter/data_collected +[15]: /real_user_monitoring/explorer/?tab=measures#setup-facets-and-measures +[16]: https://github.com/DataDog/dd-sdk-flutter/tree/main/packages/datadog_tracking_http_client +[17]: https://pub.dev/documentation/datadog_flutter_plugin/latest/datadog_flutter_plugin/ +[18]: /real_user_monitoring/application_monitoring/mobile_vitals/?tab=flutter +[19]: https://pub.dev/packages/datadog_grpc_interceptor +[20]: https://pub.dev/packages/datadog_gql_link +[21]: https://pub.dev/packages/datadog_dio +[22]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/ios.mdoc.md new file mode 100644 index 00000000000..d83aa626848 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/ios.mdoc.md @@ -0,0 +1,93 @@ +### Custom errors + +To track specific errors, notify `RUMMonitor.shared()` when an error occurs using one of following methods: + +- `.addError(message:)` +- `.addError(error:)` + +{% tabs %} +{% tab label="Swift" %} + +```swift +let rum = RUMMonitor.shared() +rum.addError(message: "error message.") +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +[[DDRUMMonitor shared] addErrorWithMessage:@"error message." stack:nil source:DDRUMErrorSourceCustom attributes:@{}]; +``` + +{% /tab %} +{% /tabs %} + +For more details and available options, see [`RUMMonitorProtocol` in GitHub][4] and the [Error Attributes documentation][5]. + +### Automatically track errors + +All "error" and "critical" logs sent with `Logger` are automatically reported as RUM errors and linked to the current RUM view: + +{% tabs %} +{% tab label="Swift" %} + +```swift +import DatadogLogs + +let logger = Logger.create() + +logger.error("message") +logger.critical("message") +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +@import DatadogLogs; + +DDLogger *logger = [DDLogger create]; +[logger error:@"message"]; +[logger critical:@"message"]; +``` + +{% /tab %} +{% /tabs %} + +Similarly, all finished spans marked as error are reported as RUM errors: + +{% tabs %} +{% tab label="Swift" %} + +```swift +import DatadogTrace + +let span = Tracer.shared().startSpan(operationName: "operation") +// ... capture the `error` +span.setError(error) +span.finish() +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +// ... capture the `error` +id span = [[DDTracer shared] startSpan:@"operation"]; +[span setError:error]; +[span finish]; +``` + +{% /tab %} +{% /tabs %} + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/ios +[3]: /real_user_monitoring/application_monitoring/ios/data_collected/ +[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift +[5]: /real_user_monitoring/application_monitoring/ios/data_collected/?tab=error#error-attributes +[6]: /real_user_monitoring/application_monitoring/ios/data_collected/?tab=session#default-attributes +[7]: https://www.ntppool.org/en/ +[8]: /real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting +[9]: /real_user_monitoring/application_monitoring/ios/setup diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/kotlin_multiplatform.mdoc.md new file mode 100644 index 00000000000..57cadd3dd88 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/kotlin_multiplatform.mdoc.md @@ -0,0 +1,21 @@ +### Custom errors + +To track specific errors, notify the monitor when an error occurs with the message, source, exception, and additional attributes. See the [Attributes collected documentation][7]. + +```kotlin +GlobalRumMonitor.get().addError(message, source, throwable, attributes) +``` + +**Note**: `addError` method accepting `NSError` is also available from iOS source set. + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/kotlin_multiplatform +[3]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected +[4]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#automatically-track-views +[5]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#initialization-parameters +[6]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#initialize-rum-ktor-plugin-to-track-network-events-made-with-ktor +[7]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected +[8]: /real_user_monitoring/explorer/search/#setup-facets-and-measures +[9]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#sending-data-when-device-is-offline +[10]: /real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting +[a1]: https://docs.datadoghq.com/help/ diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/react_native.mdoc.md new file mode 100644 index 00000000000..75fd5f65a32 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/react_native.mdoc.md @@ -0,0 +1,31 @@ +### Manually track RUM errors + +You can manually track RUM errors: + +```javascript +DdRum.addError('', ErrorSource.SOURCE, '', {}, Date.now()); +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/react_native +[3]: https://jestjs.io/ +[4]: /account_management/api-app-keys/#client-tokens +[5]: /getting_started/tagging/#define-tags +[6]: /getting_started/site/ +[7]: /real_user_monitoring/application_monitoring/browser/frustration_signals/ +[8]: /real_user_monitoring/correlate_with_other_telemetry/apm?tab=reactnativerum +[9]: /real_user_monitoring/guide/proxy-mobile-rum-data/ +[10]: https://github.com/wix/react-native-navigation +[11]: /real_user_monitoring/application_monitoring/react_native/integrated_libraries/ +[12]: https://github.com/react-navigation/react-navigation +[13]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation +[14]: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/683ec4a2b420ff6bd3873a7338416ad3ec0b6595/types/react-native-side-menu/index.d.ts#L2 +[15]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest +[16]: https://reactnative.dev/docs/global-requestIdleCallback +[17]: https://reactnative.dev/docs/interactionmanager#runafterinteractions +[18]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation-async +[19]: /real_user_monitoring/guide/monitor-hybrid-react-native-applications +[20]: /real_user_monitoring/error_tracking/mobile/ios/?tab=cocoapods#configure-the-app-hang-threshold +[21]: #rum-configuration +[22]: #logs-configuration +[23]: #trace-configuration diff --git a/layouts/shortcodes/mdoc/en/sdk/track_errors/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_errors/unity.mdoc.md new file mode 100644 index 00000000000..4956911cf71 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_errors/unity.mdoc.md @@ -0,0 +1,18 @@ +### Track custom errors + +To track specific errors, notify `DdRum` when an error occurs with the exception, the source, and any additional attributes. + +```csharp +try +{ + // Error prone code +} +catch(Exception e) +{ + DatadogSdk.Instance.Rum.AddError(e, RumErrorSource.Source); +} +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/unity/setup/ +[3]: /real_user_monitoring/application_monitoring/unity/data_collected/ diff --git a/layouts/shortcodes/mdoc/en/sdk/track_navigation/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_navigation/android.mdoc.md new file mode 100644 index 00000000000..82d841b6875 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_navigation/android.mdoc.md @@ -0,0 +1,123 @@ +### Custom views + +In addition to [tracking views automatically][4], you can also track specific distinct views (such as activities and fragments) when they become visible and interactive in the `onResume()` lifecycle. Stop tracking when the view is no longer visible. Most often, this method should be called in the frontmost `Activity` or `Fragment`: + +{% tabs %} +{% tab label="Kotlin" %} + +```kotlin +fun onResume() { + GlobalRumMonitor.get().startView(viewKey, viewName, viewAttributes) +} + +fun onPause() { + GlobalRumMonitor.get().stopView(viewKey, viewAttributes) +} +``` + +{% /tab %} +{% tab label="Java" %} + +```java +public void onResume() { + GlobalRumMonitor.get().startView(viewKey, viewName, viewAttributes); +} + +public void onPause() { + GlobalRumMonitor.get().stopView(viewKey, viewAttributes); +} +``` + +{% /tab %} +{% /tabs %} + +### Automatically track views + +To automatically track your views (such as activities and fragments), provide a tracking strategy at initialization. Depending on your application's architecture, you can choose one of the following strategies: + +`ActivityViewTrackingStrategy` +: Every activity in your application is considered a distinct view. + +`FragmentViewTrackingStrategy` +: Every fragment in your application is considered a distinct view. + +`MixedViewTrackingStrategy` +: Every activity or fragment in your application is considered a distinct view. + +`NavigationViewTrackingStrategy` +: Recommended for Android Jetpack Navigation library users. Each Navigation destination is considered a distinct view. + +For instance, to set each fragment as a distinct view, use the following configuration in your [setup][1]: + +{% tabs %} +{% tab label="Kotlin" %} + +```kotlin +val rumConfig = RumConfiguration.Builder(applicationId) + .useViewTrackingStrategy(FragmentViewTrackingStrategy(...)) + .build() +``` + +{% /tab %} +{% tab label="Java" %} + +```java +RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId) + .useViewTrackingStrategy(new FragmentViewTrackingStrategy(...)) + .build(); +``` + +{% /tab %} +{% /tabs %} + + +For `ActivityViewTrackingStrategy`, `FragmentViewTrackingStrategy`, or `MixedViewTrackingStrategy`, you can filter which `Fragment` or `Activity` is tracked as a RUM View by providing a `ComponentPredicate` implementation in the constructor: + +{% tabs %} +{% tab label="Kotlin" %} + +```kotlin +val rumConfig = RumConfiguration.Builder(applicationId) + .useViewTrackingStrategy( + ActivityViewTrackingStrategy( + trackExtras = true, + componentPredicate = object : ComponentPredicate { + override fun accept(component: Activity): Boolean { + return true + } + + override fun getViewName(component: Activity): String? = null + }) + ) + .build() +``` + +{% /tab %} +{% tab label="Java" %} + +```java +RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId) + .useViewTrackingStrategy(new ActivityViewTrackingStrategy( + true, + new ComponentPredicate() { + @Override + public boolean accept(Activity component) { + return true; + } + + @Override + public String getViewName(Activity component) { + return null; + } + } + )) + .build(); +``` + +{% /tab %} +{% /tabs %} + +**Note**: By default, the library is using `ActivityViewTrackingStrategy`. If you decide not to provide a view tracking strategy, you must manually send the views by calling the `startView` and `stopView` methods yourself. + +[1]: https://app.datadoghq.com/rum/application/create +[4]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-views diff --git a/layouts/shortcodes/mdoc/en/sdk/track_navigation/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_navigation/ios.mdoc.md new file mode 100644 index 00000000000..c28ca84acdd --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_navigation/ios.mdoc.md @@ -0,0 +1,246 @@ +### Custom views + +In addition to [tracking views automatically](#automatically-track-views), you can also track specific distinct views such as `viewControllers` when they become visible and interactive. Stop tracking when the view is no longer visible using the following methods in `RUMMonitor.shared()`: + +- `.startView(viewController:)` +- `.stopView(viewController:)` + +For example: + +{% tabs %} +{% tab label="Swift" %} + +```swift +import DatadogRUM + +// in your `UIViewController`: +let rum = RUMMonitor.shared() + +override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + rum.startView(viewController: self) +} + +override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + rum.stopView(viewController: self) +} +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +@import DatadogRUM; +// in your `UIViewController`: + +DDRUMMonitor *rum = [DDRUMMonitor shared]; + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + [rum startViewWithViewController:self name:nil attributes:nil]; +} + +- (void)viewDidDisappear:(BOOL)animated { + [super viewDidDisappear:animated]; + + [rum stopViewWithViewController:self attributes:nil]; +} +``` + +{% /tab %} +{% /tabs %} + +For more details and available options, see [`RUMMonitorProtocol` in GitHub][4]. + +### Automatically track views + +You can automatically track views with UIKit and SwiftUI. + +#### UIKit + +To automatically track views (`UIViewControllers`), use the `uiKitViewsPredicate` option when enabling RUM. By default, views are named with the view controller's class name. To customize it, provide your own implementation of the `predicate` which conforms to `UIKitRUMViewsPredicate` protocol: + +{% tabs %} +{% tab label="Swift" %} + +```swift +public protocol UIKitRUMViewsPredicate { + func rumView(for viewController: UIViewController) -> RUMView? +} +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```swift +@objc +public protocol DDUIKitRUMViewsPredicate: AnyObject { + func rumView(for viewController: UIViewController) -> DDRUMView? +} +``` + +{% /tab %} +{% /tabs %} + +Inside the `rumView(for:)` implementation, your app should decide if a given `UIViewController` instance should start a RUM view (return a value) or not (return `nil`). The returned `RUMView` value must specify the `name` and may provide additional `attributes` for the created RUM view. + +For instance, you can configure the predicate to use explicit type check for each view controller in your app: + +{% tabs %} +{% tab label="Swift" %} + +```swift +class YourCustomPredicate: UIKitRUMViewsPredicate { + + func rumView(for viewController: UIViewController) -> RUMView? { + switch viewController { + case is HomeViewController: return .init(name: "Home") + case is DetailsViewController: return .init(name: "Details") + default: return nil + } + } +} +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +@interface YourCustomPredicate : NSObject + +@end + +@implementation YourCustomPredicate + +- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController { + if ([viewController isKindOfClass:[HomeViewController class]]) { + return [[DDRUMView alloc] initWithName:@"Home" attributes:@{}]; + } + + if ([viewController isKindOfClass:[DetailsViewController class]]) { + return [[DDRUMView alloc] initWithName:@"Details" attributes:@{}]; + } + + return nil; +} + +@end +``` + +{% /tab %} +{% /tabs %} + +You can even come up with a more dynamic solution depending on your app's architecture. + +For example, if your view controllers use `accessibilityLabel` consistently, you can name views by the value of accessibility label: + +{% tabs %} +{% tab label="Swift" %} + +```swift +class YourCustomPredicate: UIKitRUMViewsPredicate { + + func rumView(for viewController: UIViewController) -> RUMView? { + guard let accessibilityLabel = viewController.accessibilityLabel else { + return nil + } + + return RUMView(name: accessibilityLabel) + } +} +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +@interface YourCustomPredicate : NSObject + +@end + +@implementation YourCustomPredicate + +- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController { + if (viewController.accessibilityLabel) { + return [[DDRUMView alloc] initWithName:viewController.accessibilityLabel attributes:@{}]; + } + + return nil; +} + +@end +``` + +{% /tab %} +{% /tabs %} + +**Note**: The RUM iOS SDK calls `rumView(for:)` many times while your app is running. Datadog recommends keeping its implementation fast and single-threaded. + +#### SwiftUI + +To automatically track views with SwiftUI, use the `swiftUIViewsPredicate` option when enabling RUM. + +The mechanism to extract a SwiftUI view name relies on reflection. As a result, view names may not always be meaningful. If a meaningful name cannot be extracted, a generic name such as `AutoTracked_HostingController_Fallback` or `AutoTracked_NavigationStackController_Fallback` is used. + +You can use the default predicate (`DefaultSwiftUIRUMViewsPredicate`) or provide your own implementation of the `SwiftUIRUMViewsPredicate` protocol to customize or filter view names. + +{% tabs %} +{% tab label="Swift" %} + +```swift +public protocol SwiftUIRUMViewsPredicate { + func rumView(for extractedViewName: String) -> RUMView? +} + +// Example: Custom predicate to ignore fallback names and rename views +class CustomSwiftUIPredicate: SwiftUIRUMViewsPredicate { + func rumView(for extractedViewName: String) -> RUMView? { + if extractedViewName == "AutoTracked_HostingController_Fallback" || + extractedViewName == "AutoTracked_NavigationStackController_Fallback" { + return nil // Ignore fallback names + } + if extractedViewName == "MySpecialView" { + return RUMView(name: "Special") + } + return RUMView(name: extractedViewName) + } +} +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +@protocol DDSwiftUIRUMViewsPredicate +- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName; +@end + +@interface CustomSwiftUIPredicate : NSObject +@end + +@implementation CustomSwiftUIPredicate +- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName { + if ([extractedViewName isEqualToString:@"AutoTracked_HostingController_Fallback"] || + [extractedViewName isEqualToString:@"AutoTracked_NavigationStackController_Fallback"]) { + return nil; // Ignore fallback names + } + if ([extractedViewName isEqualToString:@"MySpecialView"]) { + return [[DDRUMView alloc] initWithName:@"Special" attributes:@{}]; + } + return [[DDRUMView alloc] initWithName:extractedViewName attributes:@{}]; +} +@end +``` + +{% /tab %} +{% /tabs %} + +**Notes:** +- Datadog recommends enabling UIKit view tracking as well, even if your app is built entirely with SwiftUI. +- Tab bars are not tracked automatically. Use [manual tracking](#custom-views) for each tab view to track them. +- If you use both automatic and manual tracking, you may see duplicate events. To avoid this, rely on a single instrumentation method or use a custom predicate to filter out duplicates. + +[1]: https://app.datadoghq.com/rum/application/create +[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift diff --git a/layouts/shortcodes/mdoc/en/sdk/track_navigation/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_navigation/kotlin_multiplatform.mdoc.md new file mode 100644 index 00000000000..ff00a687c67 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_navigation/kotlin_multiplatform.mdoc.md @@ -0,0 +1,98 @@ +### Custom views + +In addition to [tracking views automatically][4], you can also track specific distinct views (such as activities and fragments) manually. Stop tracking when the view is no longer visible. + +```kotlin +// to start view +GlobalRumMonitor.get().startView(viewKey, viewName, viewAttributes) + +// to stop view +GlobalRumMonitor.get().stopView(viewKey, viewAttributes) +``` + +### Automatically track views + +#### Android + +To automatically track your views (such as activities and fragments), provide a tracking strategy at initialization. Depending on your application's architecture, you can choose one of the following strategies: + +`ActivityViewTrackingStrategy` +: Every activity in your application is considered a distinct view. + +`FragmentViewTrackingStrategy` +: Every fragment in your application is considered a distinct view. + +`MixedViewTrackingStrategy` +: Every activity or fragment in your application is considered a distinct view. + +`NavigationViewTrackingStrategy` +: Recommended for Android Jetpack Navigation library users. Each Navigation destination is considered a distinct view. + +For instance, to set each fragment as a distinct view, use the following configuration in your [setup][1]: + +```kotlin +// in common source set +val rumConfig = RumConfiguration.Builder(applicationId) + .apply { + platformSpecificSetup(this) + } + .build() + +internal expect fun platformSpecificSetup( + rumConfigurationBuilder: RumConfiguration.Builder +) + +// in Android source set +internal actual fun platformSpecificSetup( + rumConfigurationBuilder: RumConfiguration.Builder +) { + rumConfigurationBuilder.useViewTrackingStrategy( + FragmentViewTrackingStrategy(...) + ) +} +``` + +For `ActivityViewTrackingStrategy`, `FragmentViewTrackingStrategy`, or `MixedViewTrackingStrategy`, you can filter which `Fragment` or `Activity` is tracked as a RUM View by providing a `ComponentPredicate` implementation in the constructor: + +```kotlin +val strategy = ActivityViewTrackingStrategy( + trackExtras = true, + componentPredicate = object : ComponentPredicate { + override fun accept(component: Activity): Boolean { + return true + } + + override fun getViewName(component: Activity): String? = null + } +) +``` + +**Note**: By default, the library is using `ActivityViewTrackingStrategy`. If you decide not to provide a view tracking strategy, you must manually send the views by calling the `startView` and `stopView` methods yourself. + +#### iOS + +To automatically track views (`UIViewController`s), use the `trackUiKitViews` method when enabling RUM. By default, views are named with the view controller's class name. To customize it, provide your own implementation of the `uiKitViewsPredicate` that conforms to `UIKitRUMViewsPredicate` interface. + +Inside the `createView(viewController: UIViewController)` implementation, your app should decide if a given `UIViewController` instance should start the RUM view (return value) or not (return `null`). The returned `RUMView` value must specify the `name` and may provide additional `attributes` for the created RUM view. + +For instance, you can configure the predicate to use explicit type check for each view controller in your app: + +```kotlin +class YourCustomPredicate: UIKitRUMViewsPredicate { + + override fun createView(viewController: UIViewController): RUMView? { + return when (viewController) { + is HomeViewController -> RUMView("Home") + is DetailsViewController -> RUMView("Details") + else -> null + } + } +} +``` + +You can even come up with a more dynamic solution depending on your app's architecture. + +**Note**: By default, UIKit view tracking is not enabled. + +[1]: https://app.datadoghq.com/rum/application/create +[4]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#automatically-track-views diff --git a/layouts/shortcodes/mdoc/en/sdk/track_navigation/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_navigation/react_native.mdoc.md new file mode 100644 index 00000000000..5135bb8b4f4 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_navigation/react_native.mdoc.md @@ -0,0 +1,49 @@ +### Manually track RUM views + +To manually track RUM Views, provide a `view key`, `view name`, and `action name` at initialization. Depending on your needs, you can choose one of the following strategies: + +```javascript +DdRum.startView('', 'View Name', {}, Date.now()); +//… +DdRum.stopView('', { custom: 42 }, Date.now()); +``` + +## Track view navigation + +Because React Native offers a wide range of libraries to create screen navigation, only manual view tracking is supported by default. To see RUM or Error tracking sessions populate in Datadog, you need to implement view tracking. + +You can manually start and stop a view using the following `startView()` and `stopView` methods. + +```js +import { + DdRum +} from '@datadog/mobile-react-native'; + +// Start a view with a unique view identifier, a custom view name, and an object to attach additional attributes to the view +DdRum.startView( + '', // has to be unique, for example it can be ViewName-unique-id + 'View Name', + { 'custom.foo': 'something' }, + Date.now() +); +// Stops a previously started view with the same unique view identifier, and an object to attach additional attributes to the view +DdRum.stopView('', { 'custom.bar': 42 }, Date.now()); +``` + +Use one of Datadog's integrations to automatically track views for the following libraries: + +- If you use the [`react-native-navigation`][10] library, then add the `@datadog/mobile-react-native-navigation` package and follow the [setup instructions][11]. +- If you use the [`react-navigation`][12] library, then add the `@datadog/mobile-react-navigation` package and follow the [setup instructions][11]. + +If you experience any issues setting up View tracking with `@datadog/mobile-react-navigation` you can see this Datadog [example application][13] as a reference. + +## Hybrid app monitoring + +See [Monitor hybrid React Native applications][19]. + +[1]: https://app.datadoghq.com/rum/application/create +[10]: https://github.com/wix/react-native-navigation +[11]: /real_user_monitoring/application_monitoring/react_native/integrated_libraries/ +[12]: https://github.com/react-navigation/react-navigation +[13]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation +[19]: /real_user_monitoring/guide/monitor-hybrid-react-native-applications diff --git a/layouts/shortcodes/mdoc/en/sdk/track_navigation/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_navigation/unity.mdoc.md new file mode 100644 index 00000000000..31f2ddcc1a5 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_navigation/unity.mdoc.md @@ -0,0 +1,5 @@ +### Automatic view tracking + +If you select `Enable Automatic Scene Tracking`, Datadog hooks into Unity's `SceneManager` to detect scenes loading and unloading, and start RUM Views appropriately. If you are using methods to move between scenes other than `SceneManager`, or would like to track changes in views that occur without `SceneManager`, you need to track views manually using `DdRum.StartView` and `DdRum.StopView`. + +[1]: https://app.datadoghq.com/rum/application/create diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/android.mdoc.md new file mode 100644 index 00000000000..8801a79cb35 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/android.mdoc.md @@ -0,0 +1,246 @@ +### Capture resource headers + +When [tracking resources automatically][6], you can capture HTTP request and response headers on RUM Resources by calling `trackResourceHeaders` on the `DatadogInterceptor.Builder`. + +Captured headers appear on the RUM Resource event under `resource.request.headers` and `resource.response.headers`. You can query them in the RUM Explorer. + +{% tabs %} +{% tab label="Kotlin" %} + +```kotlin +val interceptor = DatadogInterceptor.Builder(tracedHosts) + .trackResourceHeaders() + .build() +``` + +{% /tab %} +{% tab label="Java" %} + +```java +DatadogInterceptor interceptor = new DatadogInterceptor.Builder(tracedHosts) + .trackResourceHeaders() + .build(); +``` + +{% /tab %} +{% /tabs %} + +With no arguments, `trackResourceHeaders` captures a predefined set of common headers: + +| Direction | Headers | +|-----------|---------| +| Request | `cache-control`, `content-type` | +| Response | `age`, `cache-control`, `content-encoding`, `content-length`, `content-type`, `etag`, `expires`, `server-timing`, `vary`, `x-cache` | + +To capture additional headers on top of the defaults, configure a `ResourceHeadersExtractor` and pass it to `trackResourceHeaders`. To skip the defaults, set `includeDefaults = false`. + +{% alert level="info" %} +Sensitive headers, such as tokens and API keys, are filtered out automatically, even if you list them explicitly. +{% /alert %} + +### Custom resource attributes + +When [tracking resources automatically][6], provide a custom `RumResourceAttributesProvider` to the `DatadogInterceptor.Builder` to add custom attributes to each tracked network request. + +For example, if you want to surface an OkHttp request tag as a custom attribute on the resource, create an implementation as follows: + +{% tabs %} +{% tab label="Kotlin" %} + +```kotlin +class CustomRumResourceAttributesProvider : RumResourceAttributesProvider { + override fun onProvideAttributes( + request: Request, + response: Response?, + throwable: Throwable? + ): Map { + return mapOf("request.kind" to request.tag(String::class.java).orEmpty()) + } +} +``` + +{% /tab %} +{% tab label="Java" %} + +```java +public class CustomRumResourceAttributesProvider implements RumResourceAttributesProvider { + @NonNull + @Override + public Map onProvideAttributes( + @NonNull Request request, + @Nullable Response response, + @Nullable Throwable throwable + ) { + Map result = new HashMap<>(); + String kind = request.tag(String.class); + result.put("request.kind", kind != null ? kind : ""); + return result; + } +} +``` + +{% /tab %} +{% /tabs %} + +### Custom resources + +In addition to [tracking resources automatically][6], you can also track specific custom resources (such as network requests and third-party provider APIs) with methods (such as `GET` and `POST`) while loading the resource with `RumMonitor#startResource`. Stop tracking with `RumMonitor#stopResource` when it is fully loaded, or `RumMonitor#stopResourceWithError` if an error occurs while loading the resource. + +{% tabs %} +{% tab label="Kotlin" %} + +```kotlin +fun loadResource() { + GlobalRumMonitor.get().startResource(resourceKey, method, url, resourceAttributes) + try { + // do load the resource + GlobalRumMonitor.get().stopResource(resourceKey, resourceKind, additionalAttributes) + } catch (e: Exception) { + GlobalRumMonitor.get().stopResourceWithError(resourceKey, message, origin, e) + } +} +``` + +{% /tab %} +{% tab label="Java" %} + +```java +public void loadResource() { + GlobalRumMonitor.get().startResource(resourceKey, method, url, resourceAttributes); + try { + // do load the resource + GlobalRumMonitor.get().stopResource(resourceKey, resourceKind, additionalAttributes); + } catch (Exception e) { + GlobalRumMonitor.get().stopResourceWithError(resourceKey, message, origin, e); + } +} +``` + +{% /tab %} +{% /tabs %} + +### Automatically track network requests + +#### Basic network instrumentation + +To get timing information in resources (such as third-party providers, network requests) such as time to first byte or DNS resolution, customize the `OkHttpClient` to add the [EventListener][12] factory: + +1. Add the Gradle dependency to the `dd-sdk-android-okhttp` library in the module-level `build.gradle` file: + +```groovy +dependencies { + implementation "com.datadoghq:dd-sdk-android-okhttp:x.x.x" +} +``` + +2. Add the [EventListener][12] factory: +{% tabs %} +{% tab label="Kotlin" %} +```kotlin +val tracedHosts = listOf("example.com") +val okHttpClient = OkHttpClient.Builder() + .addInterceptor(DatadogInterceptor.Builder(tracedHosts).build()) + .eventListenerFactory(DatadogEventListener.Factory()) + .build() +``` +{% /tab %} +{% tab label="Java" %} +```java +List tracedHosts = Arrays.asList("example.com"); +OkHttpClient okHttpClient = new OkHttpClient.Builder() + .addInterceptor(new DatadogInterceptor.Builder(tracedHosts).build()) + .eventListenerFactory(new DatadogEventListener.Factory()) + .build(); +``` +{% /tab %} +{% /tabs %} + +#### Cronet network instrumentation + +If you use Cronet instead of OkHttp, you can instrument your `CronetEngine` for automatic RUM resource tracking. + +1. Add the Gradle dependencies in the module-level `build.gradle` file: + +```groovy +dependencies { + implementation "com.datadoghq:dd-sdk-android-cronet:x.x.x" +} +``` + +2. Instrument the `CronetEngine.Builder`: +{% tabs %} +{% tab label="Kotlin" %} + +```kotlin +val cronetEngine = CronetEngine.Builder(context) + .configureDatadogInstrumentation( + rumInstrumentationConfiguration = RumNetworkInstrumentationConfiguration(), + apmInstrumentationConfiguration = ApmNetworkInstrumentationConfiguration( + tracedHosts = listOf("example.com", "example.eu") + ) + ) + .build() +``` + +{% /tab %} +{% tab label="Java" %} + +```java +CronetEngine.Builder builder = new CronetEngine.Builder(context); +CronetEngine cronetEngine = CronetIntegrationPluginKt + .configureDatadogInstrumentation( + builder, + new RumNetworkInstrumentationConfiguration(), + new ApmNetworkInstrumentationConfiguration( + Arrays.asList("example.com", "example.eu") + ) + ) + .build(); +``` + +{% /tab %} +{% /tabs %} + +#### Apollo instrumentation + +1. [Set up][14] RUM monitoring with Datadog Android RUM. + +2. [Set up](#basic-network-instrumentation) OkHttp instrumentation with the Datadog RUM SDK. + +3. Add the following to your application's build.gradle file. +```groovy +dependencies { + implementation "com.datadoghq:dd-sdk-android-apollo:x.x.x" +} +``` + +4. Add the Datadog interceptor to your Apollo Client setup: + +```kotlin +import com.apollographql.apollo.ApolloClient +import com.apollographql.apollo.network.okHttpClient +import com.datadog.android.apollo.DatadogApolloInterceptor + +val apolloClient = ApolloClient.Builder() + .serverUrl("GraphQL endpoint") + .addInterceptor(DatadogApolloInterceptor()) + .okHttpClient(okHttpClient) + .build() +``` + +This automatically adds Datadog headers to your GraphQL requests, allowing them to be tracked by Datadog. + +{% alert level="danger" %} +- The integration only supports Apollo version `4`. +- The `query` and `mutation` type operations are tracked; `subscription` operations are not. +- GraphQL payload sending is disabled by default. To enable it, set the `sendGraphQLPayloads` flag in the `DatadogApolloInterceptor` constructor as follows: + +```kotlin +DatadogApolloInterceptor(sendGraphQLPayloads = true) +``` +{% /alert %} + +[1]: https://app.datadoghq.com/rum/application/create +[6]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-network-requests +[12]: https://square.github.io/okhttp/features/events/ +[14]: /real_user_monitoring/application_monitoring/android/setup?tab=kotlin#setup diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/flutter.mdoc.md new file mode 100644 index 00000000000..f322a32f059 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/flutter.mdoc.md @@ -0,0 +1,107 @@ +## Automatically track resources + +Use the [Datadog Tracking HTTP Client][10] package to enable automatic tracking of resources and HTTP calls from your views. + +Add the package to your `pubspec.yaml` and add the following to your initialization file: + +```dart +final configuration = DatadogConfiguration( + // configuration + firstPartyHosts: ['example.com'], +)..enableHttpTracking() +``` + +**Note**: The Datadog Tracking HTTP Client modifies [`HttpOverrides.global`][11]. If you are using your own custom `HttpOverrides`, you may need to inherit from [`DatadogHttpOverrides`][12]. In this case, you do not need to call `enableHttpTracking`. Versions of `datadog_tracking_http_client` >= 1.3 check the value of `HttpOverrides.current` and use this for client creation, so you only need to make sure to initialize `HttpOverrides.global` prior to initializing Datadog. + +To enable Datadog [distributed tracing][13], you must set the `DatadogConfiguration.firstPartyHosts` property in your configuration object to a domain that supports distributed tracing. You can also modify the sampling rate for distributed tracing by setting the `traceSampleRate` on your `DatadogRumConfiguration`. + +- `firstPartyHosts` does not allow wildcards, but matches any subdomains for a given domain. For example, `api.example.com` matches `staging.api.example.com` and `prod.api.example.com`, not `news.example.com`. + +- `DatadogRumConfiguration.traceSampleRate` sets a default sampling rate of 20%. If you want all resources requests to generate a full distributed trace, set this value to `100.0`. + +### Track resources from other packages + +While `Datadog Tracking HTTP Client` can track most common network calls in Flutter, Datadog supplies packages for integration into specific networking libraries, including gRPC, GraphQL and Dio. For more information about these libraries, see [Integrated Libraries][22]. + +### Track custom resources + +In addition to tracking resources automatically using the [Datadog Tracking HTTP Client][16], you can track specific custom resources such as network requests or third-party provider APIs using the [following methods][17]: + +- `DdRum.startResource` +- `DdRum.stopResource` +- `DdRum.stopResourceWithError` +- `DdRum.stopResourceWithErrorInfo` + +For example: + +```dart +// in your network client: + +DatadogSdk.instance.rum?.startResource( + "resource-key", + RumHttpMethod.get, + url, +); + +// Later + +DatadogSdk.instance.rum?.stopResource( + "resource-key", + 200, + RumResourceType.image +); +``` + +The `String` used for `resourceKey` in both calls must be unique for the resource you are calling in order for the Flutter Datadog SDK to match a resource's start with its completion. + +## OpenTelemetry setup + +All of Datadog's automatic network tracking packages ([Datadog Tracking HTTP Client][10], [gRPC Interceptor][19], [GQL Link][20], and [Dio Interceptor][21]) support distributed traces through both automatic header generation and header ingestion. This section describes how to use OpenTelemetry with RUM Flutter. + +### Datadog header generation + +When configuring your tracking client or gRPC Interceptor, you can specify the types of tracing headers you want Datadog to generate. For example, if you want to send `b3` headers to `example.com` and `tracecontext` headers for `myapi.names`, you can do so with the following code: + +```dart +final hostHeaders = { + 'example.com': { TracingHeaderType.b3 }, + 'myapi.names': { TracingHeaderType.tracecontext} +}; +``` + +You can use this object during initial configuration: + +```dart +// For default Datadog HTTP tracing: +final configuration = DatadogConfiguration( + // configuration + firstPartyHostsWithTracingHeaders: hostHeaders, +); +``` + +You can then enable tracing as usual. + +This information is merged with any hosts set on `DatadogConfiguration.firstPartyHosts`. Hosts specified in `firstPartyHosts` generate Datadog Tracing Headers by default. + +## Check first party hosts + +To determine if a specific URI is a first party host, use `isFirstPartyHost`. + +For example: +```dart +var host = 'example.com' +if (DatadogSdk.instance.isFirstPartyHost(host)){ + print('$host is a first party host.'); +} +``` + +[10]: https://pub.dev/packages/datadog_tracking_http_client +[11]: https://api.flutter.dev/flutter/dart-io/HttpOverrides/current.html +[12]: https://pub.dev/documentation/datadog_tracking_http_client/latest/datadog_tracking_http_client/DatadogTrackingHttpOverrides-class.html +[13]: /serverless/aws_lambda/distributed_tracing/ +[16]: https://github.com/DataDog/dd-sdk-flutter/tree/main/packages/datadog_tracking_http_client +[17]: https://pub.dev/documentation/datadog_flutter_plugin/latest/datadog_flutter_plugin/ +[19]: https://pub.dev/packages/datadog_grpc_interceptor +[20]: https://pub.dev/packages/datadog_gql_link +[21]: https://pub.dev/packages/datadog_dio +[22]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/ios.mdoc.md new file mode 100644 index 00000000000..7dbf7a0ffe0 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/ios.mdoc.md @@ -0,0 +1,360 @@ +### Custom resources + +In addition to [tracking resources automatically](#automatically-track-network-requests), you can also track specific custom resources such as network requests or third-party provider APIs. This is the recommended approach for third-party libraries that don't expose a `URLSession` delegate. Use the following methods on `RUMMonitor.shared()` to manually collect RUM resources: + +- `.startResource(resourceKey:request:)` +- `.stopResource(resourceKey:response:)` +- `.stopResourceWithError(resourceKey:error:)` +- `.stopResourceWithError(resourceKey:message:)` + +For example: + +{% tabs %} +{% tab label="Swift" %} + +```swift +import DatadogRUM + +// in your network client: + +let rum = RUMMonitor.shared() + +rum.startResource( + resourceKey: "resource-key", + request: request +) + +rum.stopResource( + resourceKey: "resource-key", + response: response +) +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +// in your network client: + +[[DDRUMMonitor shared] startResourceWithResourceKey:@"resource-key" + request:request + attributes:@{}]; + +[[DDRUMMonitor shared] stopResourceWithResourceKey:@"resource-key" + response:response + attributes:@{}]; +``` + +{% /tab %} +{% /tabs %} + +**Note**: The `String` used for `resourceKey` in both calls must be unique for the resource you are calling. This is necessary for the RUM iOS SDK to match a resource's start with its completion. + +For more details and available options, see [`RUMMonitorProtocol` in GitHub][4]. + +### Automatically track network requests + +Network requests are automatically tracked after you enable RUM with the `urlSessionTracking` configuration. + +#### (Optional) Enable detailed timing breakdown + +To get detailed timing breakdown (DNS resolution, SSL handshake, time to first byte, connection time, and download duration), enable `URLSessionInstrumentation` for your delegate type: + +{% tabs %} +{% tab label="Swift" %} + +```swift +URLSessionInstrumentation.enableDurationBreakdown( + with: .init( + delegateClass: .self + ) +) + +let session = URLSession( + configuration: .default, + delegate: (), + delegateQueue: nil +) +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +DDURLSessionInstrumentationConfiguration *config = [[DDURLSessionInstrumentationConfiguration alloc] initWithDelegateClass:[ class]]; +[DDURLSessionInstrumentation enableWithConfiguration:config]; + +NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] + delegate:[[ alloc] init] + delegateQueue:nil]; +``` + +{% /tab %} +{% /tabs %} + +**Notes**: +- Without `URLSessionInstrumentation`, network requests are still tracked. Enabling it provides detailed timing breakdown for performance analysis. +- Response data is available in the `resourceAttributesProvider` callback (set in `RUM.Configuration.URLSessionTracking`) for tasks with completion handlers in automatic mode, and for all tasks after enabling `URLSessionInstrumentation`. +- To filter out specific requests from being tracked, use the `resourceEventMapper` in `RUM.Configuration` (see [Modify or drop RUM events](#modify-or-drop-rum-events)). + +{% alert level="info" %} +Be mindful of delegate retention. +While Datadog instrumentation does not create memory leaks directly, it relies on `URLSession` delegates. According to [Apple documentation](https://developer.apple.com/documentation/foundation/urlsession/init(configuration:delegate:delegatequeue:)#parameters): +"The session object keeps a strong reference to the delegate until your app exits or explicitly invalidates the session. If you do not invalidate the session by calling the `invalidateAndCancel()` or `finishTasksAndInvalidate()` method, your app leaks memory until it exits." +To avoid memory leaks, make sure to invalidate any `URLSession` instances you no longer need. +{% /alert %} + +If you have more than one delegate type in your app that you want to instrument, you can call `URLSessionInstrumentation.enable(with:)` for each delegate type. + +Also, you can configure first party hosts using `urlSessionTracking`. This classifies resources that match the given domain as "first party" in RUM and propagates tracing information to your backend (if you have enabled Tracing). Network traces are sampled with an adjustable sampling rate. A sampling of 20% is applied by default. + +For instance, you can configure `example.com` as the first party host and enable both RUM and Tracing features: + +{% tabs %} +{% tab label="Swift" %} + +```swift + +import DatadogRUM + +RUM.enable( + with: RUM.Configuration( + applicationID: "", + uiKitViewsPredicate: DefaultUIKitRUMViewsPredicate(), + uiKitActionsPredicate: DefaultUIKitRUMActionsPredicate(), + urlSessionTracking: RUM.Configuration.URLSessionTracking( + firstPartyHostsTracing: .trace(hosts: ["example.com"], sampleRate: 20) + ) + ) +) + +URLSessionInstrumentation.enable( + with: .init( + delegateClass: .self + ) +) + +let session = URLSession( + configuration: .default, + delegate: (), + delegateQueue: nil +) +``` + +This tracks all requests sent with the instrumented `session`. Requests matching the `example.com` domain are marked as "first party" and tracing information is sent to your backend to [connect the RUM resource with its Trace](https://docs.datadoghq.com/real_user_monitoring/correlate_with_other_telemetry/apm?tab=browserrum). +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +@import DatadogRUM; + +DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; +DDRUMURLSessionTracking *urlSessionTracking = [DDRUMURLSessionTracking new]; +[urlSessionTracking setFirstPartyHostsTracing:[DDRUMFirstPartyHostsTracing alloc] initWithHosts:@[@"example.com"] sampleRate:20]; +[configuration setURLSessionTracking:urlSessionTracking]; + +[DDRUM enableWith:configuration]; +``` + +{% /tab %} +{% /tabs %} + +To add custom attributes to resources, use the `URLSessionTracking.resourceAttributesProvider` option when enabling the RUM. By setting attributes provider closure, you can return additional attributes to be attached to tracked resource. + +For instance, you may want to add HTTP request and response headers to the RUM resource: + +```swift +RUM.enable( + with: RUM.Configuration( + ... + urlSessionTracking: RUM.Configuration.URLSessionTracking( + resourceAttributesProvider: { request, response, data, error in + return [ + "request.headers" : redactedHeaders(from: request), + "response.headers" : redactedHeaders(from: response) + ] + } + ) + ) +) +``` + +#### Capture resource headers + +When [tracking network requests automatically](#automatically-track-network-requests), you can capture HTTP request and response headers on RUM Resources by setting `trackResourceHeaders` on `RUM.Configuration.URLSessionTracking`. This option is disabled by default. + +Captured headers appear on the RUM Resource event under `resource.request.headers` and `resource.response.headers` and are queryable in the RUM Explorer. + +Use `.defaults` to capture a predefined set of common headers: + +```swift +RUM.enable( + with: RUM.Configuration( + applicationID: "", + urlSessionTracking: RUM.Configuration.URLSessionTracking( + trackResourceHeaders: .defaults + ) + ) +) +``` + +The following headers are captured with `.defaults`: + +| Direction | Headers | +|-----------|---------| +| Request | `cache-control`, `content-type` | +| Response | `age`, `cache-control`, `content-encoding`, `content-length`, `content-type`, `etag`, `expires`, `server-timing`, `vary`, `x-cache` | + +To capture additional headers on top of the defaults, use `.custom` with `.matchHeaders`. For example, to also capture `x-request-id` and `x-datadog-trace` on both request and response: + +```swift +RUM.enable( + with: RUM.Configuration( + applicationID: "", + urlSessionTracking: RUM.Configuration.URLSessionTracking( + trackResourceHeaders: .custom([ + .defaults, + .matchHeaders(["x-request-id", "x-datadog-trace"]) + ]) + ) + ) +) +``` + +**Note**: Sensitive headers (such as tokens, API keys, and cookies) are filtered out automatically, even if listed explicitly. + +If you don't want to track requests, you can disable URLSessionInstrumentation for the delegate type: + +{% tabs %} +{% tab label="Swift" %} + +```swift +URLSessionInstrumentation.disable(delegateClass: .self) +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +[DDURLSessionInstrumentation disableWithDelegateClass:[ class]]; +``` + +{% /tab %} +{% /tabs %} + +#### Apollo instrumentation + +Instrumenting Apollo in your iOS application gives RUM visibility into GraphQL errors and performance. Because GraphQL requests all go to a single endpoint and often return 200 OK even on errors, default HTTP instrumentation lacks context. It lets RUM capture the operation name, operation type, and variables (and optionally the payload). This provides more detailed context for each network request. + +This integration supports both Apollo iOS 1.0+ and Apollo iOS 2.0+. Follow the instructions for the Apollo iOS version you have below. + +1. [Set up][2] RUM monitoring with Datadog iOS RUM. + +2. Add the following to your application's `Package.swift` file: + + ```swift + dependencies: [ + // For Apollo iOS 1.0+ + .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "1.0.0")) + + // For Apollo iOS 2.0+ + .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "2.0.0")) + ] + ``` + + Alternatively, you can add it using Xcode: + 1. Go to **File** → **Add Package Dependencies**. + 2. Enter the repository URL: `https://github.com/DataDog/dd-sdk-ios-apollo-interceptor`. + 3. Select the package version that matches your Apollo major version (choose `1.x.x` for Apollo iOS 1.0+ or `2.x.x` for Apollo iOS 2.0+). + +3. Set up network instrumentation based on your Apollo iOS version: + +{% tabs %} +{% tab label="Apollo iOS 1.0+" %} +Set up network instrumentation for Apollo's built-in URLSessionClient: + +```swift +import Apollo + +URLSessionInstrumentation.enable(with: .init(delegateClass: URLSessionClient.self)) +``` + +Add the Datadog interceptor to your Apollo Client setup: + +```swift +import Apollo +import DatadogApollo + +class CustomInterceptorProvider: DefaultInterceptorProvider { + override func interceptors(for operation: Operation) -> [ApolloInterceptor] { + var interceptors = super.interceptors(for: operation) + interceptors.insert(DatadogApolloInterceptor(), at: 0) + return interceptors + } +} +``` + +{% /tab %} +{% tab label="Apollo iOS 2.0+" %} +Configure network instrumentation using the provided `DatadogApolloDelegate` and `DatadogApolloURLSession`: + +```swift +import Apollo +import DatadogApollo +import DatadogCore + +// Create the Datadog delegate +let delegate = DatadogApolloDelegate() + +// Create the custom URLSession wrapper +let customSession = DatadogApolloURLSession( + configuration: .default, + delegate: delegate +) + +// Enable Datadog instrumentation for the delegate +URLSessionInstrumentation.enable( + with: .init(delegateClass: DatadogApolloDelegate.self) +) + +// Configure Apollo Client with the custom session +let networkTransport = RequestChainNetworkTransport( + urlSession: customSession, + interceptorProvider: NetworkInterceptorProvider(), + store: store, + endpointURL: url +) +``` + +Create an interceptor provider with the Datadog interceptor: + +```swift +import Apollo +import DatadogApollo + +struct NetworkInterceptorProvider: InterceptorProvider { + func graphQLInterceptors(for operation: Operation) -> [any GraphQLInterceptor] where Operation : GraphQLOperation { + return [DatadogApolloInterceptor()] + DefaultInterceptorProvider.shared.graphQLInterceptors(for: operation) + } +} +``` + +{% /tab %} +{% /tabs %} + +This lets Datadog RUM extract the operation type, name, variables, and payloads (optional) automatically from the requests to enrich GraphQL Requests RUM Resources. + +{% alert level="info" %} +- The integration supports Apollo iOS versions `1.0+` and `2.0+`. +- The `query` and `mutation` type operations are tracked; `subscription` operations are not. +- GraphQL payload sending is disabled by default. To enable it, set the `sendGraphQLPayloads` flag in the `DatadogApolloInterceptor` constructor as follows: + + ```swift + let datadogInterceptor = DatadogApolloInterceptor(sendGraphQLPayloads: true) + ``` + +{% /alert %} + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/ios +[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/kotlin_multiplatform.mdoc.md new file mode 100644 index 00000000000..75ae74d97b3 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/kotlin_multiplatform.mdoc.md @@ -0,0 +1,47 @@ +### Enrich resources + +When [tracking resources automatically][6], provide a custom `RumResourceAttributesProvider` instance to add custom attributes to each tracked network request/response. For example, if you want to track a network request's headers, create an implementation like the following, and pass it in the `datadogKtorPlugin` initialization call. + +```kotlin +class CustomRumResourceAttributesProvider : RumResourceAttributesProvider { + override fun onRequest(request: HttpRequestSnapshot) = + request.headers.names().associateWith { request.headers[it] }.mapKeys { "header.$it" } + + override fun onResponse(response: HttpResponse) = emptyMap() + + override fun onError(request: HttpRequestSnapshot, throwable: Throwable) = emptyMap() +} + +val ktorClient = HttpClient { + install( + datadogKtorPlugin( + tracedHosts = mapOf( + "example.com" to setOf(TracingHeaderType.DATADOG), + "example.eu" to setOf(TracingHeaderType.DATADOG) + ), + rumResourceAttributesProvider = CustomRumResourceAttributesProvider() + ) + ) +} +``` + +### Custom resources + +In addition to [tracking resources automatically][6], you can also track specific custom resources (such as network requests and third-party provider APIs) with methods (such as `GET` and `POST`) while loading the resource with `RumMonitor#startResource`. Stop tracking with `RumMonitor#stopResource` when it is fully loaded, or `RumMonitor#stopResourceWithError` if an error occurs while loading the resource. + +```kotlin +fun loadResource() { + GlobalRumMonitor.get().startResource(resourceKey, method, url, resourceAttributes) + try { + // do load the resource + GlobalRumMonitor.get().stopResource(resourceKey, resourceKind, additionalAttributes) + } catch (e: Exception) { + GlobalRumMonitor.get().stopResourceWithError(resourceKey, message, origin, e) + } +} +``` + +**Note**: `stopResource` / `stopResourceWithError` methods accepting `NSURLConnection` and `NSError` are also available from iOS source set. + +[1]: https://app.datadoghq.com/rum/application/create +[6]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#initialize-rum-ktor-plugin-to-track-network-events-made-with-ktor diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/react_native.mdoc.md new file mode 100644 index 00000000000..7570aa94155 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/react_native.mdoc.md @@ -0,0 +1,28 @@ +### Manually track RUM resources + +You can manually track RUM resources: + +```javascript +DdRum.startResource('', 'GET', 'http://www.example.com/api/v1/test', {}, Date.now()); +//... +DdRum.stopResource('', 200, 'xhr', (size = 1337), {}, Date.now()); +``` + +### Manually send spans + +You can send spans manually: + +```javascript +const spanId = await DdTrace.startSpan('foo', { custom: 42 }, Date.now()); +//... +DdTrace.finishSpan(spanId, { custom: 21 }, Date.now()); +``` + +## Resource timings + +Resource tracking provides the following timings: + +- `First Byte`: The time between the scheduled request and the first byte of the response. This includes time for the request preparation on the native level, network latency, and the time it took the server to prepare the response. +- `Download`: The time it took to receive a response. + +[1]: https://app.datadoghq.com/rum/application/create diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/roku.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/roku.mdoc.md new file mode 100644 index 00000000000..ccfb2a6ed77 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/roku.mdoc.md @@ -0,0 +1,79 @@ +## Track RUM resources + +### roUrlTransfer + +Network requests made directly with a `roUrlTransfer` node must be tracked. + +For *synchronous requests*, you can use Datadog's `datadogroku_DdUrlTransfer` wrapper to track the resource automatically. This wrapper supports most features of the `roUrlTransfer` component, but does not support anything related to async network calls. + +For example, here's how to do a `GetToString` call: + +```text + ddUrlTransfer = datadogroku_DdUrlTransfer(m.global.datadogRumAgent) + ddUrlTransfer.SetUrl(url) + ddUrlTransfer.EnablePeerVerification(false) + ddUrlTransfer.EnableHostVerification(false) + result = ddUrlTransfer.GetToString() +``` + +For *asynchronous requests*, automatic instrumentation is not supported. You need to track the resource manually. The following code snippet shows how to report the request as a RUM Resource: + +```text +sub performRequest() + + m.port = CreateObject("roMessagePort") + request = CreateObject("roUrlTransfer") + ' setup the node url, headers, … + + timer = CreateObject("roTimespan") + timer.Mark() + request.AsyncGetToString() + + while (true) + msg = wait(1000, m.port) + if (msg <> invalid) + msgType = type(msg) + if (msgType = "roUrlEvent") + if (msg.GetInt() = 1) ' transfer complete + durationMs& = timer.TotalMilliseconds() + transferTime# = datadogroku_millisToSec(durationMs&) + httpCode = msg.GetResponseCode() + status = "ok" + if (httpCode < 0) + status = msg.GetFailureReason() + end if + resource = { + url: requestUrl + method: "GET" + transferTime: transferTime# + httpCode: httpCode + status: status + } + m.global.datadogRumAgent.callfunc("addResource", resource) + end if + end if + end if + end while +end sub +``` + +### Streaming resources + +Whenever you use a `Video` or an `Audio` node to stream media, you can forward all `roSystemLogEvent` you receive to Datadog as follows: + +```text + sysLog = CreateObject("roSystemLog") + sysLog.setMessagePort(m.port) + sysLog.enableType("http.error") + sysLog.enableType("http.complete") + + while(true) + msg = wait(0, m.port) + if (type(msg) = "roSystemLogEvent") + m.global.datadogRumAgent.callfunc("addResource", msg.getInfo()) + end if + end while +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/roku/setup diff --git a/layouts/shortcodes/mdoc/en/sdk/track_network_requests/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/unity.mdoc.md new file mode 100644 index 00000000000..94078bd4a5b --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_network_requests/unity.mdoc.md @@ -0,0 +1,47 @@ +### Track resources + +Datadog provides `DatadogTrackedWebRequest` as a drop in replacement for `UnityWebRequest` to enable tracking of resources and HTTP calls from your RUM views. + +You can use it the same way as you would any other `UnityWebRequest`: + +```csharp +var request = DatadogTrackedWebRequest.Get("https://httpbin.org/headers"); +yield return request.SendWebRequest(); + +Debug.Log("Got result: " + request.downloadHandler.text); +``` + +### Track custom resources + +In addition to tracking resources automatically using `DatadogTrackedWebRequest`, you can track specific custom resources such as network requests or third-party provider APIs using the following methods: + +- `DdRum.StartResource` +- `DdRum.StopResource` +- `DdRum.StopResourceWithError` +- `DdRum.StopResourceWithErrorInfo` + +For example: + +```csharp +// in your network client: + +DatadogSdk.Instance.Rum.StartResource( + "resource-key", + RumHttpMethod.Get, + url, +); + +// Later + +DatadogSdk.Instance.Rum.StopResource( + "resource-key", + 200, + RumResourceType.Image +); +``` + +The `string` used for `resourceKey` in both calls must be unique for the resource you are calling in order for the Unity Datadog SDK to match a resource's start with its completion. + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/unity/setup/ +[3]: /real_user_monitoring/application_monitoring/unity/data_collected/ diff --git a/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/android.mdoc.md new file mode 100644 index 00000000000..893f579c0ac --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/android.mdoc.md @@ -0,0 +1,58 @@ +### Automatically track long tasks + +Long running operations performed on the main thread can impact the visual performance and reactivity of your application. To track these operations, define the duration threshold above which a task is considered too long. + +{% tabs %} +{% tab label="Kotlin" %} +```kotlin +val rumConfig = RumConfiguration.Builder(applicationId) + // … + .trackLongTasks(durationThreshold) + .build() +``` + +For example, to replace the default `100 ms` duration, set a custom threshold in your configuration. + +```kotlin +val rumConfig = RumConfiguration.Builder(applicationId) + // … + .trackLongTasks(250L) // track tasks longer than 250ms as long tasks + .build() +``` + +{% /tab %} +{% tab label="Java" %} + +```java +RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId) + // … + .trackLongTasks(durationThreshold) + .build(); +``` + +For example, to replace the default `100 ms` duration, set a custom threshold in your configuration. + +```java +RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId) + // … + .trackLongTasks(250L) // track tasks longer than 250ms as long tasks + .build(); +``` + +{% /tab %} +{% /tabs %} + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/android +[3]: /real_user_monitoring/android/data_collected +[4]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-views +[5]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#initialization-parameters +[6]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#automatically-track-network-requests +[7]: /real_user_monitoring/android/data_collected/#event-specific-attributes +[8]: /real_user_monitoring/application_monitoring/android/setup/#sending-data-when-device-is-offline +[9]: https://github.com/DataDog/dd-sdk-android/blob/eaa15cd344d1723fafaf179fcebf800d6030c6bb/sample/kotlin/src/main/kotlin/com/datadog/android/sample/SampleApplication.kt#L279 +[10]: https://github.com/DataDog/dd-sdk-android/tree/master/sample/kotlin/src/main/kotlin/com/datadog/android/sample/widget +[11]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#time-to-network-settled +[12]: https://square.github.io/okhttp/features/events/ +[13]: /real_user_monitoring/application_monitoring/android/monitoring_app_performance/#interaction-to-next-view +[14]: /real_user_monitoring/application_monitoring/android/setup?tab=kotlin#setup diff --git a/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/flutter.mdoc.md new file mode 100644 index 00000000000..cb31258d39c --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/flutter.mdoc.md @@ -0,0 +1,57 @@ +### Notify the SDK that your view finished loading + +iOS RUM tracks the time it takes for your view to load. To notify the SDK that your view has finished loading, call the `addViewLoadingTime` method on `DatadogRum`. +Call this method when your view is fully loaded and ready to be displayed to the user: + +```dart + DatadogSdk.instance.rum?.addViewLoadingTime(override); +``` + +Use the `override` option to replace the previously calculated loading time for the current view. + +After the loading time is sent, it is accessible as `@view.loading_time` and is visible in the RUM UI. + +**Note**: This API is still experimental and might change in the future. + +### Add your own performance timing + +In addition to RUM's default attributes, you can measure where your application is spending its time by using `DdRum.addTiming`. The timing measure is relative to the start of the current RUM view. + +For example, you can time how long it takes for your hero image to appear: + +```dart +void _onHeroImageLoaded() { + DatadogSdk.instance.rum?.addTiming("hero_image"); +} +``` + +After you set the timing, it is accessible as `@view.custom_timings.`. For example, `@view.custom_timings.hero_image`. + +To create visualizations in your dashboards, [create a measure][15] first. + +## Flutter-specific performance metrics + +To enable the collection of Flutter-specific performance metrics, set `reportFlutterPerformance: true` in `DatadogRumConfiguration`. Widget build and raster times are displayed in [Mobile Vitals][18]. + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/flutter/setup/ +[3]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries/ +[4]: /getting_started/tagging/#defining-tags +[5]: /real_user_monitoring/connect_rum_and_traces/?tab=browserrum#how-are-rum-resources-linked-to-traces +[6]: https://github.com/openzipkin/b3-propagation#single-headers +[7]: https://github.com/openzipkin/b3-propagation#multiple-headers +[8]: https://www.w3.org/TR/trace-context/#tracestate-header +[9]: /real_user_monitoring/application_monitoring/browser/frustration_signals/ +[10]: https://pub.dev/packages/datadog_tracking_http_client +[11]: https://api.flutter.dev/flutter/dart-io/HttpOverrides/current.html +[12]: https://pub.dev/documentation/datadog_tracking_http_client/latest/datadog_tracking_http_client/DatadogTrackingHttpOverrides-class.html +[13]: /serverless/aws_lambda/distributed_tracing/ +[14]: /real_user_monitoring/application_monitoring/flutter/data_collected +[15]: /real_user_monitoring/explorer/?tab=measures#setup-facets-and-measures +[16]: https://github.com/DataDog/dd-sdk-flutter/tree/main/packages/datadog_tracking_http_client +[17]: https://pub.dev/documentation/datadog_flutter_plugin/latest/datadog_flutter_plugin/ +[18]: /real_user_monitoring/application_monitoring/mobile_vitals/?tab=flutter +[19]: https://pub.dev/packages/datadog_grpc_interceptor +[20]: https://pub.dev/packages/datadog_gql_link +[21]: https://pub.dev/packages/datadog_dio +[22]: /real_user_monitoring/application_monitoring/flutter/integrated_libraries diff --git a/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/kotlin_multiplatform.mdoc.md new file mode 100644 index 00000000000..a031bc89cf6 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/kotlin_multiplatform.mdoc.md @@ -0,0 +1,43 @@ +### Add your own performance timing + +In addition to RUM's default attributes, you can measure where your application is spending its time by using the `addTiming` API. The timing measure is relative to the start of the current RUM view. For example, you can time how long it takes for your hero image to appear: + +```kotlin +fun onHeroImageLoaded() { + GlobalRumMonitor.get().addTiming("hero_image") +} +``` + +After the timing is sent, the timing is accessible as `@view.custom_timings.`. For example: `@view.custom_timings.hero_image`. You must [create a measure][8] before graphing it in RUM analytics or in dashboards. + +### Automatically track long tasks + +Long running operations performed on the main thread can impact the visual performance and reactivity of your application. To track these operations, define the duration threshold above which a task is considered too long. + +```kotlin +val rumConfig = RumConfiguration.Builder(applicationId) + // … + .trackLongTasks(durationThreshold) + .build() +``` + +For example, to replace the default `100 ms` duration, set a custom threshold in your configuration. + +```kotlin +val rumConfig = RumConfiguration.Builder(applicationId) + // … + .trackLongTasks(250L) // track tasks longer than 250ms as long tasks + .build() +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/kotlin_multiplatform +[3]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected +[4]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#automatically-track-views +[5]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#initialization-parameters +[6]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#initialize-rum-ktor-plugin-to-track-network-events-made-with-ktor +[7]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected +[8]: /real_user_monitoring/explorer/search/#setup-facets-and-measures +[9]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/#sending-data-when-device-is-offline +[10]: /real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting +[a1]: https://docs.datadoghq.com/help/ diff --git a/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/react_native.mdoc.md new file mode 100644 index 00000000000..10cc6738cfa --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_ui_latency/react_native.mdoc.md @@ -0,0 +1,46 @@ +### Notify the SDK that your view finished loading + +You can notify the SDK that your view has finished loading by calling the `addViewLoadingTime` method on `DdRum`. +Call this method when your view is fully loaded and ready to be displayed to the user: + +```javascript +DdRum.addViewLoadingTime(true); +``` + +Use the `overwrite` parameter to replace the previously calculated loading time for the current view. + +After the loading time is sent, it is accessible as `@view.loading_time` and is visible in the RUM UI. + +**Note**: This API is experimental. + +### Add custom timings + +You can add custom timings: + +```javascript +DdRum.addTiming(''); +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/react_native +[3]: https://jestjs.io/ +[4]: /account_management/api-app-keys/#client-tokens +[5]: /getting_started/tagging/#define-tags +[6]: /getting_started/site/ +[7]: /real_user_monitoring/application_monitoring/browser/frustration_signals/ +[8]: /real_user_monitoring/correlate_with_other_telemetry/apm?tab=reactnativerum +[9]: /real_user_monitoring/guide/proxy-mobile-rum-data/ +[10]: https://github.com/wix/react-native-navigation +[11]: /real_user_monitoring/application_monitoring/react_native/integrated_libraries/ +[12]: https://github.com/react-navigation/react-navigation +[13]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation +[14]: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/683ec4a2b420ff6bd3873a7338416ad3ec0b6595/types/react-native-side-menu/index.d.ts#L2 +[15]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest +[16]: https://reactnative.dev/docs/global-requestIdleCallback +[17]: https://reactnative.dev/docs/interactionmanager#runafterinteractions +[18]: https://github.com/DataDog/dd-sdk-reactnative-examples/tree/main/rum-react-navigation-async +[19]: /real_user_monitoring/guide/monitor-hybrid-react-native-applications +[20]: /real_user_monitoring/error_tracking/mobile/ios/?tab=cocoapods#configure-the-app-hang-threshold +[21]: #rum-configuration +[22]: #logs-configuration +[23]: #trace-configuration diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/android.mdoc.md new file mode 100644 index 00000000000..c96c62c0045 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/android.mdoc.md @@ -0,0 +1,34 @@ +### Track user sessions + +Adding user information to your RUM sessions makes it possible to: +* Follow the journey of a given user +* Know which users are the most impacted by errors +* Monitor performance for your most important users + +{% img src="real_user_monitoring/browser/advanced_configuration/user-api-1.png" alt="User attributes of a session in the RUM UI" /%} + +| Attribute | Type | Description | +| ----------- | ------ | ------------------------------------------------------------------------------- | +| `usr.id` | String | (Required) Unique user identifier. | +| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. | +| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. | + +To identify user sessions, use the `setUserInfo` API, for example: + +```kotlin +Datadog.setUserInfo('1234', 'John Doe', 'john@doe.com') +``` + +### Add user properties + +You can use the `addUserProperties` API to append extra user properties to previously set properties. + +```kotlin +fun addUserProperties(extraInfo: Map, sdkCore: SdkCore = getInstance()) { + sdkCore.addUserProperties(extraInfo) +} +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/android +[3]: /real_user_monitoring/android/data_collected diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/flutter.mdoc.md new file mode 100644 index 00000000000..92df4a200f7 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/flutter.mdoc.md @@ -0,0 +1,41 @@ +### Track user sessions + +Adding user information to your RUM sessions makes it possible to: + +* Follow the journey of a given user +* Know which users are the most impacted by errors +* Monitor performance for your most important users + +{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="User API in the RUM UI" style="width:90%" /%} + +| Attribute | Type | Description | +| ----------- | ------ | ------------------------------------------------------------------------------- | +| `usr.id` | String | (Required) Unique user identifier. | +| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. | +| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. | + +To identify user sessions, use `DatadogSdk.setUserInfo`. + +For example: + +```dart +DatadogSdk.instance.setUserInfo("1234", "John Doe", "john@doe.com"); +``` + +### Add custom user attributes + +You can add custom attributes to your user session. This additional information is automatically applied to logs, traces, and RUM events. + +To remove an existing attribute, set it to `null`. + +For example: + +```dart +DatadogSdk.instance.addUserExtraInfo({ + 'attribute_1': 'foo', + 'attribute_2': null, +}); +``` + +[1]: https://app.datadoghq.com/rum/application/create +[14]: /real_user_monitoring/application_monitoring/flutter/data_collected diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/ios.mdoc.md new file mode 100644 index 00000000000..fe8b7c9cb8f --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/ios.mdoc.md @@ -0,0 +1,51 @@ +### Track user sessions + +Adding user information to your RUM sessions makes it possible to: + +* Follow the journey of a given user +* Know which users are the most impacted by errors +* Monitor performance for your most important users + +{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="User API in the RUM UI" /%} + +| Attribute | Type | Description | +| ----------- | ------ | ------------------------------------------------------------------------------- | +| `usr.id` | String | (Required) Unique user identifier. | +| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. | +| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. | + +To identify user sessions, use the `Datadog.setUserInfo(id:name:email:)` API. + +For example: + +{% tabs %} +{% tab label="Swift" %} + +```swift +import DatadogCore + +Datadog.setUserInfo(id: "1234", name: "John Doe", email: "john@doe.com") +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +[DDDatadog setUserInfoWithId:@"1234" name:@"John Doe" email:@"john@doe.com" extraInfo:@{}]; +``` + +{% /tab %} +{% /tabs %} + +## Add user properties + +You can use the `Datadog.addUserExtraInfo(_:)` API to append extra user properties to previously set properties. + +```swift +import DatadogCore + +Datadog.addUserExtraInfo(["company": "Foo"]) +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/ios diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/kotlin_multiplatform.mdoc.md new file mode 100644 index 00000000000..34f20adac0b --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/kotlin_multiplatform.mdoc.md @@ -0,0 +1,31 @@ +### Track user sessions + +Adding user information to your RUM sessions helps you to: +* Follow the journey of a given user +* Know which users are the most impacted by errors +* Monitor performance for your most important users + +{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="User API in RUM UI" /%} + +| Attribute | Type | Description | +| ----------- | ------ | ------------------------------------------------------------------------------- | +| `usr.id` | String | (Required) Unique user identifier. | +| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. | +| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. | + +To identify user sessions, use the `setUserInfo` API, for example: + +```kotlin +Datadog.setUserInfo('1234', 'John Doe', 'john@doe.com') +``` + +### Add user properties + +You can use the `addUserExtraInfo` API to append extra user properties to previously set properties. + +```kotlin +Datadog.addUserExtraInfo(extraInfo) +``` + +[1]: https://app.datadoghq.com/rum/application/create +[3]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/react_native.mdoc.md new file mode 100644 index 00000000000..dc4e83b092c --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/react_native.mdoc.md @@ -0,0 +1,45 @@ +### Track user sessions + +Adding user information to your RUM sessions makes it possible to: +* Follow the journey of a given user +* Know which users are the most impacted by errors +* Monitor performance for your most important users + +{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="User API in RUM UI" /%} + +| Attribute | Type | Description | +| ----------- | ------ | ------------------------------------------------------------------------------- | +| `usr.id` | String | (Required) Unique user identifier. | +| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. | +| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. | +| `usr.extraInfo` | Object | (Optional) Include custom attributes such as subscription type, any user specific information that enhance user context in RUM sessions. | + +To identify user sessions, use the `setUserInfo` API, for example: + +```js +DdSdkReactNative.setUserInfo({ + id: '1337', + name: 'John Smith', + email: 'john@example.com', + extraInfo: { + type: 'premium' + } +}); +``` + +If you want to add or update user information, you can use the following code to modify the existing user's details. + +```js +DdSdkReactNative.addUserExtraInfo({ + hasPaid: 'true' +}); +``` + +If you want to clear the user information (for example, when the user signs out), you can do so by calling the `clearUserInfo` API: + +```js +DdSdkReactNative.clearUserInfo(); +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/react_native diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/roku.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/roku.mdoc.md new file mode 100644 index 00000000000..e335e3a537d --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/roku.mdoc.md @@ -0,0 +1,21 @@ +### Identifying your users + +Adding user information to your RUM sessions makes it possible to: +* Follow the journey of a given user. +* Know which users are the most impacted by errors. +* Monitor performance for your most important users. + +| Attribute | Type | Description | +| ----------- | ------ | ------------------------------------------------------------------------------- | +| `usr.id` | String | (Required) Unique user identifier. | +| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. | +| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. | + +To identify user sessions, use the `datadogUserInfo` global field, after initializing the SDK, for example: + +```text + m.global.setField("datadogUserInfo", { id: 42, name: "Abcd Efg", email: "abcd.efg@example.com"}) +``` + +[1]: https://app.datadoghq.com/rum/application/create +[2]: /real_user_monitoring/application_monitoring/roku/setup diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_ids/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/unity.mdoc.md new file mode 100644 index 00000000000..fcc63c519d8 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_ids/unity.mdoc.md @@ -0,0 +1,42 @@ +### Track user sessions + +Adding user information to your RUM sessions makes it possible to: + +* Follow the journey of a given user +* Know which users are the most impacted by errors +* Monitor performance for your most important users + +{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="User API in the RUM UI" style="width:90%" /%} + +| Attribute | Type | Description | +| ----------- | ------ | ------------------------------------------------------------------------------- | +| `usr.id` | String | (Required) Unique user identifier. | +| `usr.name` | String | (Optional) User friendly name, displayed by default in the RUM UI. | +| `usr.email` | String | (Optional) User email, displayed in the RUM UI if the user name is not present. | + +To identify user sessions, use `DatadogSdk.SetUserInfo`. + +For example: + +```csharp +DatadogSdk.Instance.SetUserInfo("1234", "John Doe", "john@doe.com"); +``` + +### Add custom user attributes + +You can add custom attributes to your user session. This additional information is automatically applied to logs, traces, and RUM events. + +To remove an existing attribute, set it to `null`. + +For example: + +```csharp +DatadogSdk.Instance.AddUserExtraInfo(new () +{ + { "attribute_1", "foo" }, + { "attribute_2", null }, +}); +``` + +[1]: https://app.datadoghq.com/rum/application/create +[3]: /real_user_monitoring/application_monitoring/unity/data_collected/ diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/android.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/android.mdoc.md new file mode 100644 index 00000000000..efc5e285aaa --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/android.mdoc.md @@ -0,0 +1,34 @@ +### Custom actions + +In addition to [tracking actions automatically][5], you can also track specific custom user actions (such as taps, clicks, and scrolls) with `RumMonitor#addAction`. For continuous action tracking (for example, tracking a user scrolling a list), use `RumMonitor#startAction` and `RumMonitor#stopAction`. + +The action type should be one of the following: "custom", "click", "tap", "scroll", "swipe", "back". + +{% tabs %} +{% tab label="Kotlin" %} + +```kotlin +fun onUserInteraction() { + GlobalRumMonitor.get().addAction(actionType, name, actionAttributes) +} +``` + +{% /tab %} +{% tab label="Java" %} + +```java +public void onUserInteraction() { + GlobalRumMonitor.get().addAction(actionType, name, actionAttributes); +} +``` + +{% /tab %} +{% /tabs %} + +## Track widgets + +Widgets are not automatically tracked with the SDK. To send UI interactions from your widgets manually, call the Datadog API. [See example][10]. + +[1]: https://app.datadoghq.com/rum/application/create +[5]: /real_user_monitoring/application_monitoring/android/advanced_configuration/#initialization-parameters +[10]: https://github.com/DataDog/dd-sdk-android/tree/master/sample/kotlin/src/main/kotlin/com/datadog/android/sample/widget diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/flutter.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/flutter.mdoc.md new file mode 100644 index 00000000000..57c9225db53 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/flutter.mdoc.md @@ -0,0 +1,20 @@ +### Track user actions + +You can track specific user actions such as taps, clicks, and scrolls using `DdRum.addAction`. + +To manually register instantaneous RUM actions such as `RumActionType.tap`, use `DdRum.addAction()`. For continuous RUM actions such as `RumActionType.scroll`, use `DdRum.startAction()` or `DdRum.stopAction()`. + +For example: + +```dart +void _downloadResourceTapped(String resourceName) { + DatadogSdk.instance.rum?.addAction( + RumActionType.tap, + resourceName, + ); +} +``` + +When using `DdRum.startAction` and `DdRum.stopAction`, the `type` action must be the same for the Datadog Flutter SDK to match an action's start with its completion. + +[1]: https://app.datadoghq.com/rum/application/create diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/ios.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/ios.mdoc.md new file mode 100644 index 00000000000..38bfabd0d00 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/ios.mdoc.md @@ -0,0 +1,117 @@ +### Custom actions + +In addition to [tracking actions automatically](#automatically-track-user-actions), you can track specific custom user actions (taps, clicks, and scrolls) with the `addAction(type:name:)` API. + +To manually register instantaneous RUM actions such as `.tap` on `RUMMonitor.shared()`, use `.addAction(type:name:)`. For continuous RUM actions such as `.scroll`, use `.startAction(type:name:)` or `.stopAction(type:)`. + +For example: + +{% tabs %} +{% tab label="Swift" %} + +```swift +import DatadogRUM + +// in your `UIViewController`: + +let rum = RUMMonitor.shared() + +@IBAction func didTapDownloadResourceButton(_ sender: UIButton) { + rum.addAction( + type: .tap, + name: sender.currentTitle ?? "" + ) +} +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +- (IBAction)didTapDownloadResourceButton:(UIButton *)sender { + NSString *name = sender.currentTitle ? sender.currentTitle : @""; + [[DDRUMMonitor shared] addActionWithType:DDRUMActionTypeTap name:name attributes:@{}]; +} +``` + +{% /tab %} +{% /tabs %} + +**Note**: When using `.startAction(type:name:)` and `.stopAction(type:)`, the action `type` must be the same. This is necessary for the RUM iOS SDK to match an action start with its completion. + +For more details and available options, see [`RUMMonitorProtocol` in GitHub][4]. + +### Automatically track user actions + +#### UIKit + +To automatically track user tap actions with UIKit, set the `uiKitActionsPredicate` option when enabling RUM. + +#### SwiftUI + +To automatically track user tap actions in SwiftUI, enable the `swiftUIActionsPredicate` option when enabling RUM. + +**Notes:** +- Datadog recommends enabling UIKit action tracking as well even for pure SwiftUI apps as many interactive components rely on UIKit internally. +- On tvOS, only press interactions on the remote are tracked. Only a UIKit predicate is needed for this. If you have a pure SwiftUI app but want to track remote presses on tvOS, you should also enable UIKit instrumentation. +- The implementation differs between iOS 18+ and iOS 17 and below: + - **iOS 18 and above:** Most interactions are reliably tracked with correct component names (for example, `SwiftUI_Button`, `SwiftUI_NavigationLink`). + - **iOS 17 and below:** The SDK cannot distinguish between interactive and non-interactive components (for example, Button vs. Label). For that reason, actions are reported as `SwiftUI_Unidentified_Element`. +- If you use both automatic and manual tracking, you may see duplicate events. This is a known limitation. To avoid this, use only one instrumentation type - either automatic or manual. +- You can use the default predicate, `DefaultSwiftUIRUMActionsPredicate`, or provide your own to filter or rename actions. You can also disable legacy detection (iOS 17 and below) if you only want reliable iOS 18+ tracking: + +{% tabs %} +{% tab label="Swift" %} + +```swift +// Use the default predicate by disabling iOS 17 and below detection +let predicate = DefaultSwiftUIRUMActionsPredicate(isLegacyDetectionEnabled: false) + +// Use your own predicate +class CustomSwiftUIActionsPredicate: SwiftUIRUMActionsPredicate { + func rumAction(for componentName: String) -> RUMAction? { + // Custom logic to filter or rename actions + return RUMAction(name: componentName) + } +} +``` + +{% /tab %} +{% tab label="Objective-C" %} + +```objective-c +// Use the default predicate by disabling iOS 17 and below detection +DDDefaultSwiftUIRUMActionsPredicate *swiftUIActionsPredicate = [[DDDefaultSwiftUIRUMActionsPredicate alloc] initWithIsLegacyDetectionEnabled:NO]; + +// Use your own predicate +@protocol DDSwiftUIRUMActionsPredicate +- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName; +@end + +@interface CustomSwiftUIActionsPredicate : NSObject +@end + +@implementation CustomSwiftUIActionsPredicate +- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName { + // Custom logic to filter or rename actions + return [[DDRUMAction alloc] initWithName:componentName attributes:@{}]; +} +@end +``` + +{% /tab %} +{% /tabs %} + +#### Action reporting by iOS version + +The table below shows how iOS 17 and iOS 18 report different user interactions. + +| **Component** | **iOS 18 reported name** | **iOS 17 reported name** | +|------------------|---------------------------------------------------|--------------------------------------| +| Button | SwiftUI_Button | SwiftUI_Unidentified_Element | +| NavigationLink | NavigationLink | SwiftUI_Unidentified_Element | +| Menu | SwiftUI_Menu (and its items as _UIContextMenuCell)| SwiftUI_Menu (and its items as _UIContextMenuCell) | +| Link | SwiftUI_Button | SwiftUI_Unidentified_Element | + +[1]: https://app.datadoghq.com/rum/application/create +[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/kotlin_multiplatform.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/kotlin_multiplatform.mdoc.md new file mode 100644 index 00000000000..af713b76ced --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/kotlin_multiplatform.mdoc.md @@ -0,0 +1,14 @@ +### Custom actions + +In addition to [tracking actions automatically][5], you can also track specific custom user actions (such as taps, clicks, and scrolls) with `RumMonitor#addAction`. For continuous action tracking (for example, tracking a user scrolling a list), use `RumMonitor#startAction` and `RumMonitor#stopAction`. + +The action type should be one of the following: "custom", "click", "tap", "scroll", "swipe", "back". + +```kotlin +fun onUserInteraction() { + GlobalRumMonitor.get().addAction(actionType, name, actionAttributes) +} +``` + +[1]: https://app.datadoghq.com/rum/application/create +[5]: /real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration/#initialization-parameters diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/react_native.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/react_native.mdoc.md new file mode 100644 index 00000000000..160d2006741 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/react_native.mdoc.md @@ -0,0 +1,17 @@ +### Manually track RUM actions + +You can manually track RUM actions: + +```javascript +DdRum.addAction(RumActionType.TAP, 'action name', {}, Date.now()); +``` + +To track a continuous action: + +```javascript +DdRum.startAction(RumActionType.TAP, 'action name', {}, Date.now()); +//... +DdRum.stopAction({}, Date.now()); +``` + +[1]: https://app.datadoghq.com/rum/application/create diff --git a/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/unity.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/unity.mdoc.md new file mode 100644 index 00000000000..60d5fdbd0a2 --- /dev/null +++ b/layouts/shortcodes/mdoc/en/sdk/track_user_interactions/unity.mdoc.md @@ -0,0 +1,20 @@ +### Track user actions + +You can track specific user actions such as taps, clicks, and scrolls using `DdRum.AddAction`. + +To manually register instantaneous RUM actions such as `RumActionType.Tap`, use `DdRum.AddAction()`. For continuous RUM actions such as `RumActionType.Scroll`, use `DdRum.StartAction()` or `DdRum.StopAction()`. + +For example: + +```csharp +void DownloadResourceTapped(string resourceName) { + DatadogSdk.Instance.Rum.AddAction( + RumActionType.Tap, + resourceName, + ); +} +``` + +When using `DdRum.StartAction` and `DdRum.StopAction`, the `type` action must be the same for the Datadog Unity SDK to match an action's start with its completion. + +[1]: https://app.datadoghq.com/rum/application/create diff --git a/layouts/shortcodes/mdoc/en/sdk/troubleshooting/browser.mdoc.md b/layouts/shortcodes/mdoc/en/sdk/troubleshooting/browser.mdoc.md index 0ffad191456..42d2ca5c142 100644 --- a/layouts/shortcodes/mdoc/en/sdk/troubleshooting/browser.mdoc.md +++ b/layouts/shortcodes/mdoc/en/sdk/troubleshooting/browser.mdoc.md @@ -51,6 +51,8 @@ If data is being sent, you should see network requests targeting `api/v2/rum` (t {% img src="real_user_monitoring/browser/troubleshooting/network_intake-1.png" alt="RUM requests to Datadog intake" /%} +After the data reaches the intake, availability in the Datadog UI depends on your retention filter configuration. If the session is retained, events typically appear in the RUM Explorer within a few seconds after the [retention decision][17] is made. Otherwise, it may take a few minutes. + ## RUM cookies The RUM Browser SDK relies on cookies to store session information and follow a [user session][7] across different pages. The cookies are first-party (they are set on your domain) and are not used for cross-site tracking. Here are the cookies set by the RUM Browser SDK: @@ -153,3 +155,4 @@ A warning appears when deobfuscation fails for a stack trace. If the stack trace [14]: https://app.datadoghq.com/source-code/setup/rum [15]: /real_user_monitoring/guide/debug-symbols [16]: /real_user_monitoring/#technical-limitations +[17]: /real_user_monitoring/rum_without_limits/retention_filters \ No newline at end of file diff --git a/layouts/shortcodes/serverless-init-troubleshooting.en.md b/layouts/shortcodes/serverless-init-troubleshooting.en.md index fd7f6fcd75c..7e73f619b4d 100644 --- a/layouts/shortcodes/serverless-init-troubleshooting.en.md +++ b/layouts/shortcodes/serverless-init-troubleshooting.en.md @@ -8,4 +8,8 @@ To have your {{ .Get "productNames" }} appear in the [software catalog][2001], y {{ if eq (.Get "sidecar") "true" }}If you are missing logs or traces during container shutdown, specify a container start up order to make your main container depend on the sidecar container. {{ end }} + +{{ if eq (.Get "in_container") "true" }} +If you are using [request-based billing](https://docs.cloud.google.com/run/docs/container-contract#cpu) for a Google Cloud Run application instrumented in-container, very short requests may lead to dropped logs during the post-request CPU throttling. You can control the speed at which logs are sent to Datadog using the [`DD_LOGS_CONFIG_BATCH_WAIT`](https://docs.datadoghq.com/agent/logs/log_transport/?tab=https#configure-the-batch-wait-time) environment variable. Set `DD_LOGS_CONFIG_BATCH_WAIT` to a value shorter than your typical request duration to avoid dropped logs. Sidecar instrumentation also prevents this issue, as the sidecar is not affected by request-based CPU throttling. +{{ end }} [2001]: /internal_developer_portal/software_catalog/ diff --git a/local/bin/py/integration-finder.py b/local/bin/py/integration-finder.py index 008eec1ea4e..d4c6f95757d 100755 --- a/local/bin/py/integration-finder.py +++ b/local/bin/py/integration-finder.py @@ -4,6 +4,7 @@ from os.path import isdir import git import argparse +import json def filter_out_dots(array): for dir in array: @@ -11,17 +12,22 @@ def filter_out_dots(array): array.remove(dir) return array +def normalize(s): + return s.strip().lower().replace('_', '-') + # Hardcode integration data integrations_repos = { - 'integrations-core': 'master', - 'integrations-extras': 'master', - 'integrations-internal-core': 'main', - 'marketplace':'master' + 'integrations-core': {'branch': 'master', 'github': True}, + 'integrations-extras': {'branch': 'master', 'github': True}, + 'integrations-internal-core': {'branch': 'main', 'github': True}, + 'marketplace': {'branch': 'master', 'github': True}, + 'publishing-platform': {'branch': 'main', 'github': False}, } # Check if the repos are present locally. If not, clone them. If so, update them def update_repos(integrations_repos): - for repo, branch in integrations_repos.items(): + for repo, cfg in integrations_repos.items(): + branch = cfg['branch'] local_repo_path = os.path.join('..', repo) if isdir(local_repo_path): try: @@ -36,9 +42,9 @@ def update_repos(integrations_repos): # Pull the latest changes from the remote repository print(f'\tPulling latest changes from {repo} on branch {branch}') local_repo.remotes.origin.pull(branch) - except: + except: print(f'\n\x1b[33mWARNING\x1b[0m:Failed to update {repo}' + - '\nContinuing without updating the repo. ' + + '\nContinuing without updating the repo. ' + f'To resolve, check {repo} for a dirty feature branch and commit, ' + 'stash, or reset any changes and try again.\n') else: @@ -48,29 +54,46 @@ def update_repos(integrations_repos): # Find the given integration in the integrations repos def find_integration(integrations_repos, integration_name): found = [] - for repo,branch in integrations_repos.items(): - integration_list = [] + target = normalize(integration_name) + for repo, cfg in integrations_repos.items(): + branch = cfg['branch'] + is_github = cfg['github'] location = os.path.join('..', repo) - url = f'https://github.com/DataDog/{repo}/blob/{branch}/{integration_name}/README.md' - integration_list = [f.name for f in os.scandir(location) if f.is_dir()] - integration_list = filter_out_dots(integration_list) - if integration_name in integration_list: - readme_path = os.path.join(location, integration_name, 'README.md') - if os.path.exists(readme_path): - found.append(f'{location}/{integration_name}/README.md\n- {url}') + if not os.path.isdir(location): + continue + dirs = [f.name for f in os.scandir(location) if f.is_dir()] + dirs = filter_out_dots(dirs) + for dir_name in dirs: + manifest_path = os.path.join(location, dir_name, 'manifest.json') + if not os.path.exists(manifest_path): + continue + try: + with open(manifest_path) as fp: + manifest = json.load(fp) + except Exception: + continue + app_id = manifest.get('app_id', '') + if not app_id or normalize(app_id) != target: + continue + readme_path = os.path.join(location, dir_name, 'README.md') + if is_github: + url = f'https://github.com/DataDog/{repo}/blob/{branch}/{dir_name}/README.md' + found.append(f'{readme_path}\n- {url}') + else: + found.append(f'{readme_path}\n- {integration_name} is published through the publishing platform') + break # short-circuit within this repo; continue to other repos if len(found) == 0: print(f'\nIntegration "{integration_name}" not found. Check the spelling and try again.') elif len(found) == 1: print(f'\nYou can find {integration_name} here:\n- {"".join(found)}') else: - print('\nMore than one integration with that name was found. Check the following:') for entry in found: print(f'{entry}\n') parser = argparse.ArgumentParser(description="Find an integration") -parser.add_argument('integration', help="The name of the integration to search for", type=str) +parser.add_argument('integration', help="The app-id of the integration to search for (for example, rapdev-box)", type=str) args = parser.parse_args() -integrations = update_repos(integrations_repos) +update_repos(integrations_repos) find_integration(integrations_repos, args.integration) diff --git a/static/images/incident_response/status_pages/delete_degradation_update.png b/static/images/incident_response/status_pages/delete_degradation_update.png new file mode 100644 index 00000000000..94a527691ba Binary files /dev/null and b/static/images/incident_response/status_pages/delete_degradation_update.png differ diff --git a/static/images/incident_response/status_pages/edit_degradation_update.png b/static/images/incident_response/status_pages/edit_degradation_update.png new file mode 100644 index 00000000000..d6b70366f7b Binary files /dev/null and b/static/images/incident_response/status_pages/edit_degradation_update.png differ