Skip to content

Commit eda4a3f

Browse files
authored
Merge branch 'staged' into staged
2 parents b5a7c44 + 632052f commit eda4a3f

5 files changed

Lines changed: 407 additions & 4 deletions

File tree

agents/new-relic-incident-response.agent.md

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,63 @@
11
---
22
name: New Relic Incident Response Agent
33
description: Identify and fix production issues by correlating New Relic observability data with code changes. Analyze alerts, transaction traces, error analytics, and deployments to find root causes and suggest code fixes.
4-
model: gpt-4.1
4+
model:
5+
- GPT-4.1
6+
- GPT-5.4
7+
- Claude Sonnet 4.6
58
tools:
6-
- new-relic-mcp-server
9+
- new-relic-mcp-server/*
710
- github
811
---
12+
# Context
13+
You have access to New Relic's MCP server tools through the users environment. If needed, you can use OAuth to access the MCP server instead of the users credentials.
914

10-
# New Relic Incident Response & Debugging Agent - System Prompt
15+
This repository should have access to information around how this application and codebase is instrumented with New Relic. You can find information on the context by using newrelic.ini directory in this repository. Wherever possible, correlate the results of the incident to the specific Application present in this repository.
16+
17+
# New Relic Incident Response & Debugging Agent - Main Goal
1118

1219
Your goal is to help engineers rapidly triage and resolve production incidents by correlating New Relic observability data with code changes. You act as an expert incident responder who uses alerts, transaction traces, error analytics, and recent deployment data to identify root causes and suggest code fixes.
1320

21+
## MCP Server Configuration requirement
22+
23+
This custom agent depends on a configured New Relic MCP server. The server registration in your MCP settings must be discoverable to the agent and should use the configured server name `new-relic-mcp-server`.
24+
25+
Before starting an investigation:
26+
27+
- Confirm that the New Relic MCP server is available in the current session
28+
- Prefer the configured `new-relic-mcp-server` MCP server when retrieving alerts, traces, errors, deployments, and NRQL results
29+
- If the server is unavailable or misconfigured, stop and tell the engineer exactly which MCP server is missing instead of guessing
30+
- If your environment uses a different server name, update the tool prefixes in this agent profile to match the configured name
31+
- If the MCP settings use `include-tags`, only tools in those tag groups will actually be exposed to the agent even if they are listed in `tools:` here
32+
- Keep `.vscode/mcp.json` aligned with this profile when using the agent in VS Code.
33+
- If possible prompt the user for OAuth authentication to the MCP server if not already authenticated, so that you can access the New Relic data needed for incident response.
34+
35+
Expected MCP coverage:
36+
37+
- Alert violations and policy details
38+
- Change tracking and deployment markers
39+
- Transaction traces and performance data
40+
- Error analytics and stack traces
41+
- Distributed tracing
42+
- NRQL query execution
43+
44+
Example MCP settings alignment:
45+
46+
```json
47+
{
48+
"servers": {
49+
"new-relic-mcp-server": {
50+
"url": "https://mcp.newrelic.com/mcp/",
51+
"type": "http",
52+
"headers": {
53+
"api-key": "${COPILOT_MCP_NEW_RELIC_API_KEY}",
54+
"include-tags": "discovery,data-access,alerting,incident-response,performance-analytics,advanced-analysis"
55+
}
56+
}
57+
}
58+
}
59+
```
60+
1461
## Core Capabilities
1562

1663
You assist engineers with rapid incident response by:
@@ -23,6 +70,14 @@ You assist engineers with rapid incident response by:
2370

2471
**Code Remediation**: Suggesting specific code fixes, rollback strategies, or mitigation approaches based on the observability data
2572

73+
# How this agent should operate
74+
75+
When an engineer is investigating a production incident, they will ask you questions about the issue. You should use the New Relic MCP server tools to retrieve relevant observability data (alerts, traces, errors, deployments) and correlate it with recent code changes from GitHub. Your responses should help the engineer understand the root cause of the incident and suggest specific code changes or mitigation strategies to resolve it.
76+
77+
Start the process by going through phase 1 (Incident Assessment) to understand the alert and establish a timeline. Then ask if the user wants to proceed to phase 2 (Root Cause Investigation) to analyze traces, errors, and changes. Finally, if the root cause is identified, ask if they want to proceed to phase 3 (Code Analysis and Fix) where you can suggest specific code changes. Always confirm with the engineer before making any code changes or suggesting fixes. Your role is to assist and guide the engineer through the incident response process, not to take unilateral action.
78+
79+
For clarity, before running large complex time consuming queries, check with the user on which account they are investigating, and which issues they want to focus on. Always ask for confirmation before running queries that could take a long time or return large amounts of data.
80+
2681
## Steps to Follow
2782

2883
### Phase 1: Incident Assessment
@@ -256,4 +311,4 @@ File: `src/repositories/UserRepository.java`
256311
- Add integration test that runs queries against production-sized dataset
257312
- Add alert for slow query duration (>500ms)
258313
- Add code review checklist item: "All database queries have WHERE clauses"
259-
```
314+
```

docs/README.skills.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-skills) for guidelines on how to
250250
| [onboard-context-matic](../skills/onboard-context-matic/SKILL.md)<br />`gh skills install github/awesome-copilot onboard-context-matic` | Interactive onboarding tour for the context-matic MCP server. Walks the user through what the server does, shows all available APIs, lets them pick one to explore, explains it in their project language, demonstrates model_search and endpoint_search live, and ends with a menu of things the user can ask the agent to do. USE FOR: first-time setup; "what can this MCP do?"; "show me the available APIs"; "onboard me"; "how do I use the context-matic server"; "give me a tour". DO NOT USE FOR: actually integrating an API end-to-end (use integrate-context-matic instead). | None |
251251
| [oo-component-documentation](../skills/oo-component-documentation/SKILL.md)<br />`gh skills install github/awesome-copilot oo-component-documentation` | Create or update standardized object-oriented component documentation using a shared template plus mode-specific guidance for new and existing docs. | `assets/documentation-template.md`<br />`references/create-mode.md`<br />`references/update-mode.md` |
252252
| [openapi-to-application-code](../skills/openapi-to-application-code/SKILL.md)<br />`gh skills install github/awesome-copilot openapi-to-application-code` | Generate a complete, production-ready application from an OpenAPI specification | None |
253+
| [optimize-simplicite-logs](../skills/optimize-simplicite-logs/SKILL.md)<br />`gh skills install github/awesome-copilot optimize-simplicite-logs` | capability to parse Simplicité logs from a raw `.txt` file, filter fields to reduce noise, and output the result as structured JSON. | `scripts/SimpliciteLog2Json.ps1`<br />`scripts/simplicite-log2json.py` |
253254
| [pdftk-server](../skills/pdftk-server/SKILL.md)<br />`gh skills install github/awesome-copilot pdftk-server` | Skill for using the command-line tool pdftk (PDFtk Server) for working with PDF files. Use when asked to merge PDFs, split PDFs, rotate pages, encrypt or decrypt PDFs, fill PDF forms, apply watermarks, stamp overlays, extract metadata, burst documents into pages, repair corrupted PDFs, attach or extract files, or perform any PDF manipulation from the command line. | `references/download.md`<br />`references/pdftk-cli-examples.md`<br />`references/pdftk-man-page.md`<br />`references/pdftk-server-license.md`<br />`references/third-party-materials.md` |
254255
| [penpot-uiux-design](../skills/penpot-uiux-design/SKILL.md)<br />`gh skills install github/awesome-copilot penpot-uiux-design` | Comprehensive guide for creating professional UI/UX designs in Penpot using MCP tools. Use this skill when: (1) Creating new UI/UX designs for web, mobile, or desktop applications, (2) Building design systems with components and tokens, (3) Designing dashboards, forms, navigation, or landing pages, (4) Applying accessibility standards and best practices, (5) Following platform guidelines (iOS, Android, Material Design), (6) Reviewing or improving existing Penpot designs for usability. Triggers: "design a UI", "create interface", "build layout", "design dashboard", "create form", "design landing page", "make it accessible", "design system", "component library". | `references/accessibility.md`<br />`references/component-patterns.md`<br />`references/platform-guidelines.md`<br />`references/setup-troubleshooting.md` |
255256
| [performance-review-writer](../skills/performance-review-writer/SKILL.md)<br />`gh skills install github/awesome-copilot performance-review-writer` | Draft performance reviews, self-assessments, peer reviews, and upward feedback in your own voice. Analyzes your contributions, emails, and meeting history via WorkIQ, then produces honest, impact-focused drafts using the STAR format. USE FOR: write my performance review, draft self-assessment, peer review, 360 feedback, annual review, mid-year review, upward feedback, write review for colleague, performance appraisal. | None |
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
---
2+
name: optimize-simplicite-logs
3+
description: capability to parse Simplicité logs from a raw `.txt` file, filter fields to reduce noise, and output the result as structured JSON.
4+
---
5+
6+
# Optimize Simplicite Logs
7+
8+
This skill provides the capability to parse Simplicité logs from a raw `.txt` file, filter fields to reduce noise, and output the result as structured JSON. This is critical for optimizing AI context size (saving ~56% of tokens) and providing structured, predictable data for troubleshooting.
9+
10+
## When to Use This Skill
11+
12+
Use this skill when you need to:
13+
- Analyze user-provided Simplicité log files in `.txt` format.
14+
- Avoid ingesting massive raw log files into your context window.
15+
- Extract structured fields (like `timestamp`, `level`, `body`) from verbose multi-line log output.
16+
17+
**IMPORTANT:** Instead of directly reading a raw `.txt` log file provided by the user using file read tools, you **must** use one of the log converter scripts (PowerShell or Python) to parse the file into a JSON format first, optionally extracting only the fields needed.
18+
19+
## Prerequisites
20+
21+
- Access to either the PowerShell script (`/scripts/SimpliciteLog2Json.ps1`) or the Python script (`/scripts/simplicite-log2json.py`).
22+
23+
## Core Capabilities
24+
25+
### 1. Context Optimization
26+
Reduces the tokens consumed by large Simplicité logs by extracting only relevant log fields (e.g. `body`, `timestamp`, `level`) and discarding non-relevant structural log data (like `app`, `endpoint`, `contextPath`).
27+
28+
### 2. Multi-line Support
29+
Properly captures stack traces and multiline errors inside the `body` field of the JSON structure, which a simple text search might miss.
30+
31+
### 3. Stdout Support
32+
If no output path is provided for the JSON file (e.g. omitting `--output` or `-Output`), the parsed JSON will be printed directly to stdout, allowing you to pipe the output to other tools.
33+
34+
## Output Summary
35+
36+
After processing, the tool prints a summary to stderr (or console):
37+
```
38+
Processed: 123 entries, Skipped: 2 entries
39+
```
40+
41+
## Usage Examples
42+
43+
### Example 1: Python Version (Recommended)
44+
Convert a log file to JSON, keeping only the most important fields:
45+
```sh
46+
python /absolute/path/to/skills/optimize-simplicite-logs/scripts/simplicite-log2json.py <input.txt> --include timestamp,level,body --output <output.json>
47+
```
48+
49+
### Example 2: PowerShell Version
50+
```powershell
51+
/python /absolute/path/to/skills/optimize-simplicite-logs/scripts/SimpliciteLog2Json.ps1 -InputPath "<input.txt>" -Output "<output.json>" -Include "body,timestamp,level"
52+
```
53+
54+
After generating the `<output.json>`, you can safely read the resulting file to perform your analysis.
55+
56+
## Guidelines
57+
58+
1. **Always Convert First:** Never directly read `.txt` log files from Simplicité using standard text reading tools. Always convert them to JSON using the available scripts.
59+
2. **Filter Fields:** Use `--include` (Python) or `-Include` (PowerShell) to restrict fields to what is absolutely necessary to diagnose the issue (usually `timestamp,level,body`).
60+
3. **Available Fields:** The fields you can filter include: `timestamp`, `app`, `level`, `endpoint`, `contextPath`, `event`, `user`, `class`, `function`, `rowId`, `body`.
61+
62+
## Common Patterns
63+
64+
### Pattern: Fast Contextual Troubleshooting
65+
```sh
66+
# 1. Run the script to generate a minified JSON output in the current directory
67+
python /absolute/path/to/skills/optimize-simplicite-logs/scripts/simplicite-log2json.py logs.txt --include timestamp,level,body --output logs_minified.json
68+
69+
# 2. Then read logs_minified.json to understand the context.
70+
```
71+
72+
## Limitations
73+
74+
- The parser depends on a fixed regex pattern that matches the standard Simplicité log output. If the log format has been heavily customized, parsing might fail or degrade.
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
param (
2+
[Parameter(Mandatory=$true)]
3+
[string]$InputPath,
4+
5+
[string]$Output,
6+
7+
[string]$Include,
8+
9+
[string]$Exclude
10+
)
11+
12+
# Valid fields
13+
$ValidFields = @("timestamp", "app", "level", "endpoint", "contextPath", "event", "user", "class", "function", "rowId", "body")
14+
15+
# Function to check if a field is valid
16+
function Test-ValidField {
17+
param([string]$Field)
18+
return $ValidFields -contains $Field
19+
}
20+
21+
# Verify that -Include and -Exclude are not both used
22+
if ($Include -and $Exclude) {
23+
Write-Error "Error: -Include and -Exclude cannot be used together."
24+
exit 1
25+
}
26+
27+
# Initialize field variables
28+
$IncludeFields = $null
29+
$ExcludeFields = $null
30+
31+
# Validate fields provided in Include/Exclude
32+
if ($Include) {
33+
$IncludeFields = $Include -split "," | ForEach-Object { $_.Trim() }
34+
foreach ($field in $IncludeFields) {
35+
if (-not (Test-ValidField $field)) {
36+
Write-Error "Error: Invalid field '$field'. Valid fields: $($ValidFields -join ', ')"
37+
exit 1
38+
}
39+
}
40+
}
41+
42+
if ($Exclude) {
43+
$ExcludeFields = $Exclude -split "," | ForEach-Object { $_.Trim() }
44+
foreach ($field in $ExcludeFields) {
45+
if (-not (Test-ValidField $field)) {
46+
Write-Error "Error: Invalid field '$field'. Valid fields: $($ValidFields -join ', ')"
47+
exit 1
48+
}
49+
}
50+
}
51+
52+
# Check that the input file exists
53+
if (-not (Test-Path $InputPath)) {
54+
Write-Error "Error: File $InputPath does not exist."
55+
exit 1
56+
}
57+
# Read the file and normalize line endings
58+
# Group raw lines into log entries where a new entry starts with a timestamp.
59+
$raw = Get-Content -Path $InputPath -Raw
60+
$raw = $raw -replace "`r`n","`n" -replace "`r","`n"
61+
$lines = $raw -split "`n"
62+
63+
$entryTexts = @()
64+
$buffer = ""
65+
$skippedLines = 0
66+
67+
foreach ($line in $lines) {
68+
if ($line -eq $null) { continue }
69+
if ($line.Trim().Length -eq 0) { continue }
70+
71+
if ($line -match '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}') {
72+
if ($buffer -ne "") { $entryTexts += $buffer }
73+
$buffer = $line
74+
} else {
75+
# Continuation line: attach to current buffer if present, otherwise skip
76+
if ($buffer -eq "") {
77+
$skippedLines++
78+
continue
79+
} else {
80+
$buffer += "`n" + $line
81+
}
82+
}
83+
}
84+
85+
if ($buffer -ne "") { $entryTexts += $buffer }
86+
87+
$entries = @()
88+
$processed = 0
89+
$skippedMalformed = 0
90+
91+
foreach ($entryText in $entryTexts) {
92+
$parts = $entryText -split '\|'
93+
if ($parts.Count -ge 12) {
94+
# Trim only the first 11 fields; preserve the body (may contain pipes/newlines)
95+
for ($i=0; $i -le 10; $i++) { $parts[$i] = $parts[$i].Trim() }
96+
97+
$body = ($parts[11..($parts.Count - 1)] -join '|')
98+
99+
$entry = @{
100+
timestamp = $parts[0]
101+
app = $parts[1]
102+
level = $parts[2]
103+
endpoint = $parts[4]
104+
contextPath = $parts[5]
105+
event = $parts[6]
106+
user = $parts[7]
107+
class = $parts[8]
108+
function = $parts[9]
109+
rowId = $parts[10]
110+
body = $body
111+
}
112+
113+
# Apply include/exclude filters
114+
if ($IncludeFields -and $IncludeFields.Count -gt 0) {
115+
$filteredEntry = @{}
116+
foreach ($field in $IncludeFields) {
117+
if ($entry.ContainsKey($field)) {
118+
$filteredEntry[$field] = $entry[$field]
119+
} else {
120+
$filteredEntry[$field] = $null
121+
}
122+
}
123+
$entry = $filteredEntry
124+
}
125+
elseif ($ExcludeFields -and $ExcludeFields.Count -gt 0) {
126+
foreach ($field in $ExcludeFields) {
127+
if ($entry.ContainsKey($field)) {
128+
$entry.PSObject.Properties.Remove($field)
129+
}
130+
}
131+
}
132+
133+
$entries += $entry
134+
$processed++
135+
} else {
136+
$skippedMalformed++
137+
}
138+
}
139+
140+
$skipped = $skippedLines + $skippedMalformed
141+
142+
# Convert to JSON (compact)
143+
$json = $entries | ConvertTo-Json -Depth 10 -Compress
144+
145+
# Write output
146+
if ($Output) {
147+
Set-Content -Path $Output -Value $json -Encoding UTF8
148+
Write-Host "Output written to $Output"
149+
} else {
150+
$json
151+
}
152+
153+
Write-Host "Processed: $processed entries, Skipped: $skipped entries"

0 commit comments

Comments
 (0)