Provider Bug Review
mondoohq/mql
Deep static code review of an mql provider for logic errors, nil-handling bugs, pagination truncation, caching/id collisions, and other defects that silently give users wrong data.
Kubernetes cluster, pod, node, and workload monitoring. An agent skill from Dynatrace/dynatrace-for-ai.
$ npx skills add Dynatrace/dynatrace-for-ai --skill dt-obs-kubernetes -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Dynatrace/dynatrace-for-ai dt-obs-kubernetes --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Dynatrace/dynatrace-for-ai.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/dt-obs-kubernetes .claude/skills/dt-obs-kubernetes && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "dt-obs-kubernetes" agent skill from https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-obs-kubernetes into .claude/skills/dt-obs-kubernetes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dt-obs-kubernetes", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-obs-kubernetesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Dynatrace/dynatrace-for-ai --skill dt-obs-kubernetes -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Dynatrace/dynatrace-for-ai dt-obs-kubernetes --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Dynatrace/dynatrace-for-ai.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/dt-obs-kubernetes .agents/skills/dt-obs-kubernetes && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "dt-obs-kubernetes" agent skill from https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-obs-kubernetes into .agents/skills/dt-obs-kubernetes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dt-obs-kubernetes", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Dynatrace/dynatrace-for-ai --skill dt-obs-kubernetes -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Dynatrace/dynatrace-for-ai dt-obs-kubernetes --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Dynatrace/dynatrace-for-ai.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/dt-obs-kubernetes .cursor/skills/dt-obs-kubernetes && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "dt-obs-kubernetes" agent skill from https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-obs-kubernetes into .cursor/skills/dt-obs-kubernetes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dt-obs-kubernetes", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Dynatrace/dynatrace-for-ai.git --path skills/dt-obs-kubernetes--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Dynatrace/dynatrace-for-ai --skill dt-obs-kubernetes -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Dynatrace/dynatrace-for-ai dt-obs-kubernetes --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Dynatrace/dynatrace-for-ai.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/dt-obs-kubernetes .gemini/skills/dt-obs-kubernetes && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "dt-obs-kubernetes" agent skill from https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-obs-kubernetes into .gemini/skills/dt-obs-kubernetes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dt-obs-kubernetes", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Dynatrace/dynatrace-for-ai dt-obs-kubernetesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Dynatrace/dynatrace-for-ai --skill dt-obs-kubernetes -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Dynatrace/dynatrace-for-ai.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/dt-obs-kubernetes .github/skills/dt-obs-kubernetes && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "dt-obs-kubernetes" agent skill from https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-obs-kubernetes into .github/skills/dt-obs-kubernetes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dt-obs-kubernetes", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Dynatrace/dynatrace-for-ai --skill dt-obs-kubernetes -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Dynatrace/dynatrace-for-ai dt-obs-kubernetes --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Dynatrace/dynatrace-for-ai.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/dt-obs-kubernetes .opencode/skills/dt-obs-kubernetes && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "dt-obs-kubernetes" agent skill from https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-obs-kubernetes into .opencode/skills/dt-obs-kubernetes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dt-obs-kubernetes", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
dt-obs-kubernetesKubernetes cluster, pod, node, and workload monitoring. An agent skill from Dynatrace/dynatrace-for-ai.
Dt Obs Kubernetes is an agent skill from Dynatrace/dynatrace-for-ai. Kubernetes cluster, pod, node, and workload monitoring. Use when analyzing K8s health, resource optimization, pod failures, OOMKills, scheduling, or security posture. Also use for Kubernetes operational events like pod restarts, OOM events, evictions, and cluster event history. Trigger: "Kubernetes pods", "K8s cluster health", "OOMKill", "pod restarts", "container CPU", "namespace resource usage", "over-provisioned pods", "privileged containers", "pod placement", "K8s node capacity", "running containers by…
Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 9 other files, including reference files (for example `references/cluster-inventory.md`, `references/ingress.md` and `references/labels-annotations.md`).
It sits in DevOps & Cloud, covering Container orchestration. It works with Kubernetes and Amazon Web Services. The repository describes itself as: Skills, prompts, and instructions for building AI agents on top of Dynatrace production context. The licence is Apache-2.0.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4f9aa71. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are dql and dql-template).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
K8S_SECRETFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Dt Obs Kubernetes loads about 5.4k tokens when it runs, and up to ~21k if it reads all its reference files. Until then it costs about 223 tokens; SKILL.md has 1,744 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Dynatrace/dynatrace-for-ai at commit 4f9aa71, republished under its Apache-2.0 licence (© Dynatrace). 1,744 words, ~5,379 tokens.
.claude/skills/dt-obs-kubernetes/SKILL.md (or your agent's skills folder). This skill also uses 8 other files; get the full folder from GitHub.Monitor and analyze Kubernetes infrastructure using Dynatrace DQL. Query cluster resources, monitor workload health, analyze pod placement, optimize costs, and assess security posture.
references/cluster-inventory.md - Clusters,
namespaces, resource distributionreferences/labels-annotations.md - Parse
k8s.object, labels, annotationsreferences/pod-node-placement.md - Node
selectors, affinity, taints, HAWorkloads: K8S_DEPLOYMENT, K8S_STATEFULSET, K8S_DAEMONSET,
K8S_JOB, K8S_CRONJOB, K8S_HORIZONTALPODAUTOSCALER
Infrastructure: K8S_CLUSTER, K8S_NAMESPACE, K8S_NODE, K8S_POD
Configuration: K8S_SERVICE, K8S_CONFIGMAP, K8S_SECRET,
K8S_PERSISTENTVOLUMECLAIM, K8S_PERSISTENTVOLUME, K8S_INGRESS,
K8S_NETWORKPOLICY
Note: HPA, Job, CronJob, and configuration entity types are listed for inventory queries only. For HPA scaling analysis see
references/workload-health.md; for PVC/PV seereferences/pv-pvc.md; for Ingress/NetworkPolicy see the corresponding reference files.
smartscapeNodes - Query K8s entities (current state, no time range needed):
smartscapeNodes K8S_POD
| filter k8s.namespace.name == "production"
| fields k8s.cluster.name, k8s.pod.nametimeseries - Monitor metrics over time (always specify a from: range):
timeseries cpu = sum(dt.kubernetes.container.cpu_usage),
by: {k8s.pod.name, k8s.namespace.name},
from: now()-1h
| fieldsAdd avg_cpu = arrayAvg(cpu)
timeseriesreturns each metric as a time-bucket array. To collapse it to a scalar in a downstreamfieldsAdd, usearrayAvg(series)orarraySum(series)— callingavg()orsum()on a series field outside thetimeseries {}block is not supported.
fetch logs - Analyze log events:
fetch logs
| filter k8s.namespace.name == "production" and loglevel == "ERROR"k8s.cluster.name, k8s.namespace.name, k8s.pod.name, k8s.node.namek8s.workload.name, k8s.workload.kind, k8s.container.namek8s.object - Full JSON configuration for deep inspectiontags[label] - Access labels and annotationsk8s.workload.kind values (always lowercase in DT — not Pascal-case as in the K8s API):
"deployment", "statefulset", "daemonset", "replicaset", "job", "cronjob"
k8s.object availability:
| Entity type | k8s.object available? |
|---|---|
K8S_POD | Yes |
K8S_NAMESPACE | Yes |
K8S_NODE | Yes |
Workload types (K8S_DEPLOYMENT, etc.) | Yes |
K8S_CLUSTER | No |
CPU: dt.kubernetes.container.cpu_usage, cpu_throttled, limits_cpu,
requests_cpu
Memory: dt.kubernetes.container.memory_working_set, limits_memory,
requests_memory
Operations: dt.kubernetes.container.restarts, oom_kills
Node: dt.kubernetes.node.pods_allocatable, cpu_allocatable,
memory_allocatable, dt.kubernetes.pods
Aggregation rule for requests/limits: Always use
sum()— neveravg()— when aggregatingrequests_cpu,limits_cpu,requests_memory, orlimits_memory.avg()returns a per-container average and silently undercounts multi-container pods and multi-replica workloads. For DaemonSets (one pod per node), this error is proportional to cluster size.
K8S_POD vs CONTAINER: these are different entity types in Dynatrace.
K8S_POD — K8s-native entities with k8s.object JSON, scheduling state, conditions, and K8s metrics. Use this skill.CONTAINER — Host-level container inventory (image, lifetime, host assignment). Use dt-obs-hosts skill instead.The smartscape edge is CONTAINER --(is_part_of)--> K8S_POD. To reach containers from a pod, traverse backward:
smartscapeNodes K8S_POD
| filter k8s.namespace.name == "<namespace>"
| traverse edgeTypes: {is_part_of}, targetTypes: {CONTAINER}, direction: backward, fieldsKeep: {id}
| fields k8s.cluster.name, k8s.namespace.name, k8s.pod.name, container.id=idNo direct smartscape edge exists between SERVICE and K8S_POD. The correlation key is the shared dimension k8s.workload.name. See Service → Pod Drill-Down in references/pod-debugging.md for the full two-step pattern.
List all clusters:
smartscapeNodes K8S_CLUSTER
| fields k8s.cluster.name, k8s.cluster.version, k8s.cluster.distributionCheck node capacity:
timeseries {
current_pods = avg(dt.kubernetes.pods),
max_pods = avg(dt.kubernetes.node.pods_allocatable)
}, by: {k8s.node.name, k8s.cluster.name},
from: now()-1h
| fieldsAdd pod_capacity_pct = (arrayAvg(current_pods) / arrayAvg(max_pods)) * 100
| filter pod_capacity_pct > 80Identify pods in non-Running state:
smartscapeNodes K8S_POD
| parse k8s.object, "JSON:config"
| fieldsAdd phase = config[status][phase]
| filter not(in(phase, {"Running", "Succeeded"}))
| fields k8s.cluster.name, k8s.namespace.name, k8s.pod.name, phase
Succeededis a healthy terminal phase for completed Job pods — excluding it avoids false positives. Adjust if you specifically want to audit completed Jobs.
Pod-level — find over-provisioned pods (usage < 30%):
timeseries {
cpu_usage = sum(dt.kubernetes.container.cpu_usage),
cpu_requests = sum(dt.kubernetes.container.requests_cpu)
}, by: {k8s.pod.name, k8s.namespace.name, k8s.cluster.name},
from: now()-7d
| fieldsAdd usage_pct = (arrayAvg(cpu_usage) / arrayAvg(cpu_requests)) * 100
| filter usage_pct < 30 and arrayAvg(cpu_requests) > 0Workload-level — aggregate across all replicas (required for correct DaemonSet accounting):
timeseries {
cpu_usage = sum(dt.kubernetes.container.cpu_usage),
cpu_requests = sum(dt.kubernetes.container.requests_cpu)
}, by: {k8s.workload.name, k8s.workload.kind, k8s.namespace.name, k8s.cluster.name},
from: now()-7d
| fieldsAdd
avg_usage = arrayAvg(cpu_usage),
avg_requests = arrayAvg(cpu_requests)
| fieldsAdd usage_pct = (avg_usage / avg_requests) * 100
| filter usage_pct < 30 and avg_requests > 0
| sort usage_pct ascUse
sum()for bothcpu_usageandcpu_requestsat every aggregation level. A DaemonSet running on 50 nodes has 50× the per-pod request total;avg()would report 1/50th of the true reserved capacity.
Identify containers without limits:
smartscapeNodes K8S_POD
| parse k8s.object, "JSON:config"
| expand container = config[spec][containers]
| fieldsAdd
container_name = container[name],
cpu_limit = container[resources][limits][cpu],
memory_limit = container[resources][limits][memory]
| filter isNull(cpu_limit) or isNull(memory_limit)Pod troubleshooting benefits from combining metrics (timeseries) with Kubernetes events (event stream) for a complete picture.
Find pods with OOMKills:
timeseries oom_kills = sum(dt.kubernetes.container.oom_kills),
by: {k8s.pod.name, k8s.namespace.name, k8s.cluster.name},
from: now()-1h
| filter arraySum(oom_kills) > 0
| fieldsAdd total_oom_kills = arraySum(oom_kills)
| sort total_oom_kills descAnalyze pod restart patterns:
timeseries restarts = sum(dt.kubernetes.container.restarts),
by: {k8s.pod.name, k8s.namespace.name, k8s.cluster.name},
from: now()-1h
| fieldsAdd total_restarts = arraySum(restarts)
| filter total_restarts > 5For operational events (pod restarts, OOM kills, evictions, scheduling failures), Kubernetes events provide richer context than metrics alone — including event reasons, messages, and timestamps.
When to use Kubernetes events over metrics:
Kubernetes events are available through the get-events-for-kubernetes-cluster
tool (a Dynatrace MCP tool). Call it with findAllK8Events: true to get events
for all clusters, or findAllK8Events: false with either clusterId
(k8s.cluster.uid) or kubernetesEntityId (dt.entity.kubernetes_cluster) to
scope to one cluster. Use history to set the lookback window (e.g. "1h",
"24h", "7d"; max "60d").
Prefer this tool when the user asks about OOM events, pod restarts,
evictions, or cluster-wide event history. Fall back to the fetch events DQL
pattern below if the tool is unavailable.
Important: distinguish event types when filtering results. Kubernetes events cover many categories. When the user asks about a specific event type, filter the results accordingly — do not report unrelated events:
| User Asks About | Relevant Event Reasons | NOT Related |
|---|---|---|
| Pod restarts | BackOff, CrashLoopBackOff, Killing | Readiness probe failures, CPU throttling |
| OOM events | OOMKilling, OOMKilled | Memory pressure warnings |
| Evictions | Evicted, Preempting | Node pressure |
| Scheduling failures | FailedScheduling, Unschedulable | Resource quotas |
For a complete answer, combine both approaches:
Pod restart and operational events can also be queried via DQL from the events table:
fetch events
| filter event.kind == "K8S_EVENT"
| filter event.type == "Warning"
| fields timestamp, k8s.cluster.name, k8s.namespace.name, k8s.pod.name,
event.reason, event.message
| sort timestamp desc
| limit 50Filter for specific event reasons:
fetch events
| filter event.kind == "K8S_EVENT"
| filter in(event.reason, {"OOMKilling", "BackOff", "Evicted", "FailedScheduling"})
| fields timestamp, k8s.cluster.name, k8s.namespace.name, k8s.pod.name,
event.reason, event.message
| sort timestamp descField names in fetch events: Use event.reason and event.message — not
dt.kubernetes.event.reason. The dt.kubernetes.* prefix is for timeseries metrics,
not the events table. Queries using the wrong prefix return zero results.
Identify privileged containers:
smartscapeNodes K8S_POD
| parse k8s.object, "JSON:config"
| expand container = config[spec][containers]
| fieldsAdd
container_name = container[name],
privileged = container[securityContext][privileged]
| filter privileged == trueFind containers running as root:
smartscapeNodes K8S_POD
| parse k8s.object, "JSON:config"
| expand container = config[spec][containers]
| fieldsAdd
container_name = container[name],
run_as_user = container[securityContext][runAsUser],
run_as_non_root = container[securityContext][runAsNonRoot]
| filter (isNull(run_as_user) or run_as_user == 0) and run_as_non_root != trueVerify pod distribution (HA compliance) for Deployments and StatefulSets:
smartscapeNodes K8S_POD
| filter in(k8s.workload.kind, {"deployment", "statefulset"})
| summarize pod_count = count(),
node_count = countDistinct(k8s.node.name),
by: {k8s.cluster.name, k8s.namespace.name, k8s.workload.name, k8s.workload.kind}
| fieldsAdd ha_compliant = node_count > 1
| filter pod_count >= 2 and not ha_compliantDaemonSets are intentionally excluded — each pod runs on exactly one node by design, so single-node placement is not an HA violation for them.
Find active DAVIS problems affecting K8s entities:
fetch dt.davis.problems, from:now() - 2h
| filter not(dt.davis.is_duplicate) and event.status == "ACTIVE"
| filter iAny(startsWith(smartscape.affected_entities[][type], "K8S_"))
| fields display_id, event.name, event.category, affected_entity_ids = smartscape.affected_entities[][id]smartscape.affected_entities is a record array; each record has id, type, and name. Use
[][id] to get the array of Smartscape IDs to look up the affected entity, or
[id] after expand smartscape.affected_entities. Without a preceding expand, [id] returns
null silently. A filter cannot take a bare iterative expression, so wrap it in iAny(...).
| User Question | Best Approach | Why |
|---|---|---|
| "Show me OOM events" | Events tool + metrics | Events give reasons/messages; metrics show trends |
| "Show me pod restart events" | Events tool + timeseries metrics | Events reveal the reason (BackOff, Killing, CrashLoopBackOff); dt.kubernetes.container.restarts metric gives the actual restart counts |
| "How many pod restarts?" | Timeseries metrics | Quantitative data over time |
| "What happened to my pods in the last 48h?" | Events tool | Operational event history with context |
| "Which pods are using the most CPU?" | Timeseries metrics | Resource utilization analysis |
| "List all clusters/namespaces" | smartscapeNodes | Entity discovery and inventory |
| "Are there scheduling failures?" | Events tool | Event reasons explain why |
| "Which workloads are over-provisioned?" | Timeseries metrics, workload-level | Must use sum() for requests; group by k8s.workload.name |
smartscapeNodes — no time range; always returns current entity state.timeseries — always add from: now()-<window>. Default window is
system-determined and often too short for trend analysis. Recommended defaults:
now()-1h for recent spikes, now()-24h for daily patterns, now()-7d for
weekly trends.fetch events — adding from: is recommended for reproducible results;
without it the system default window applies.fetch dt.davis.problems — use from: now()-2h for active problems; extend
to now()-7d to include recently closed problems.limit for explorationk8s.object unless needed - Parsing it increases query cost significantly| Problem | Cause | Solution |
|---|---|---|
| No pod data returned | Wrong entity type or missing cluster filter | Use K8S_POD (not POD); add k8s.cluster.name filter |
k8s.object parsing errors | Complex JSON structure | Use parse k8s.object, "JSON:config" then access nested fields |
| Pod network metrics unavailable | Not available in Grail | Use service mesh metrics or host-level network metrics |
| Large result sets | No time range or cluster filter | Add time range and filter by cluster/namespace early |
| Missing labels in output | Labels accessed incorrectly | Use tags[label_name] to access labels |
k8s.workload.kind filter returns no results | Value is Pascal-case (e.g. "Deployment") | Values are lowercase in DT: "deployment", "statefulset", "daemonset" |
Unavailable Metrics:
Query Considerations:
k8s.object field if not necessary→ references/cluster-inventory.md
k8s.object for detailed configuration inspection→ references/labels-annotations.md
→ references/pod-node-placement.md
→ references/workload-health.md
→ references/network-policies.md
dt.smartscape_source.id with K8S_ prefix filters)© Dynatrace, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 8 other files (references) in skills/dt-obs-kubernetes of Dynatrace/dynatrace-for-ai.
Open the folder on GitHubat commit 4f9aa71
Dt Obs Kubernetes next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Dt Obs Kubernetes this skillDynatrace/dynatrace-for-ai | 163 | — | ~5.4k | Automated safety check: Pass | Apache-2.0 | |
| Provider Bug Reviewmondoohq/mql | 412 | — | ~2.9k | Automated safety check: Pass | Custom licence | |
| Kcli Cluster Deploymentkarmab/kcli | 653 | — | ~1.5k | Automated safety check: Pass | Apache-2.0 | |
| Hashicorp VaultBagelHole/DevOps-Security-Agent-Skills | 1.2k | — | ~2k | Automated safety check: Pass | MIT | |
| Logfire Infrastructurepydantic/skills | 140 | — | ~1.8k | Automated safety check: Pass | MIT | |
| Eks Best Practicesaws-samples/appmod-blueprints | 115 | — | ~5k | Automated safety check: Pass | MIT-0 |
mondoohq/mql
Deep static code review of an mql provider for logic errors, nil-handling bugs, pagination truncation, caching/id collisions, and other defects that silently give users wrong data.
karmab/kcli
Guides deployment and management of Kubernetes clusters with kcli.
BagelHole/DevOps-Security-Agent-Skills
Manage secrets and PKI with HashiCorp Vault. An agent skill from BagelHole/DevOps-Security-Agent-Skills.
pydantic/skills
Monitor hosts, Docker containers, Kubernetes clusters, database/queue/cache servers, and cloud-provider metrics with Pydantic Logfire — no application code required.
aws-samples/appmod-blueprints
Advisory guidance for Amazon EKS architecture and configuration decisions — compute strategy, networking, security, reliability, cost, autoscaling, observability, multi-tenancy, and upgrade planning.
runwhen-contrib/runwhen-local
Add or enrich a resource type in an existing RunWhen Local discovery indexer (Azure azureapi, GCP gcpapi, AWS, or Kubernetes).
Dynatrace/dynatrace-for-ai
Analyze dashboards and notebooks using Davis analyzers — anomaly detection, novelty scoring, and correlation.
Dynatrace/dynatrace-for-ai
Set up the Dynatrace iOS SDK (OneAgent) in an iOS project using Swift Package Manager.
Dynatrace/dynatrace-for-ai
End-to-end Dynatrace alerting lifecycle — anomaly detector setup and model selection (static threshold, adaptive baseline, seasonal baseline), alert event storage in Grail, problem grouping and…
Dynatrace/dynatrace-for-ai
AWS cloud resource monitoring including EC2, RDS, Lambda, ECS/EKS, VPC networking, load balancers, S3, DynamoDB, SQS/SNS, and cost optimization.
Dynatrace/dynatrace-for-ai
3rd-party test and monitor result ingestion into Dynatrace Grail via the platform events ingest API (platform/ingest/custom/events/).
Dynatrace/dynatrace-for-ai
DAVIS problem analysis including root cause identification, impact assessment, and correlation with other telemetry.
Works with
Categories
Kubernetes cluster, pod, node, and workload monitoring. An agent skill from Dynatrace/dynatrace-for-ai. Dt Obs Kubernetes is an agent skill from Dynatrace/dynatrace-for-ai. Kubernetes cluster, pod, node, and workload monitoring.
Dt Obs Kubernetes fits situations like: analyzing K8s health; resource optimization; security posture; Kubernetes operational events like pod restarts.
Run `npx skills add Dynatrace/dynatrace-for-ai --skill dt-obs-kubernetes -a claude-code`. Or copy the skill folder (skills/dt-obs-kubernetes in Dynatrace/dynatrace-for-ai) into .claude/skills/dt-obs-kubernetes in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Dynatrace/dynatrace-for-ai --skill dt-obs-kubernetes -a codex`. Or copy the skill folder (skills/dt-obs-kubernetes in Dynatrace/dynatrace-for-ai) into .agents/skills/dt-obs-kubernetes in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Dynatrace/dynatrace-for-ai --skill dt-obs-kubernetes -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dt-obs-kubernetes, .gemini/skills/dt-obs-kubernetes, .github/skills/dt-obs-kubernetes and .opencode/skills/dt-obs-kubernetes in your project.
Going by SKILL.md and its folder, Dt Obs Kubernetes needs credentials named K8S_SECRET. Our summary lists: A credential in K8S_SECRET.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Dt Obs Kubernetes is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.4k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 15k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Dt Obs Kubernetes: Provider Bug Review (mondoohq/mql, 412 stars), Kcli Cluster Deployment (karmab/kcli, 653 stars), Hashicorp Vault (BagelHole/DevOps-Security-Agent-Skills, 1.2k stars) and Logfire Infrastructure (pydantic/skills, 140 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Dynatrace (a GitHub organization) maintains it in Dynatrace/dynatrace-for-ai, which has 163 GitHub stars. The repository holds 33 skills in this directory. The repository was last updated on October 1, 2026.
Source: Dynatrace/dynatrace-for-ai on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.