Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
654 changes: 645 additions & 9 deletions apps/docs/content/docs/en/integrations/dynatrace.mdx

Large diffs are not rendered by default.

937 changes: 924 additions & 13 deletions apps/sim/blocks/blocks/dynatrace.ts

Large diffs are not rendered by default.

108 changes: 104 additions & 4 deletions apps/sim/lib/integrations/integrations.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"updatedAt": "2026-08-07",
"updatedAt": "2026-08-08",
"integrations": [
{
"type": "onepassword",
Expand Down Expand Up @@ -5431,8 +5431,8 @@
"type": "dynatrace",
"slug": "dynatrace",
"name": "Dynatrace",
"description": "Query Dynatrace problems, metrics, entities, logs, SLOs, and vulnerabilities",
"longDescription": "Integrate Dynatrace into workflows. Investigate and close Davis problems, query metrics and monitored entities, search and ingest logs, push deployment events, track SLO burn rates, review Application Security vulnerabilities, and read the audit log.",
"description": "Manage Dynatrace problems, metrics, entities, logs, SLOs, settings, and security",
"longDescription": "Integrate Dynatrace into workflows. Investigate and close Davis problems, query metrics and monitored entities, search and ingest logs, push deployment events, manage SLOs and their burn rates, triage and mute Application Security vulnerabilities, review runtime attacks, tag entities, manage settings objects such as maintenance windows and alerting profiles, run synthetic monitors on demand, and read the audit log.",
"bgColor": "#FFFFFF",
"iconName": "DynatraceIcon",
"docsUrl": "https://docs.sim.ai/integrations/dynatrace",
Expand Down Expand Up @@ -5521,12 +5521,112 @@
"name": "Get Security Problem",
"description": "Get a single vulnerability with its description, remediation guidance, affected entities, and risk assessment."
},
{
"name": "Mute Security Problem",
"description": "Mute a single Dynatrace vulnerability with a reason, for triaging false positives or accepted risk."
},
{
"name": "Unmute Security Problem",
"description": "Unmute a single Dynatrace vulnerability, returning it to the active triage queue."
},
{
"name": "Mute Security Problems (Bulk)",
"description": "Mute several Dynatrace vulnerabilities at once with a shared reason, for bulk triage."
},
{
"name": "Unmute Security Problems (Bulk)",
"description": "Unmute several Dynatrace vulnerabilities at once, returning them to active triage."
},
{
"name": "List Remediation Items",
"description": "List the remediation items of a third-party vulnerability — the components to upgrade, their affected entities, and their mute state."
},
{
"name": "List Attacks",
"description": "List runtime attacks Dynatrace Application Protection detected — injection attempts, their source, and whether they were blocked."
},
{
"name": "Get Attack",
"description": "Get a single attack with its entry point, payload, attacker, and the vulnerability it exploited."
},
{
"name": "List Tags",
"description": "List the custom tags applied to the monitored entities an entity selector matches."
},
{
"name": "Add Tags",
"description": "Add custom tags to every monitored entity an entity selector matches. Tags drive selectors, management zones, and alerting."
},
{
"name": "Delete Tag",
"description": "Remove a custom tag from every monitored entity an entity selector matches. Deletes one key-value pair, or every tag with the key."
},
{
"name": "List Settings Schemas",
"description": "List the settings schemas available in the environment. Use it to find the schema ID for a configuration type such as builtin:alerting.profile."
},
{
"name": "List Settings Objects",
"description": "List settings objects — the configuration behind maintenance windows, alerting profiles, management zones, and anomaly detection."
},
{
"name": "Get Settings Object",
"description": "Get a single settings object with its value and its update token. Read it before updating so the token can guard against a concurrent change."
},
{
"name": "Create Settings Object",
"description": "Create a settings object — a maintenance window, alerting profile, management zone, or any other schema-backed configuration."
},
{
"name": "Update Settings Object",
"description": "Update an existing settings object. Pass the update token from Get Settings Object to fail rather than overwrite a concurrent change."
},
{
"name": "Delete Settings Object",
"description": "Delete a settings object. Dynatrace cannot undo this."
},
{
"name": "List Synthetic Monitors",
"description": "List synthetic monitors and their IDs. Use it to find the monitor IDs to feed into an on-demand execution."
},
{
"name": "Execute Synthetic Monitors",
"description": "Trigger an on-demand batch execution of synthetic monitors, for gating a deploy on a smoke test. Returns a batch ID to poll."
},
{
"name": "Get Synthetic Batch",
"description": "Get the status and failures of an on-demand synthetic batch execution. Poll it after triggering to gate a deploy on the result."
},
{
"name": "Get Problem Comment",
"description": "Get a single comment on a Dynatrace problem."
},
{
"name": "Update Problem Comment",
"description": "Replace the text of an existing comment on a Dynatrace problem."
},
{
"name": "Delete Problem Comment",
"description": "Delete a comment from a Dynatrace problem."
},
{
"name": "Create SLO",
"description": "Create a service-level objective from a metric expression, target, and evaluation timeframe."
},
{
"name": "Update SLO",
"description": "Update an existing service-level objective. Every field is replaced, so send the complete definition."
},
{
"name": "Delete SLO",
"description": "Delete a service-level objective."
},
{
"name": "Get Audit Logs",
"description": "Read the Dynatrace audit log — who changed which configuration, when, and whether it succeeded."
}
],
"operationCount": 22,
"operationCount": 47,
"triggers": [],
"triggerCount": 0,
"authType": "api-key",
Expand Down
105 changes: 105 additions & 0 deletions apps/sim/tools/dynatrace/add_tags.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import { tagProperties } from '@/tools/dynatrace/outputs'
import type { DynatraceAddTagsParams, DynatraceAddTagsResponse } from '@/tools/dynatrace/types'
import {
buildDynatraceUrl,
dynatraceHeaders,
mapTags,
parseJsonParam,
readJsonBody,
} from '@/tools/dynatrace/utils'
import { ErrorExtractorId } from '@/tools/error-extractors'
import type { ToolConfig } from '@/tools/types'

