-
Notifications
You must be signed in to change notification settings - Fork 7
Add PagerDuty low-code plugin #130
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
e66a361
9e9326a
1328e93
0987051
68a3ec3
203a956
3eb08c7
7f152b7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| { | ||
| "steps": [ | ||
| { | ||
| "displayName": "Authenticate", | ||
| "dataStream": { "name": "validateAuth" }, | ||
| "required": true, | ||
| "error": "Could not authenticate with PagerDuty. Check that your API token and service region are correct.", | ||
| "success": "Connected to PagerDuty successfully." | ||
| } | ||
| ] | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| [ | ||
| { | ||
| "name": "PagerDuty Service", | ||
| "sourceType": "PagerDuty Service", | ||
| "icon": "bell", | ||
| "singular": "Service", | ||
| "plural": "Services" | ||
| }, | ||
| { | ||
| "name": "PagerDuty User", | ||
| "sourceType": "PagerDuty User", | ||
| "icon": "user", | ||
| "singular": "User", | ||
| "plural": "Users" | ||
| }, | ||
| { | ||
| "name": "PagerDuty Team", | ||
| "sourceType": "PagerDuty Team", | ||
| "icon": "people-group", | ||
| "singular": "Team", | ||
| "plural": "Teams" | ||
| }, | ||
| { | ||
| "name": "PagerDuty Schedule", | ||
| "sourceType": "PagerDuty Schedule", | ||
| "icon": "calendar-days", | ||
| "singular": "Schedule", | ||
| "plural": "Schedules" | ||
| }, | ||
| { | ||
| "name": "PagerDuty Escalation Policy", | ||
| "sourceType": "PagerDuty Escalation Policy", | ||
| "icon": "diagram-project", | ||
| "singular": "Escalation Policy", | ||
| "plural": "Escalation Policies" | ||
| } | ||
| ] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| { | ||
| "name": "escalationPolicies", | ||
| "displayName": "Escalation Policies (Import)", | ||
| "description": "One row per PagerDuty escalation policy with its team associations", | ||
| "baseDataSourceName": "httpRequestUnscoped", | ||
| "config": { | ||
| "httpMethod": "get", | ||
| "endpointPath": "escalation_policies", | ||
| "postRequestScript": "escalationPolicies.js", | ||
| "paging": { | ||
| "mode": "offset", | ||
| "pageSize": { "realm": "queryArg", "path": "limit", "value": "100" }, | ||
| "offset": { | ||
| "mode": "row", | ||
| "rowCountIn": { "realm": "payloadArraySize", "path": "escalation_policies" }, | ||
| "base": 0 | ||
| }, | ||
| "out": { "realm": "queryArg", "path": "offset" } | ||
| } | ||
| }, | ||
| "matches": "none", | ||
| "metadata": [ | ||
| { "name": "id", "shape": "string" }, | ||
| { "name": "name", "shape": "string" }, | ||
| { "name": "num_loops", "displayName": "Number of Loops", "shape": "number" }, | ||
| { "name": "teamIds", "displayName": "Team IDs", "shape": "string" }, | ||
| { "name": "teamNames", "displayName": "Team Names", "shape": "string" } | ||
| ], | ||
| "timeframes": false, | ||
| "visibility": { "type": "hidden" } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,97 @@ | ||
| { | ||
| "name": "incidentMetrics", | ||
| "displayName": "Incident Metrics", | ||
| "description": "Account-wide aggregated incident analytics β MTTA, MTTR, escalation and interruption counts, optionally bucketed by day, week or month", | ||
| "baseDataSourceName": "httpRequestUnscoped", | ||
| "config": { | ||
| "httpMethod": "post", | ||
| "endpointPath": "analytics/metrics/incidents/all", | ||
| "postBody": { | ||
| "filters": { | ||
| "created_at_start": "{{timeframe.start}}", | ||
| "created_at_end": "{{timeframe.end}}", | ||
| "urgency": "{{urgency && urgency !== 'none' ? urgency : null}}", | ||
| "team_ids": "{{team?.flatMap(o => o.rawId) || null}}", | ||
| "service_ids": "{{service?.flatMap(o => o.rawId) || null}}" | ||
| }, | ||
| "time_zone": "{{dataSource.timezone}}", | ||
| "aggregate_unit": "{{aggregateUnit && aggregateUnit !== 'none' ? aggregateUnit : null}}" | ||
| }, | ||
| "pathToData": "data" | ||
| }, | ||
| "matches": "none", | ||
| "manualConfigApply": true, | ||
| "ui": [ | ||
| { | ||
| "type": "switch", | ||
| "name": "aggregateUnit", | ||
| "label": "Bucket by", | ||
| "help": "Leave as None for a single account-wide summary row over the selected timeframe.", | ||
| "defaultValue": "none", | ||
| "options": [ | ||
| { "value": "none", "label": "None" }, | ||
| { "value": "day", "label": "Day" }, | ||
| { "value": "week", "label": "Week" }, | ||
| { "value": "month", "label": "Month" } | ||
| ] | ||
| }, | ||
| { | ||
| "type": "switch", | ||
| "name": "urgency", | ||
| "label": "Urgency", | ||
| "defaultValue": "none", | ||
| "options": [ | ||
| { "value": "none", "label": "None" }, | ||
| { "value": "high", "label": "High" }, | ||
| { "value": "low", "label": "Low" } | ||
| ] | ||
| }, | ||
| { | ||
| "type": "objects", | ||
| "name": "service", | ||
| "label": "Service", | ||
| "placeholder": "Select...", | ||
| "matches": { "sourceType": { "type": "oneOf", "values": ["PagerDuty Service"] } } | ||
| }, | ||
| { | ||
| "type": "objects", | ||
| "name": "team", | ||
| "label": "Team", | ||
| "placeholder": "Select...", | ||
| "matches": { "sourceType": { "type": "oneOf", "values": ["PagerDuty Team"] } } | ||
| } | ||
| ], | ||
| "metadata": [ | ||
| { "name": "range_start", "displayName": "Period", "shape": "date", "role": "timestamp" }, | ||
| { "name": "total_incident_count", "displayName": "Incidents", "shape": ["number", { "thousandsSeparator": true }], "role": "value" }, | ||
| { "name": "total_incidents_acknowledged", "displayName": "Acknowledged", "shape": "number" }, | ||
| { "name": "total_incidents_auto_resolved", "displayName": "Auto-Resolved", "shape": "number" }, | ||
| { | ||
| "name": "manuallyResolvedCount", | ||
| "displayName": "Incidents Minus Auto-Resolved", | ||
| "computed": true, | ||
| "valueExpression": "{{ ($['total_incident_count'] || 0) - ($['total_incidents_auto_resolved'] || 0) }}", | ||
| "shape": ["number", { "thousandsSeparator": true }] | ||
| }, | ||
| { "name": "total_incidents_manual_escalated", "displayName": "Manually Escalated", "shape": "number" }, | ||
| { "name": "total_incidents_timeout_escalated", "displayName": "Timeout-Escalated", "shape": "number" }, | ||
| { "name": "total_incidents_reassigned", "displayName": "Reassigned", "shape": "number" }, | ||
| { "name": "total_escalation_count", "displayName": "Escalations", "shape": "number" }, | ||
| { "name": "total_interruptions", "displayName": "Interruptions", "shape": "number" }, | ||
| { "name": "total_business_hour_interruptions", "displayName": "Business-Hour Interruptions", "shape": "number", "visible": false }, | ||
| { "name": "total_off_hour_interruptions", "displayName": "Off-Hour Interruptions", "shape": "number", "visible": false }, | ||
| { "name": "total_sleep_hour_interruptions", "displayName": "Sleep-Hour Interruptions", "shape": "number", "visible": false }, | ||
| { "name": "total_notifications", "displayName": "Notifications", "shape": "number", "visible": false }, | ||
| { "name": "mean_seconds_to_first_ack", "displayName": "Mean Time to Acknowledge", "shape": "seconds" }, | ||
| { "name": "mean_seconds_to_resolve", "displayName": "Mean Time to Resolve", "shape": "seconds" }, | ||
| { "name": "mean_seconds_to_engage", "displayName": "Mean Time to Engage", "shape": "seconds", "visible": false }, | ||
| { "name": "mean_seconds_to_mobilize", "displayName": "Mean Time to Mobilize", "shape": "seconds", "visible": false }, | ||
| { "name": "mean_engaged_seconds", "displayName": "Mean Engaged Time", "shape": "seconds", "visible": false }, | ||
| { "name": "total_engaged_seconds", "displayName": "Total Engaged Time", "shape": "seconds", "visible": false }, | ||
| { "name": "mean_assignment_count", "displayName": "Mean Assignments", "shape": "number", "visible": false }, | ||
| { "name": "mean_engaged_user_count", "displayName": "Mean Engaged Users", "shape": "number", "visible": false }, | ||
| { "name": "up_time_pct", "displayName": "Uptime", "shape": "percent" } | ||
| ], | ||
| "timeframes": true, | ||
| "defaultTimeframe": "dashboard" | ||
| } | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,82 @@ | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| "name": "incidentMetricsBreakdown", | ||||||||||||||||||||||||||||||||||||||||||
| "displayName": "Incident Metrics (by Service / Team / Escalation Policy)", | ||||||||||||||||||||||||||||||||||||||||||
| "description": "Aggregated incident analytics grouped by service, team or escalation policy, one row per group", | ||||||||||||||||||||||||||||||||||||||||||
| "baseDataSourceName": "httpRequestUnscoped", | ||||||||||||||||||||||||||||||||||||||||||
| "config": { | ||||||||||||||||||||||||||||||||||||||||||
| "httpMethod": "post", | ||||||||||||||||||||||||||||||||||||||||||
| "endpointPath": "analytics/metrics/incidents/{{groupBy}}", | ||||||||||||||||||||||||||||||||||||||||||
| "postBody": { | ||||||||||||||||||||||||||||||||||||||||||
| "filters": { | ||||||||||||||||||||||||||||||||||||||||||
| "created_at_start": "{{timeframe.start}}", | ||||||||||||||||||||||||||||||||||||||||||
| "created_at_end": "{{timeframe.end}}", | ||||||||||||||||||||||||||||||||||||||||||
| "urgency": "{{urgency && urgency !== 'none' ? urgency : null}}", | ||||||||||||||||||||||||||||||||||||||||||
| "team_ids": "{{team?.flatMap(o => o.rawId) || null}}", | ||||||||||||||||||||||||||||||||||||||||||
| "service_ids": "{{service?.flatMap(o => o.rawId) || null}}" | ||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||
| "time_zone": "{{dataSource.timezone}}" | ||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||
| "pathToData": "data" | ||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||
| "matches": "none", | ||||||||||||||||||||||||||||||||||||||||||
| "manualConfigApply": true, | ||||||||||||||||||||||||||||||||||||||||||
| "ui": [ | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| "type": "switch", | ||||||||||||||||||||||||||||||||||||||||||
| "name": "groupBy", | ||||||||||||||||||||||||||||||||||||||||||
| "label": "Group by", | ||||||||||||||||||||||||||||||||||||||||||
| "defaultValue": "services", | ||||||||||||||||||||||||||||||||||||||||||
| "options": [ | ||||||||||||||||||||||||||||||||||||||||||
| { "value": "services", "label": "Service" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "value": "teams", "label": "Team" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "value": "escalation_policies", "label": "Escalation Policy" } | ||||||||||||||||||||||||||||||||||||||||||
| ], | ||||||||||||||||||||||||||||||||||||||||||
| "validation": { "required": true } | ||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| "type": "switch", | ||||||||||||||||||||||||||||||||||||||||||
| "name": "urgency", | ||||||||||||||||||||||||||||||||||||||||||
| "label": "Urgency", | ||||||||||||||||||||||||||||||||||||||||||
| "defaultValue": "none", | ||||||||||||||||||||||||||||||||||||||||||
| "options": [ | ||||||||||||||||||||||||||||||||||||||||||
| { "value": "none", "label": "None" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "value": "high", "label": "High" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "value": "low", "label": "Low" } | ||||||||||||||||||||||||||||||||||||||||||
| ] | ||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| "type": "objects", | ||||||||||||||||||||||||||||||||||||||||||
| "name": "service", | ||||||||||||||||||||||||||||||||||||||||||
| "label": "Service", | ||||||||||||||||||||||||||||||||||||||||||
| "placeholder": "Select...", | ||||||||||||||||||||||||||||||||||||||||||
| "matches": { "sourceType": { "type": "oneOf", "values": ["PagerDuty Service"] } } | ||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||
| "type": "objects", | ||||||||||||||||||||||||||||||||||||||||||
| "name": "team", | ||||||||||||||||||||||||||||||||||||||||||
| "label": "Team", | ||||||||||||||||||||||||||||||||||||||||||
| "placeholder": "Select...", | ||||||||||||||||||||||||||||||||||||||||||
| "matches": { "sourceType": { "type": "oneOf", "values": ["PagerDuty Team"] } } | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
| ], | ||||||||||||||||||||||||||||||||||||||||||
| "metadata": [ | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "service_id", "displayName": "Service ID", "shape": "string", "visible": false }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "service_name", "displayName": "Service", "shape": "string", "role": "label" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "team_id", "displayName": "Team ID", "shape": "string", "visible": false }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "team_name", "displayName": "Team", "shape": "string" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "escalation_policy_id", "displayName": "Escalation Policy ID", "shape": "string", "visible": false }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "escalation_policy_name", "displayName": "Escalation Policy", "shape": "string" }, | ||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+63
to
+68
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. π― Functional Correctness | π‘ Minor | β‘ Quick win Add a computed group label for every When π Committable suggestion
Suggested change
π€ Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||
| { "name": "distinct_responder_count", "displayName": "Distinct Responders", "shape": "number" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "total_incident_count", "displayName": "Incidents", "shape": ["number", { "thousandsSeparator": true }], "role": "value" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "total_incidents_acknowledged", "displayName": "Acknowledged", "shape": "number" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "total_incidents_auto_resolved", "displayName": "Auto-Resolved", "shape": "number" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "total_escalation_count", "displayName": "Escalations", "shape": "number" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "total_interruptions", "displayName": "Interruptions", "shape": "number" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "mean_seconds_to_first_ack", "displayName": "Mean Time to Acknowledge", "shape": "seconds" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "mean_seconds_to_resolve", "displayName": "Mean Time to Resolve", "shape": "seconds" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "name": "up_time_pct", "displayName": "Uptime", "shape": "percent" }, | ||||||||||||||||||||||||||||||||||||||||||
| { "sourceId": "service_id", "sourceType": "PagerDuty Service", "name": "service_name" } | ||||||||||||||||||||||||||||||||||||||||||
| ], | ||||||||||||||||||||||||||||||||||||||||||
| "timeframes": true, | ||||||||||||||||||||||||||||||||||||||||||
| "defaultTimeframe": "dashboard" | ||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,124 @@ | ||
| { | ||
| "name": "incidents", | ||
| "displayName": "Incidents", | ||
| "description": "PagerDuty incidents filterable by status, urgency, service, team and assignee, one row per incident. PagerDuty's incident search only supports a ~6-month lookback, so a longer or custom range is automatically clamped to the most recent 6 months.", | ||
| "baseDataSourceName": "httpRequestUnscoped", | ||
|
Comment on lines
+1
to
+5
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. π Maintainability & Code Quality | π‘ Minor | β‘ Quick win Add the required π€ Prompt for AI Agents |
||
| "config": { | ||
| "httpMethod": "get", | ||
| "endpointPath": "incidents", | ||
| "getArgs": [ | ||
| { "key": "since", "value": "{{new Date(Math.max(new Date(timeframe.start).getTime(), new Date(timeframe.end).getTime() - 182 * 86400000)).toISOString()}}" }, | ||
| { "key": "until", "value": "{{timeframe.end}}" }, | ||
| { "key": "statuses[]", "value": "{{statuses?.length ? statuses : null}}" }, | ||
| { "key": "urgencies[]", "value": "{{urgencies?.length ? urgencies : null}}" }, | ||
| { "key": "service_ids[]", "value": "{{service?.flatMap(o => o.rawId) || null}}" }, | ||
| { "key": "team_ids[]", "value": "{{team?.flatMap(o => o.rawId) || null}}" }, | ||
| { "key": "user_ids[]", "value": "{{assignee?.flatMap(o => o.rawId) || null}}" } | ||
| ], | ||
| "paging": { | ||
| "mode": "offset", | ||
| "pageSize": { "realm": "queryArg", "path": "limit", "value": "100" }, | ||
| "offset": { | ||
| "mode": "row", | ||
| "rowCountIn": { "realm": "payloadArraySize", "path": "incidents" }, | ||
| "base": 0 | ||
| }, | ||
| "out": { "realm": "queryArg", "path": "offset" } | ||
| }, | ||
| "postRequestScript": "incidents.js" | ||
| }, | ||
| "matches": "none", | ||
| "manualConfigApply": true, | ||
| "ui": [ | ||
| { | ||
| "type": "autocomplete", | ||
| "name": "statuses", | ||
| "label": "Status", | ||
| "isMulti": true, | ||
| "allowCustomValues": false, | ||
| "placeholder": "Select...", | ||
| "help": "Leave empty to include all statuses. Filtering here is done by PagerDuty rather than in the browser, keeping large result sets manageable.", | ||
| "data": { | ||
| "source": "fixed", | ||
| "values": [ | ||
| { "value": "triggered", "label": "Triggered" }, | ||
| { "value": "acknowledged", "label": "Acknowledged" }, | ||
| { "value": "resolved", "label": "Resolved" } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "type": "autocomplete", | ||
| "name": "urgencies", | ||
| "label": "Urgency", | ||
| "isMulti": true, | ||
| "allowCustomValues": false, | ||
| "placeholder": "Select...", | ||
| "help": "Leave empty to include all urgencies.", | ||
| "data": { | ||
| "source": "fixed", | ||
| "values": [ | ||
| { "value": "high", "label": "High" }, | ||
| { "value": "low", "label": "Low" } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "type": "objects", | ||
| "name": "service", | ||
| "label": "Service", | ||
| "placeholder": "Select...", | ||
| "matches": { "sourceType": { "type": "oneOf", "values": ["PagerDuty Service"] } } | ||
| }, | ||
| { | ||
| "type": "objects", | ||
| "name": "team", | ||
| "label": "Team", | ||
| "placeholder": "Select...", | ||
| "matches": { "sourceType": { "type": "oneOf", "values": ["PagerDuty Team"] } } | ||
| }, | ||
| { | ||
| "type": "objects", | ||
| "name": "assignee", | ||
| "label": "Assignee", | ||
| "placeholder": "Select...", | ||
| "matches": { "sourceType": { "type": "oneOf", "values": ["PagerDuty User"] } } | ||
| } | ||
| ], | ||
| "metadata": [ | ||
| { "name": "id", "displayName": "ID", "shape": "string", "visible": false }, | ||
| { "name": "incidentNumber", "displayName": "Number", "shape": ["number", { "thousandsSeparator": false }] }, | ||
| { "name": "title", "displayName": "Title", "shape": "string", "role": "label" }, | ||
| { | ||
| "name": "status", | ||
| "displayName": "Status", | ||
| "shape": [ | ||
| "state", | ||
| { | ||
| "map": { | ||
| "error": ["triggered"], | ||
| "warning": ["acknowledged"], | ||
| "success": ["resolved"] | ||
| } | ||
| } | ||
| ] | ||
| }, | ||
| { "name": "urgency", "displayName": "Urgency", "shape": "string" }, | ||
| { "name": "priorityName", "displayName": "Priority", "shape": "string" }, | ||
| { "name": "serviceId", "displayName": "Service ID", "shape": "string", "visible": false }, | ||
| { "name": "serviceName", "displayName": "Service", "shape": "string" }, | ||
| { "name": "escalationPolicyName", "displayName": "Escalation Policy", "shape": "string", "visible": false }, | ||
| { "name": "teamNames", "displayName": "Teams", "shape": "string" }, | ||
| { "name": "assigneeNames", "displayName": "Assignees", "shape": "string" }, | ||
| { "name": "modifiedById", "displayName": "Modified By ID", "shape": "string", "visible": false }, | ||
| { "name": "modifiedByName", "displayName": "Modified By", "shape": "string" }, | ||
| { "name": "modifiedByType", "displayName": "Modified By Type", "shape": "string", "visible": false }, | ||
| { "name": "createdAt", "displayName": "Created", "shape": "date", "role": "timestamp" }, | ||
| { "name": "lastStatusChangeAt", "displayName": "Last Status Change", "shape": "date" }, | ||
| { "name": "resolvedAt", "displayName": "Resolved", "shape": "date" }, | ||
| { "name": "htmlUrl", "displayName": "Link", "shape": ["url", { "label": "Open in PagerDuty" }] }, | ||
| { "sourceId": "serviceId", "sourceType": "PagerDuty Service", "name": "serviceName" } | ||
| ], | ||
| "timeframes": true, | ||
| "defaultTimeframe": "dashboard" | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
π Maintainability & Code Quality | π‘ Minor | β‘ Quick win
Add
tagsto the three analytics data streams. The checked-inREVIEW.mdrequires this field for everydataStreams/*.jsonfile, and CI validates modified plugins. Use existing category names for the tag values.π€ Prompt for AI Agents