{"id":"f5881394-6ede-45f7-b8ec-7152ecd6e087","shortId":"PdpKTS","kind":"skill","title":"dt-obs-frontends","tagline":"Real User Monitoring (RUM), Web Vitals, user sessions, mobile crashes, page performance, user interactions, and frontend errors. Query web and mobile frontend telemetry.","description":"# Frontend Observability Skill\n\nMonitor web and mobile frontends using Real User Monitoring (RUM) with DQL queries.\nThis skill targets the new RUM experience only; do not use classic RUM data.\n\n## Overview\n\nThis skill helps you:\n- Monitor Core Web Vitals and frontend performance\n- Track user sessions, engagement, and behavior\n- Analyze errors and correlate with backend traces\n- Optimize mobile app startup and stability\n- Diagnose performance issues with detailed timing analysis\n\n**Data Sources:**\n- **Metrics**: `timeseries` with `dt.frontend.*` (trends, alerting)\n- **Events**: `fetch user.events` (individual page views, requests, clicks, errors)\n- **Sessions**: `fetch user.sessions` (session-level aggregates: duration, bounce, counts)\n\n\n## Quick Reference\n\n### Common Metrics\n- `dt.frontend.user_action.count` - User action volume\n- `dt.frontend.user_action.duration` - User action duration\n- `dt.frontend.request.count` - Request volume\n- `dt.frontend.request.duration` - Request latency (ms)\n- `dt.frontend.error.count` - Error counts\n- `dt.frontend.session.active.estimated_count` - Active sessions\n- `dt.frontend.user.active.estimated_count` - Unique users\n- `dt.frontend.web.page.cumulative_layout_shift` - CLS metric\n- `dt.frontend.web.navigation.dom_interactive` - DOM interactive time\n- `dt.frontend.web.page.first_input_delay` - FID metric (legacy; prefer INP)\n- `dt.frontend.web.page.largest_contentful_paint` - LCP metric\n- `dt.frontend.web.page.interaction_to_next_paint` - INP metric\n- `dt.frontend.web.navigation.load_event_end` - Load event end\n- `dt.frontend.web.navigation.time_to_first_byte` - Time to first byte\n\n### Common Filters\n- `frontend.name` - Filter by frontend name (e.g. `my-frontend`)\n- `dt.rum.user_type` - Exclude synthetic monitoring\n- `geo.country.iso_code` - Geographic filtering\n- `device.type` - Mobile, desktop, tablet\n- `browser.name` - Browser filtering\n\n### Common Timeseries Dimensions\nUse these for `dt.frontend.*` timeseries splits and breakdowns:\n- `frontend.name` - Frontend name\n- `geo.country.iso_code`\n- `device.type`\n- `browser.name`\n- `os.name`\n- `user_type` - `real_user`, `synthetic`, `robot`\n\n```dql\nfetch user.events, from: now() - 2h\n| filter characteristics.has_page_summary == true\n| summarize page_views = count(), by: {frontend.name}\n| sort page_views desc\n```\n\n### Event Characteristics\n- `characteristics.has_page_summary` - Page views (web)\n- `characteristics.has_view_summary` - Views (mobile)\n- `characteristics.has_navigation` - Navigation events\n- `characteristics.has_user_interaction` - Clicks, forms, etc.\n- `characteristics.has_request` - Network request events\n- `characteristics.has_error` - Error events\n- `characteristics.has_crash` - Mobile crashes\n- `characteristics.has_long_task` - Long JavaScript tasks\n- `characteristics.has_csp_violation` - CSP violations\n\nFull event model: https://docs.dynatrace.com/docs/semantic-dictionary/model/rum/user-events\n\n### Session Data (`user.sessions`)\n\n`user.sessions` contains session-level aggregates produced by the session aggregation service from `user.events`. **Field names differ from `user.events`** — sessions use underscores where events use dots.\n\n**Session identity and context:**\n- `dt.rum.session.id` — Session ID (NOT `dt.rum.session_id`)\n- `dt.rum.instance.id` — Instance ID\n- `frontend.name` - array of frontends involved in session\n- `dt.rum.application.type` — `web` or `mobile`\n- `dt.rum.user_type` — `real_user`, `synthetic`, or `robot`\n\n**Session aggregates (underscore naming — NOT dot):**\n\n| Field | Description | ⚠️ NOT this |\n|-------|-------------|-------------|\n| `navigation_count` | Number of navigations | ~~`navigation.count`~~ |\n| `user_interaction_count` | Clicks, form submissions | ~~`user_interaction.count`~~ |\n| `user_action_count` | User actions | ~~`user_action.count`~~ |\n| `request_count` | XHR/fetch requests | ~~`request.count`~~ |\n| `event_count` | Total events in session | ~~`event.count`~~ |\n| `page_summary_count` | Page views (web) | ~~`page_summary.count`~~ |\n| `view_summary_count` | Views (mobile/SPA) | ~~`view_summary.count`~~ |\n\n**Error fields (dot naming — same as events):**\n- `error.count`, `error.exception_count`, `error.http_4xx_count`, `error.http_5xx_count`\n- `error.anr_count`, `error.csp_violation_count`, `error.has_crash`\n\n**Session lifecycle:**\n- `start_time`, `end_time`, `duration` (nanoseconds)\n- `end_reason` — `timeout`, `synthetic_execution_finished`, etc.\n- `characteristics.is_bounce` — Boolean bounce flag\n- `characteristics.has_replay` — Session replay available\n\n**User identity:**\n- `dt.rum.user_tag` — User identifier (typically email, username or customerId), set via `dtrum.identifyUser()` API call in the instrumented frontend. **Not always populated** — only present when the frontend explicitly calls `identifyUser()`.\n- When `dt.rum.user_tag` is empty, `dt.rum.instance.id` is often the only user differentiator. The value is a random ID assigned by the RUM agent on the client side, so it is not personally identifiable but can be used to distinguish unique users when `user_tag` is not set. On web this is based on a persistent cookie, so it can be deleted by the user.\n- The user tag is a **session-level field** — query it from `user.sessions`, not `user.events` (where it may be empty even if the session has one).\n\n**Client/device context:**\n- `browser.name`, `browser.version`, `device.type`, `os.name`\n- `geo.country.iso_code`, `client.ip`, `client.isp`\n\n**Synthetic-only fields:**\n- `dt.entity.synthetic_test`, `dt.entity.synthetic_location`, `dt.entity.synthetic_test_step`\n\n**Time window behavior:**\n- `fetch user.sessions, from: X, to: Y` only returns sessions that **started** in `[X, Y]` — NOT sessions that were merely active during that window.\n- Sessions can last 8h+ (the aggregation service waits 30+ minutes of inactivity before closing a session).\n- To find all sessions active during a time window, extend the lookback by at least 8 hours: e.g., to cover events from the last 24h, query `fetch user.sessions, from: now() - 32h`.\n- This matters for correlation queries (e.g., matching `user.events` to `user.sessions` by session ID) — a narrow `user.sessions` window will miss long-running sessions and produce false \"orphans.\"\n\n**Session creation delay:**\n- The session aggregation service waits for ~30+ minutes of inactivity before closing a session and writing the `user.sessions` record.\n- This means **recent events (last ~1 hour) will not yet have a matching `user.sessions` entry** — this is normal, not a data gap.\n- When correlating `user.events` with `user.sessions`, exclude recent data (e.g., use `to: now() - 1h`) to avoid counting in-progress sessions as orphans.\n\n**Zombie sessions (events without a `user.sessions` record):**\n- Not every `dt.rum.session.id` in `user.events` will have a corresponding `user.sessions` record. The session aggregation service intentionally skips **zombie sessions** — sessions with no real user activity (zero navigations and zero user interactions).\n- Zombie sessions contain only background, machine-driven activity (e.g., automatic XHR requests, heartbeats) with no page views or clicks. Serializing them would add no value to users.\n- When correlating `user.events` with `user.sessions`, expect a large number of unmatched session IDs. This is **by design**, not a data gap. Filter to sessions with activity before diagnosing orphans:\n  ```dql\n  fetch user.events, from: now() - 2h, to: now() - 1h\n  | filter isNotNull(dt.rum.session.id)\n  | summarize navs = countIf(characteristics.has_navigation == true),\n      interactions = countIf(characteristics.has_user_interaction == true),\n      by: {dt.rum.session.id}\n  | filter navs > 0 or interactions > 0\n  ```\n\n**Example — bounce rate and session quality:**\n```dql\nfetch user.sessions, from: now() - 24h\n| filter dt.rum.user_type == \"real_user\"\n| summarize\n    total_sessions = count(),\n    bounces = countIf(characteristics.is_bounce == true),\n    zero_activity = countIf(toLong(navigation_count) == 0 and toLong(user_interaction_count) == 0),\n    avg_duration_s = avg(toLong(duration)) / 1000000000\n| fieldsAdd bounce_rate_pct = round((bounces * 100.0) / total_sessions, decimals: 1)\n```\n\n\n\n\n### Performance Thresholds\n- **LCP**: Good <2.5s | Poor >4.0s\n- **INP**: Good <200ms | Poor >500ms\n- **CLS**: Good <0.1 | Poor >0.25\n- **Cold Start**: Good <3s | Poor >5s\n- **Long Tasks**: >50ms problematic, >250ms severe\n\n## Core Workflows\n\n### 1. Web Performance Monitoring\nTrack Core Web Vitals, page performance, and request latency for SEO and UX optimization.\n\n**Primary Files:**\n- `references/WebVitals.md` - Core Web Vitals (LCP, INP, CLS)\n- `references/performance-analysis.md` - Request and page performance\n\n**Common Queries:**\n- All Core Web Vitals summary\n- Web Vitals by page/device\n- Request duration SLA monitoring\n- Page load performance trends\n\n### 2. User Session & Behavior Analysis\nUnderstand user engagement, navigation patterns, and session characteristics. Analyze button clicks, form interactions, and user journeys.\n\n**Data source choice:**\n- Use `fetch user.sessions` for session-level analysis (bounce rate, session duration, session counts)\n- Use `fetch user.events` for event-level detail (individual clicks, navigation timing, specific pages)\n\n**Primary Files:**\n- `references/user-sessions.md` - Session tracking and user analytics\n- `references/performance-analysis.md` - Navigation and engagement patterns\n\n**Common Queries:**\n- Active sessions by frontend\n- Sessions by custom property\n- Bounce rate analysis (use `user.sessions` with `characteristics.is_bounce`)\n- Session quality (zero-activity sessions via `navigation_count`, `user_interaction_count`)\n- Click analysis on UI elements (use `user.events` with `characteristics.has_user_interaction`)\n- External referrers (traffic sources)\n\n### 3. Error Tracking & Debugging\nMonitor error rates, analyze exceptions, and correlate frontend issues with backend.\n\n**Primary Files:**\n- `references/error-tracking.md` - Error analysis and debugging\n- `references/performance-analysis.md` - Trace correlation\n\n**Common Queries:**\n- Error rate monitoring\n- JavaScript exceptions by type\n- Failed requests with backend traces\n- Request timing breakdown\n\n### 4. Mobile Frontend Monitoring\nTrack mobile app performance, startup times, and crash analytics for iOS and Android. Analyze app version performance and device-specific issues.\n\n**Primary Files:**\n- `references/mobile-monitoring.md` - App starts, crashes, and mobile-specific metrics\n\n**Common Queries:**\n- Cold start performance by app version (iOS, Android)\n- Warm start and hot start metrics\n- Crash rate by device model and OS version\n- ANR events (Android)\n- Native crash signals\n- App version comparison\n\n### 5. Advanced Performance Optimization\nDeep performance diagnostics including JavaScript profiling, main thread blocking, UI jank analysis, and geographic performance.\n\n**Primary Files:**\n- `references/performance-analysis.md` - Advanced diagnostics and long tasks\n\n**Common Queries:**\n- Long JavaScript tasks blocking main thread\n- UI jank and rendering delays\n- Tasks >50ms impacting responsiveness\n- Third-party long tasks (iframes)\n- Single-page app performance issues\n- Geographic performance distribution\n- Performance degradation detection\n\n## Best Practices\n\n1. **Use metrics for trends, events for debugging**\n   - Metrics: Timeseries dashboards, alerting, capacity planning\n   - Events: Root cause analysis, detailed diagnostics\n\n2. **Filter by frontend in multi-app environments**\n   - Always use `frontend.name` for clarity\n\n3. **Match interval to time range**\n   - 5m intervals for hours, 1h for days, 1d for weeks\n\n4. **Exclude synthetic traffic when analyzing real users**\n   - Filter `dt.rum.user_type` to focus on genuine behavior\n\n5. **Combine metrics with events for complete insights**\n   - Start with metric trends, drill into events for details\n\n6. **Extend `user.sessions` time window for correlation queries**\n   - `user.sessions` only returns sessions that **started** in the query window\n   - Sessions can last 8h+, so extend lookback by at least 8h when joining with `user.events`\n\n## Slow Page Load Playbook\n\nStart by segmenting the problem by page, browser, geo location, and `dt.rum.user_type`.\n\nHeuristics:\n- High TTFB -> slow backend\n- High LCP with normal TTFB -> render bottleneck\n- High CLS -> layout shifts (late-loading content, ads, fonts)\n- Long tasks dominate -> JavaScript execution bottlenecks (heavy frameworks, large bundles)\n\n### Backend latency (high TTFB)\n\n```dql\nfetch user.events\n| filter frontend.name == \"my-frontend\" and characteristics.has_request == true\n| filter page.url.path == \"/checkout\"\n| summarize avg_ttfb = avg(request.time_to_first_byte), avg_duration = avg(duration)\n```\n\nIf TTFB is high, analyze backend spans by correlating frontend events with backend traces using `dt.rum.trace_id`.\n\n### Heavy JavaScript execution (long tasks)\n\nLong tasks by page:\n\n```dql\nfetch user.events, from: now() - 2h\n| filter characteristics.has_long_task == true\n| summarize\n   long_task_count = count(),\n   total_blocking_time = sum(duration),\n   by: {frontend.name, page.url.path}\n| sort total_blocking_time desc\n| limit 20\n```\n\nLong tasks by script source:\n\n```dql\nfetch user.events, from: now() - 2h\n| filter frontend.name == \"my-frontend\"\n| filter characteristics.has_long_task == true\n| summarize\n   long_task_count = count(),\n   total_blocking_time = sum(duration),\n   by: {long_task.attribution.container_src}\n| sort total_blocking_time desc\n| limit 20\n```\n\n### Large JavaScript bundles\n\n```dql\nfetch user.events\n| filter frontend.name == \"my-frontend\"\n| filter characteristics.has_request\n| filter endsWith(url.full, \".js\")\n| summarize dls = max(performance.decoded_body_size), by: url.full\n| sort dls desc\n| limit 20\n```\n\n### Large resources\n\n```dql\nfetch user.events\n| filter frontend.name == \"my-frontend\"\n| filter characteristics.has_request\n| summarize dls = max(performance.decoded_body_size), by: url.full\n| sort dls desc\n| limit 20\n```\n\n### Cache effectiveness\n\n```dql\nfetch user.events, from: now() - 2h\n| filter frontend.name == \"my-frontend\"\n| filter characteristics.has_request == true\n| fieldsAdd cache_status = if(\n   performance.incomplete_reason == \"local_cache\" or performance.transfer_size == 0 and\n   (performance.encoded_body_size > 0 or performance.decoded_body_size > 0),\n   \"cached\",\n   else: if(performance.transfer_size > 0, \"network\", else: \"uncached\")\n  )\n| summarize\n   request_count = count(),\n   avg_duration = avg(duration),\n   by: {url.domain, cache_status}\n```\n\n### Compression waste\n\n```dql\nfetch user.events, from: now() - 2h\n| filter characteristics.has_request == true\n| filter isNotNull(performance.encoded_body_size) and isNotNull(performance.decoded_body_size)\n| filter performance.encoded_body_size > 0\n| fieldsAdd\n   expansion_ratio = performance.decoded_body_size / performance.encoded_body_size,\n   wasted_bytes = performance.decoded_body_size - performance.encoded_body_size\n| summarize\n   requests = count(),\n   avg_expansion_ratio = avg(expansion_ratio),\n   total_wasted_bytes = sum(wasted_bytes),\n   by: {request.url.host, request.url.path}\n| sort total_wasted_bytes desc\n| limit 50\n```\n\n### Network issues\n\nCompare by location and domain when TTFB is high but backend performance is good:\n\n```dql\nfetch user.events, from: now() - 2h\n| filter characteristics.has_request == true\n| summarize\n   request_count = count(),\n   avg_duration = avg(duration),\n   p75_duration = percentile(duration, 75),\n   p95_duration = percentile(duration, 95),\n   by: {geo.country.iso_code, request.url.domain}\n| sort p95_duration desc\n| limit 50\n```\n\nAnalyze DNS time:\n\n```dql\nfetch user.events, from: now() - 2h\n| filter characteristics.has_request == true\n| filter isNotNull(performance.domain_lookup_start) and isNotNull(performance.domain_lookup_end)\n| fieldsAdd dns_ms = performance.domain_lookup_end - performance.domain_lookup_start\n| summarize\n   request_count = count(),\n   avg_dns_ms = avg(dns_ms),\n   p75_dns_ms = percentile(dns_ms, 75),\n   p95_dns_ms = percentile(dns_ms, 95),\n   by: {request.url.domain}\n| sort p95_dns_ms desc\n| limit 50\n```\n\nAnalyze by protocol (http/1.1, h2, h3):\n\n```dql\nfetch user.events\n| filter characteristics.has_request\n| summarize cnt = count(), by: {url.domain, performance.next_hop_protocol}\n| sort cnt desc\n| limit 50\n```\n\n### Third-party dependencies\n\nAnalyze request performance by domain:\n\n```dql\nfetch user.events, from: now() - 2h\n| filter characteristics.has_request == true\n| summarize\n   request_count = count(),\n   avg_duration = avg(duration),\n   p75_duration = percentile(duration, 75),\n   p95_duration = percentile(duration, 95),\n   by: {request.url.domain}\n| sort p95_duration desc\n| limit 50\n```\n\n## Troubleshooting\n\n### Handling Zero Results\n\nWhen queries return no data, follow this diagnostic workflow:\n\n1. **Validate Timeframe**\n   - Check if timeframe is appropriate for the data type\n   - RUM data may have delay (1-2 minutes for recent events)\n   - Verify timeframe syntax: `now()-1h to now()` or similar\n   - Try expanding timeframe: `now()-24h` for initial exploration\n\n2. **Verify frontend Configuration**\n   - Confirm frontend is instrumented and sending RUM data\n   - Check `frontend.name` filter is correct\n   - Test without frontend filter to see if any RUM data exists\n   - Verify frontend name matches the environment\n\n3. **Check Data Availability**\n   - Run basic query: `fetch user.events | limit 1`\n   - If no events exist, RUM may not be configured\n   - Check if timeframe predates frontend deployment\n   - Verify user has access to the environment\n\n4. **Review Query Syntax**\n   - Validate filters aren't too restrictive\n   - Check for typos in field names or metric names\n   - Test query incrementally: start simple, add filters gradually\n   - Verify characteristics filters match event types\n\n**When to Ask User for Clarification:**\n- No RUM data exists in environment → \"Is RUM configured for this frontend?\"\n- Timeframe unclear → \"What time period should I analyze?\"\n- Expected data missing → \"Has this frontend sent data recently?\"\n\n### Handling Anomalous Results\n\nWhen query results seem unexpected or suspicious:\n\n**Unexpected High Values:**\n- **Metric spikes**: Verify interval aggregation (avg vs. max vs. sum)\n- **Session counts**: Check for bot traffic or synthetic monitoring\n- **Error rates**: Confirm error definition matches expectations\n- **Performance degradation**: Look for deployment or infrastructure changes\n\n**Unexpected Low Values:**\n- **Missing sessions**: Verify `dt.rum.user_type` filter isn't excluding real users\n- **Low request counts**: Check if frontend filter is too narrow\n- **Few errors**: Confirm error characteristics filter is correct\n- **Missing mobile data**: Verify platform-specific fields exist\n\n**Inconsistent Data:**\n- **Metrics vs. Events mismatch**: Different aggregation methods are expected\n- **Geographic anomalies**: Check timezone assumptions\n- **Device distribution skew**: May reflect actual user base\n- **Version mismatches**: Verify app version filtering logic\n\n### Decision Tree: Ask vs. Investigate\n\n```\nQuery returns unexpected results\n│\n├─ Is this a zero-result scenario?\n│  ├─ YES → Follow \"Handling Zero Results\" workflow\n│  └─ NO → Continue\n│\n├─ Can I validate the result independently?\n│  ├─ YES → Run validation query\n│  │        ├─ Validation confirms result → Report findings\n│  │        └─ Validation contradicts → Investigate further\n│  └─ NO → Continue\n│\n├─ Is the anomaly clearly explained by data?\n│  ├─ YES → Report with explanation\n│  └─ NO → Continue\n│\n├─ Do I need domain knowledge to interpret?\n│  ├─ YES → Ask user for context\n│  │        Example: \"The error rate is 15%. Is this expected for your frontend?\"\n│  └─ NO → Continue\n│\n└─ Is the issue ambiguous or requires clarification?\n   ├─ YES → Ask specific question with data context\n   │        Example: \"I see two frontends named 'web-app'. Which frontend name should I use?\"\n   └─ NO → Investigate and report findings with caveats\n```\n\n### Common Investigation Steps\n\n**For Performance Issues:**\n1. Compare to baseline: Query same metric for previous week\n2. Segment by dimension: Break down by device, browser, geography\n3. Check for outliers: Use percentiles (p50, p95, p99) vs. averages\n4. Correlate with deployments: Filter by app version or time windows\n\n**For Data Availability Issues:**\n1. Start broad: Query all RUM data without filters\n2. Add filters incrementally: Isolate which filter eliminates data\n3. Check related metrics: If events missing, try timeseries\n4. Validate entity relationships: Confirm frontend-to-service links\n\n**For Unexpected Patterns:**\n1. Expand timeframe: Look for historical context\n2. Cross-reference data sources: Compare events and metrics\n3. Check sampling: Verify no sampling is affecting results\n4. Consider external factors: Holidays, outages, traffic changes\n\n### Red Flags: When to Stop and Ask\n\n**Always ask the user when:**\n- ❌ No RUM data exists anywhere in the environment\n- ❌ Multiple frontends match the user's description\n- ❌ Results contradict user's stated expectations explicitly\n- ❌ Data suggests monitoring is misconfigured\n- ❌ Query requires business context (e.g., \"acceptable error rate\")\n- ❌ Timeframe is ambiguous and affects interpretation significantly\n\n**Example clarifying questions:**\n- \"I found two frontends named 'checkout'. Which one: `checkout-web` or `checkout-mobile`?\"\n- \"The query returns 0 results for the past hour. Should I expand the timeframe, or do you expect real-time data?\"\n- \"The average LCP is 8 seconds, which exceeds the 4-second threshold. Is this frontend known to have performance issues?\"\n- \"I see only synthetic traffic. Should I include `dt.rum.user_type='REAL_USER'` to focus on real users?\"\n\n## When to Use This Skill\n\n**Use frontend-observability skill when:**\n- Monitoring web or mobile frontend performance\n- Analyzing Core Web Vitals for SEO\n- Tracking user sessions, engagement, or behavior\n- Analyzing click events and button interactions\n- Debugging frontend errors or slow requests\n- Correlating frontend issues with backend traces\n- Optimizing mobile app startup or crash rates (iOS, Android)\n- Analyzing app version performance\n- Diagnosing UI jank and main thread blocking\n- Analyzing security compliance (CSP violations)\n- Profiling JavaScript performance (long tasks)\n\n**Do NOT use for:**\n- Backend service monitoring (use services skill)\n- Infrastructure metrics (use infrastructure skill)\n- Log analysis (use logs skill)\n- Business process monitoring (use business-events skill)\n\n## Progressive Disclosure\n\n### Always Available\n- **FrontendBasics.md** - RUM fundamentals and quick reference\n\n### Loaded by Workflow\n- **Web Performance**: WebVitals.md, performance-analysis.md\n- **User Behavior**: user-sessions.md, performance-analysis.md\n- **Error Analysis**: error-tracking.md, performance-analysis.md\n- **Mobile Apps**: mobile-monitoring.md\n\n### Load on Explicit Request\n- Advanced diagnostics (long tasks, user actions)\n- Security compliance (CSP violations, visibility tracking)\n- Specialized mobile features (platform-specific phases)\n\n## Reference Files\n\n### Core Reference Documents\n- `references/WebVitals.md` - Core Web Vitals monitoring\n- `references/user-sessions.md` - Session and user analytics\n- `references/error-tracking.md` - Error analysis and debugging\n- `references/mobile-monitoring.md` - Mobile app performance and crashes\n- `references/performance-analysis.md` - Advanced performance diagnostics","tags":["obs","frontends","dynatrace","for","agent-skills","ai-agents","claude-code","devops","dql","mcp","observability"],"capabilities":["skill","source-dynatrace","skill-dt-obs-frontends","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-devops","topic-dql","topic-dynatrace","topic-mcp","topic-observability"],"categories":["dynatrace-for-ai"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Dynatrace/dynatrace-for-ai/dt-obs-frontends","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Dynatrace/dynatrace-for-ai","source_repo":"https://github.com/Dynatrace/dynatrace-for-ai","install_from":"skills.sh"}},"qualityScore":"0.489","qualityRationale":"deterministic score 0.49 from registry signals: · indexed on github topic:agent-skills · 78 github stars · SKILL.md body (23,606 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:56:47.938Z","embedding":null,"createdAt":"2026-05-11T18:57:13.987Z","updatedAt":"2026-05-18T18:56:47.938Z","lastSeenAt":"2026-05-18T18:56:47.938Z","tsv":"'-1':2055 '-2':2046 '-24':2065 '/checkout':1529 '/docs/semantic-dictionary/model/rum/user-events':321 '0':915,918,951,957,1725,1730,1735,1741,1783,2645 '0.1':992 '0.25':994 '1':753,975,1009,1346,2028,2045,2114,2450,2496,2536 '100.0':971 '1000000000':964 '15':2399 '1d':1393 '1h':782,895,1390 '2':1060,1366,2070,2460,2505,2543 '2.5':980 '20':1598,1639,1670,1696 '200ms':987 '24h':692,930 '250ms':1005 '2h':253,892,1573,1609,1704,1764,1847,1888,1984 '3':1170,1380,2104,2470,2514,2553 '30':660,735 '32h':698 '3s':998 '4':1212,1396,2137,2481,2523,2562,2673 '4.0':983 '4xx':447 '5':1282,1412 '50':1825,1879,1944,1969,2014 '500ms':989 '50ms':1003,1323 '5m':1386 '5s':1000 '5xx':450 '6':1429 '75':1864,1928,2001 '8':683,2668 '8h':655,1450,1457 '95':1869,1935,2006 'accept':2614 'access':2133 'action':129,133,406,409,2843 'activ':147,648,672,823,838,883,946,1127,1147 'actual':2314 'ad':1499 'add':853,2161,2506 'advanc':1283,1304,2838,2884 'affect':2560,2621 'agent':537 'aggreg':119,330,335,383,657,731,812,2222,2300 'alert':103,1357 'alway':505,1375,2577,2808 'ambigu':2411,2619 'analysi':95,1064,1091,1137,1156,1189,1297,1363,2794,2828,2874 'analyt':1119,1224,2871 'analyz':76,1073,1177,1229,1401,1546,1880,1945,1974,2195,2718,2730,2757,2768 'android':1228,1258,1275,2756 'anomal':2206 'anomali':2305,2371 'anr':1273 'anywher':2586 'api':498 'app':85,1218,1230,1241,1255,1279,1335,1373,2320,2430,2487,2750,2758,2832,2879 'appropri':2035 'aren':2143 'array':365 'ask':2172,2326,2390,2416,2576,2578 'assign':533 'assumpt':2308 'automat':840 'avail':483,2107,2494,2809 'averag':2480,2665 'avg':958,961,1531,1533,1538,1540,1749,1751,1804,1807,1856,1858,1916,1919,1993,1995,2223 'avoid':784 'backend':81,1184,1207,1483,1511,1547,1554,1838,2746,2782 'background':834 'base':566,2316 'baselin':2453 'basic':2109 'behavior':75,628,1063,1411,2729,2824 'best':1344 'block':1294,1314,1585,1594,1626,1635,2767 'bodi':1662,1688,1728,1733,1772,1777,1781,1788,1791,1796,1799 'boolean':476 'bot':2232 'bottleneck':1490,1506 'bounc':121,475,477,920,940,943,966,970,1092,1135,1142 'break':2464 'breakdown':233,1211 'broad':2498 'browser':221,1473,2468 'browser.name':220,240,607 'browser.version':608 'bundl':1510,1642 'busi':2611,2798,2803 'business-ev':2802 'button':1074,2734 'byte':191,195,1537,1794,1812,1815,1822 'cach':1697,1715,1721,1736,1755 'call':499,513 'capac':1358 'caus':1362 'caveat':2443 'chang':2251,2569 'characterist':270,1072,2165,2280 'characteristics.has':255,271,277,282,286,292,297,301,305,311,479,902,907,1163,1524,1575,1616,1652,1682,1711,1766,1849,1890,1955,1986 'characteristics.is':474,942,1141 'check':2031,2082,2105,2124,2147,2230,2269,2306,2471,2515,2554 'checkout':2632,2636,2640 'checkout-mobil':2639 'checkout-web':2635 'choic':1083 'clarif':2175,2414 'clarifi':2625 'clariti':1379 'classic':55 'clear':2372 'click':111,289,401,849,1075,1107,1155,2731 'client':540 'client.ip':613 'client.isp':614 'client/device':605 'close':665,740 'cls':156,990,1035,1492 'cnt':1958,1966 'code':213,238,612,1872 'cold':995,1251 'combin':1413 'common':125,196,223,1041,1125,1195,1249,1309,2444 'compar':1828,2451,2549 'comparison':1281 'complet':1418 'complianc':2770,2845 'compress':1757 'configur':2073,2123,2184 'confirm':2074,2239,2278,2359,2527 'consid':2563 'contain':326,832 'content':172,1498 'context':354,606,2393,2421,2542,2612 'continu':2347,2368,2381,2407 'contradict':2364,2598 'cooki':570 'core':64,1007,1014,1030,1044,2719,2859,2863 'correct':2086,2283 'correl':79,702,771,859,1180,1194,1435,1550,2482,2742 'correspond':807 'count':122,144,146,150,262,393,400,407,412,417,425,432,445,448,451,453,456,785,939,950,956,1097,1151,1154,1582,1583,1623,1624,1747,1748,1803,1854,1855,1914,1915,1959,1991,1992,2229,2268 'countif':901,906,941,947 'cover':687 'crash':14,302,304,458,1223,1243,1265,1277,2753,2882 'creation':727 'cross':2545 'cross-refer':2544 'csp':312,314,2771,2846 'custom':1133 'customerid':494 'dashboard':1356 'data':57,96,323,768,777,877,1081,2023,2038,2041,2081,2096,2106,2178,2197,2203,2286,2294,2375,2420,2493,2502,2513,2547,2584,2604,2663 'day':1392 'debug':1173,1191,1353,2736,2876 'decim':974 'decis':2324 'deep':1286 'definit':2241 'degrad':1342,2245 'delay':165,728,1321,2044 'delet':575 'depend':1973 'deploy':2129,2248,2484 'desc':268,1596,1637,1668,1694,1823,1877,1942,1967,2012 'descript':389,2596 'design':874 'desktop':218 'detail':93,1105,1364,1428 'detect':1343 'devic':1235,1268,2309,2467 'device-specif':1234 'device.type':216,239,609 'diagnos':89,885,2761 'diagnost':1288,1305,1365,2026,2839,2886 'differ':341,2299 'differenti':526 'dimens':225,2463 'disclosur':2807 'distinguish':553 'distribut':1340,2310 'dls':1659,1667,1685,1693 'dns':1881,1904,1917,1920,1923,1926,1930,1933,1940 'docs.dynatrace.com':320 'docs.dynatrace.com/docs/semantic-dictionary/model/rum/user-events':319 'document':2861 'dom':160 'domain':1832,1978,2385 'domin':1503 'dot':350,387,438 'dql':42,248,887,925,1515,1568,1604,1643,1673,1699,1759,1842,1883,1951,1979 'drill':1424 'driven':837 'dt':2 'dt-obs-frontend':1 'dt.entity.synthetic':619,621,623 'dt.frontend':101,229 'dt.frontend.error.count':142 'dt.frontend.request.count':135 'dt.frontend.request.duration':138 'dt.frontend.session.active.estimated':145 'dt.frontend.user.active.estimated':149 'dt.frontend.user_action.count':127 'dt.frontend.user_action.duration':131 'dt.frontend.web.navigation.dom':158 'dt.frontend.web.navigation.load':182 'dt.frontend.web.navigation.time':188 'dt.frontend.web.page.cumulative':153 'dt.frontend.web.page.first':163 'dt.frontend.web.page.interaction':176 'dt.frontend.web.page.largest':171 'dt.rum.application.type':371 'dt.rum.instance.id':361,520 'dt.rum.session':359 'dt.rum.session.id':355,801,898,912 'dt.rum.trace':1557 'dt.rum.user':207,375,486,516,932,1405,1477,2258,2692 'dtrum.identifyuser':497 'durat':120,134,465,959,963,1053,1095,1539,1541,1588,1629,1750,1752,1857,1859,1861,1863,1866,1868,1876,1994,1996,1998,2000,2003,2005,2011 'e.g':203,685,704,778,839,2613 'effect':1698 'element':1159 'elimin':2512 'els':1737,1743 'email':491 'empti':519,598 'end':184,187,463,467,1902,1908 'endswith':1655 'engag':73,1067,1123,2727 'entiti':2525 'entri':762 'environ':1374,2103,2136,2181,2589 'error':21,77,112,143,298,299,436,1171,1175,1188,1197,2237,2240,2277,2279,2396,2615,2738,2827,2873 'error-tracking.md':2829 'error.anr':452 'error.count':443 'error.csp':454 'error.exception':444 'error.has':457 'error.http':446,449 'etc':291,473 'even':599 'event':104,183,186,269,285,296,300,317,348,416,419,442,688,751,794,1103,1274,1351,1360,1416,1426,1552,2050,2117,2168,2297,2519,2550,2732,2804 'event-level':1102 'event.count':422 'everi':800 'exampl':919,2394,2422,2624 'exceed':2671 'except':1178,1201 'exclud':209,775,1397,2263 'execut':471,1505,1561 'exist':2097,2118,2179,2292,2585 'expand':2062,2537,2653 'expans':1785,1805,1808 'expect':863,2196,2243,2303,2402,2602,2659 'experi':50 'explain':2373 'explan':2379 'explicit':512,2603,2836 'explor':2069 'extend':677,1430,1452 'extern':1166,2564 'factor':2565 'fail':1204 'fals':724 'featur':2852 'fetch':105,114,249,629,694,888,926,1085,1099,1516,1569,1605,1644,1674,1700,1760,1843,1884,1952,1980,2111 'fid':166 'field':339,388,437,587,618,2151,2291 'fieldsadd':965,1714,1784,1903 'file':1028,1113,1186,1239,1302,2858 'filter':197,199,215,222,254,879,896,913,931,1367,1404,1518,1527,1574,1610,1615,1646,1651,1654,1676,1681,1705,1710,1765,1769,1779,1848,1889,1893,1954,1985,2084,2090,2142,2162,2166,2260,2272,2281,2322,2485,2504,2507,2511 'find':669,2362,2441 'finish':472 'first':190,194,1536 'flag':478,2571 'focus':1408,2697 'follow':2024,2341 'font':1500 'form':290,402,1076 'found':2628 'framework':1508 'frontend':4,20,26,28,35,68,201,206,235,367,503,511,1130,1181,1214,1369,1522,1551,1614,1650,1680,1709,2072,2075,2089,2099,2128,2187,2201,2271,2405,2426,2432,2529,2591,2630,2678,2708,2716,2737,2743 'frontend-observ':2707 'frontend-to-servic':2528 'frontend.name':198,234,264,364,1377,1519,1590,1611,1647,1677,1706,2083 'frontendbasics.md':2810 'full':316 'fundament':2812 'gap':769,878 'genuin':1410 'geo':1474 'geo.country.iso':212,237,611,1871 'geograph':214,1299,1338,2304 'geographi':2469 'good':979,986,991,997,1841 'gradual':2163 'h':2056,2066 'h2':1949 'h3':1950 'handl':2016,2205,2342 'heartbeat':843 'heavi':1507,1559 'help':61 'heurist':1479 'high':1480,1484,1491,1513,1545,1836,2216 'histor':2541 'holiday':2566 'hop':1963 'hot':1262 'hour':684,754,1389,2650 'http/1.1':1948 'id':357,360,363,532,711,870,1558 'ident':352,485 'identifi':489,547 'identifyus':514 'ifram':1331 'impact':1324 'in-progress':786 'inact':663,738 'includ':1289,2691 'inconsist':2293 'increment':2158,2508 'independ':2353 'individu':107,1106 'infrastructur':2250,2788,2791 'initi':2068 'inp':170,180,985,1034 'input':164 'insight':1419 'instanc':362 'instrument':502,2077 'intent':814 'interact':18,159,161,288,399,829,905,909,917,955,1077,1153,1165,2735 'interpret':2388,2622 'interv':1382,1387,2221 'investig':2328,2365,2438,2445 'involv':368 'io':1226,1257,2755 'isn':2261 'isnotnul':897,1770,1775,1894,1899 'isol':2509 'issu':91,1182,1237,1337,1827,2410,2449,2495,2683,2744 'jank':1296,1318,2763 'javascript':309,1200,1290,1312,1504,1560,1641,2774 'join':1459 'journey':1080 'js':1657 'knowledg':2386 'known':2679 'larg':865,1509,1640,1671 'last':654,691,752,1449 'late':1496 'late-load':1495 'latenc':140,1021,1512 'layout':154,1493 'lcp':174,978,1033,1485,2666 'least':682,1456 'legaci':168 'level':118,329,586,1090,1104 'lifecycl':460 'limit':1597,1638,1669,1695,1824,1878,1943,1968,2013,2113 'link':2532 'load':185,1057,1464,1497,2816,2834 'local':1720 'locat':622,1475,1830 'log':2793,2796 'logic':2323 'long':306,308,719,1001,1307,1311,1329,1501,1562,1564,1576,1580,1599,1617,1621,2776,2840 'long-run':718 'long_task.attribution.container':1631 'look':2246,2539 'lookback':679,1453 'lookup':1896,1901,1907,1910 'low':2253,2266 'machin':836 'machine-driven':835 'main':1292,1315,2765 'match':705,760,1381,2101,2167,2242,2592 'matter':700 'max':1660,1686,2225 'may':596,2042,2120,2312 'mean':749 'mere':647 'method':2301 'metric':98,126,157,167,175,181,1248,1264,1348,1354,1414,1422,2154,2218,2295,2456,2517,2552,2789 'minut':661,736,2047 'misconfigur':2608 'mismatch':2298,2318 'miss':717,2198,2255,2284,2520 'mobil':13,25,34,84,217,281,303,374,1213,1217,1246,2285,2641,2715,2749,2831,2851,2878 'mobile-monitoring.md':2833 'mobile-specif':1245 'mobile/spa':434 'model':318,1269 'monitor':7,31,39,63,211,1012,1055,1174,1199,1215,2236,2606,2712,2784,2800,2866 'ms':141,1905,1918,1921,1924,1927,1931,1934,1941 'multi':1372 'multi-app':1371 'multipl':2590 'my-frontend':204,1520,1612,1648,1678,1707 'name':202,236,340,385,439,2100,2152,2155,2427,2433,2631 'nanosecond':466 'narrow':713,2275 'nativ':1276 'nav':900,914 'navig':283,284,392,396,825,903,949,1068,1108,1121,1150 'navigation.count':397 'need':2384 'network':294,1742,1826 'new':48 'next':178 'normal':765,1487 'number':394,866 'ob':3 'observ':29,2709 'often':522 'one':604,2634 'optim':83,1026,1285,2748 'orphan':725,791,886 'os':1271 'os.name':241,610 'outag':2567 'outlier':2473 'overview':58 'p50':2476 'p75':1860,1922,1997 'p95':1865,1875,1929,1939,2002,2010,2477 'p99':2478 'page':15,108,256,260,266,272,274,423,426,846,1017,1039,1056,1111,1334,1463,1472,1567 'page.url.path':1528,1591 'page/device':1051 'page_summary.count':429 'paint':173,179 'parti':1328,1972 'past':2649 'pattern':1069,1124,2535 'pct':968 'percentil':1862,1867,1925,1932,1999,2004,2475 'perform':16,69,90,976,1011,1018,1040,1058,1219,1232,1253,1284,1287,1300,1336,1339,1341,1839,1976,2244,2448,2682,2717,2760,2775,2820,2880,2885 'performance-analysis.md':2822,2826,2830 'performance.decoded':1661,1687,1732,1776,1787,1795 'performance.domain':1895,1900,1906,1909 'performance.encoded':1727,1771,1780,1790,1798 'performance.incomplete':1718 'performance.next':1962 'performance.transfer':1723,1739 'period':2192 'persist':569 'person':546 'phase':2856 'plan':1359 'platform':2289,2854 'platform-specif':2288,2853 'playbook':1465 'poor':982,988,993,999 'popul':506 'practic':1345 'predat':2127 'prefer':169 'present':508 'previous':2458 'primari':1027,1112,1185,1238,1301 'problem':1470 'problemat':1004 'process':2799 'produc':331,723 'profil':1291,2773 'progress':788,2806 'properti':1134 'protocol':1947,1964 'qualiti':924,1144 'queri':22,43,588,693,703,1042,1126,1196,1250,1310,1436,1445,2020,2110,2139,2157,2209,2329,2357,2454,2499,2609,2643 'question':2418,2626 'quick':123,2814 'random':531 'rang':1385 'rate':921,967,1093,1136,1176,1198,1266,2238,2397,2616,2754 'ratio':1786,1806,1809 'real':5,37,244,377,821,934,1402,2264,2661,2694,2699 'real-tim':2660 'reason':468,1719 'recent':750,776,2049,2204 'record':747,798,809 'red':2570 'refer':124,2546,2815,2857,2860 'references/error-tracking.md':1187,2872 'references/mobile-monitoring.md':1240,2877 'references/performance-analysis.md':1036,1120,1192,1303,2883 'references/user-sessions.md':1114,2867 'references/webvitals.md':1029,2862 'referr':1167 'reflect':2313 'relat':2516 'relationship':2526 'render':1320,1489 'replay':480,482 'report':2361,2377,2440 'request':110,136,139,293,295,411,414,842,1020,1037,1052,1205,1209,1525,1653,1683,1712,1746,1767,1802,1850,1853,1891,1913,1956,1975,1987,1990,2267,2741,2837 'request.count':415 'request.time':1534 'request.url.domain':1873,1937,2008 'request.url.host':1817 'request.url.path':1818 'requir':2413,2610 'resourc':1672 'respons':1325 'restrict':2146 'result':2018,2207,2210,2332,2338,2344,2352,2360,2561,2597,2646 'return':636,1439,2021,2330,2644 'review':2138 'robot':247,381 'root':1361 'round':969 'rum':8,40,49,56,536,2040,2080,2095,2119,2177,2183,2501,2583,2811 'run':720,2108,2355 'sampl':2555,2558 'scenario':2339 'script':1602 'second':2669,2674 'secur':2769,2844 'see':2092,2424,2685 'seem':2211 'segment':1468,2461 'send':2079 'sent':2202 'seo':1023,2723 'serial':850 'servic':336,658,732,813,2531,2783,2786 'session':12,72,113,117,148,322,328,334,344,351,356,370,382,421,459,481,585,602,637,644,652,667,671,710,721,726,730,742,789,793,811,817,818,831,869,881,923,938,973,1062,1071,1089,1094,1096,1115,1128,1131,1143,1148,1440,1447,2228,2256,2726,2868 'session-level':116,327,584,1088 'set':495,561 'sever':1006 'shift':155,1494 'side':541 'signal':1278 'signific':2623 'similar':2060 'simpl':2160 'singl':1333 'single-pag':1332 'size':1663,1689,1724,1729,1734,1740,1773,1778,1782,1789,1792,1797,1800 'skew':2311 'skill':30,45,60,2705,2710,2787,2792,2797,2805 'skill-dt-obs-frontends' 'skip':815 'sla':1054 'slow':1462,1482,2740 'sort':265,1592,1633,1666,1692,1819,1874,1938,1965,2009 'sourc':97,1082,1169,1603,2548 'source-dynatrace' 'span':1548 'special':2850 'specif':1110,1236,1247,2290,2417,2855 'spike':2219 'split':231 'src':1632 'stabil':88 'start':461,639,996,1242,1252,1260,1263,1420,1442,1466,1897,1911,2159,2497 'startup':86,1220,2751 'state':2601 'status':1716,1756 'step':625,2446 'stop':2574 'submiss':403 'suggest':2605 'sum':1587,1628,1813,2227 'summar':259,899,936,1530,1579,1620,1658,1684,1745,1801,1852,1912,1957,1989 'summari':257,273,279,424,431,1047 'suspici':2214 'syntax':2053,2140 'synthet':210,246,379,470,616,1398,2235,2687 'synthetic-on':615 'tablet':219 'tag':487,517,558,581 'target':46 'task':307,310,1002,1308,1313,1322,1330,1502,1563,1565,1577,1581,1600,1618,1622,2777,2841 'telemetri':27 'test':620,624,2087,2156 'third':1327,1971 'third-parti':1326,1970 'thread':1293,1316,2766 'threshold':977,2675 'time':94,162,192,462,464,626,675,1109,1210,1221,1384,1432,1586,1595,1627,1636,1882,2191,2490,2662 'timefram':2030,2033,2052,2063,2126,2188,2538,2617,2655 'timeout':469 'timeseri':99,224,230,1355,2522 'timezon':2307 'tolong':948,953,962 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-devops' 'topic-dql' 'topic-dynatrace' 'topic-mcp' 'topic-observability' 'total':418,937,972,1584,1593,1625,1634,1810,1820 'trace':82,1193,1208,1555,2747 'track':70,1013,1116,1172,1216,2724,2849 'traffic':1168,1399,2233,2568,2688 'tree':2325 'trend':102,1059,1350,1423 'tri':2061,2521 'troubleshoot':2015 'true':258,904,910,944,1526,1578,1619,1713,1768,1851,1892,1988 'ttfb':1481,1488,1514,1532,1543,1834 'two':2425,2629 'type':208,243,376,933,1203,1406,1478,2039,2169,2259,2693 'typic':490 'typo':2149 'ui':1158,1295,1317,2762 'uncach':1744 'unclear':2189 'underscor':346,384 'understand':1065 'unexpect':2212,2215,2252,2331,2534 'uniqu':151,554 'unmatch':868 'url.domain':1754,1961 'url.full':1656,1665,1691 'use':36,54,226,345,349,551,779,1084,1098,1138,1160,1347,1376,1556,2436,2474,2703,2706,2780,2785,2790,2795,2801 'user':6,11,17,38,71,128,132,152,242,245,287,378,398,405,408,484,488,525,555,557,578,580,822,828,857,908,935,954,1061,1066,1079,1118,1152,1164,1403,2131,2173,2265,2315,2391,2580,2594,2599,2695,2700,2725,2823,2842,2870 'user-sessions.md':2825 'user.events':106,250,338,343,593,706,772,803,860,889,1100,1161,1461,1517,1570,1606,1645,1675,1701,1761,1844,1885,1953,1981,2112 'user.sessions':115,324,325,591,630,695,708,714,746,761,774,797,808,862,927,1086,1139,1431,1437 'user_action.count':410 'user_interaction.count':404 'usernam':492 'ux':1025 'valid':2029,2141,2350,2356,2358,2363,2524 'valu':528,855,2217,2254 'verifi':2051,2071,2098,2130,2164,2220,2257,2287,2319,2556 'version':1231,1256,1272,1280,2317,2321,2488,2759 'via':496,1149 'view':109,261,267,275,278,280,427,430,433,847 'view_summary.count':435 'violat':313,315,455,2772,2847 'visibl':2848 'vital':10,66,1016,1032,1046,1049,2721,2865 'volum':130,137 'vs':2224,2226,2296,2327,2479 'wait':659,733 'warm':1259 'wast':1758,1793,1811,1814,1821 'web':9,23,32,65,276,372,428,563,1010,1015,1031,1045,1048,2429,2637,2713,2720,2819,2864 'web-app':2428 'webvitals.md':2821 'week':1395,2459 'window':627,651,676,715,1433,1446,2491 'without':795,2088,2503 'workflow':1008,2027,2345,2818 'would':852 'write':744 'x':632,641 'xhr':841 'xhr/fetch':413 'y':634,642 'yes':2340,2354,2376,2389,2415 'yet':757 'zero':824,827,945,1146,2017,2337,2343 'zero-act':1145 'zero-result':2336 'zombi':792,816,830","prices":[{"id":"039d441c-7056-49e2-8a24-1fada423e174","listingId":"f5881394-6ede-45f7-b8ec-7152ecd6e087","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Dynatrace","category":"dynatrace-for-ai","install_from":"skills.sh"},"createdAt":"2026-05-11T18:57:13.987Z"}],"sources":[{"listingId":"f5881394-6ede-45f7-b8ec-7152ecd6e087","source":"github","sourceId":"Dynatrace/dynatrace-for-ai/dt-obs-frontends","sourceUrl":"https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-obs-frontends","isPrimary":false,"firstSeenAt":"2026-05-11T18:57:13.987Z","lastSeenAt":"2026-05-18T18:56:47.938Z"}],"details":{"listingId":"f5881394-6ede-45f7-b8ec-7152ecd6e087","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Dynatrace","slug":"dt-obs-frontends","github":{"repo":"Dynatrace/dynatrace-for-ai","stars":78,"topics":["agent-skills","ai-agents","claude-code","devops","dql","dynatrace","mcp","observability"],"license":"apache-2.0","html_url":"https://github.com/Dynatrace/dynatrace-for-ai","pushed_at":"2026-05-15T16:06:09Z","description":"Skills, prompts, and instructions for building AI agents on top of Dynatrace production context","skill_md_sha":"1a3d116f1960dee8233895e191743d58b3513e73","skill_md_path":"skills/dt-obs-frontends/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Dynatrace/dynatrace-for-ai/tree/main/skills/dt-obs-frontends"},"layout":"multi","source":"github","category":"dynatrace-for-ai","frontmatter":{"name":"dt-obs-frontends","license":"Apache-2.0","description":"Real User Monitoring (RUM), Web Vitals, user sessions, mobile crashes, page performance, user interactions, and frontend errors. Query web and mobile frontend telemetry."},"skills_sh_url":"https://skills.sh/Dynatrace/dynatrace-for-ai/dt-obs-frontends"},"updatedAt":"2026-05-18T18:56:47.938Z"}}