export const addTagsTool: ToolConfig<DynatraceAddTagsParams, DynatraceAddTagsResponse> = {
id: 'dynatrace_add_tags',
name: 'Dynatrace Add Tags',
description:
'Add custom tags to every monitored entity an entity selector matches. Tags drive selectors, management zones, and alerting.',
version: '1.0.0',
errorExtractor: ErrorExtractorId.DYNATRACE_ERRORS,

params: {
environmentUrl: {
type: 'string',
required: true,
visibility: 'user-only',
description:
'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)',
},
apiToken: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'Dynatrace access token (dt0c01...) with the entities.write scope',
},
entitySelector: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Entity selector for the entities to tag, e.g. type("HOST"),tag("env:staging")',
},
tags: {
type: 'json',
required: true,
visibility: 'user-or-llm',
description:
'Tags to add, as an array of objects with a key and an optional value (e.g. [{"key":"owner","value":"platform"},{"key":"reviewed"}])',
},
from: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description:
'Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression. Defaults to now-24h',
},
to: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'End of the timeframe in the same formats as From. Defaults to now',
},
},

request: {
url: (params) =>
buildDynatraceUrl(params.environmentUrl, '/tags', {
entitySelector: params.entitySelector,
from: params.from,
to: params.to,
}),
method: 'POST',
headers: (params) => dynatraceHeaders(params.apiToken),
body: (params) => {
const tags = parseJsonParam(params.tags)
if (!Array.isArray(tags) || tags.length === 0) {
throw new Error('tags must be a non-empty array of objects with a key')
}
return { tags }
},
},

transformResponse: async (response: Response) => {
const data = await readJsonBody(response)

return {
success: true,
output: {
appliedTags: mapTags(data.appliedTags),
matchedEntitiesCount: (data.matchedEntitiesCount as number) ?? null,
},
}
},

outputs: {
appliedTags: {
type: 'array',
description: 'Tags that were applied',
items: { type: 'object', properties: tagProperties },
},
matchedEntitiesCount: {
type: 'number',
description: 'How many entities the selector matched and were tagged',
nullable: true,
},
},
}
Loading
Loading