feat: add comprehensive performance benchmark tracking system

- Create benchmark test suites for critical operations:
  - Node loading performance
  - Database query performance
  - Search operations performance
  - Validation performance
  - MCP tool execution performance

- Add GitHub Actions workflow for benchmark tracking:
  - Runs on push to main and PRs
  - Uses github-action-benchmark for historical tracking
  - Comments on PRs with performance results
  - Alerts on >10% performance regressions
  - Stores results in GitHub Pages

- Create benchmark infrastructure:
  - Custom Vitest benchmark configuration
  - JSON reporter for CI results
  - Result formatter for github-action-benchmark
  - Performance threshold documentation

- Add supporting utilities:
  - SQLiteStorageService for benchmark database setup
  - MCPEngine wrapper for testing MCP tools
  - Test factories for generating benchmark data
  - Enhanced NodeRepository with benchmark methods

- Document benchmark system:
  - Comprehensive benchmark guide in docs/BENCHMARKS.md
  - Performance thresholds in .github/BENCHMARK_THRESHOLDS.md
  - README for benchmarks directory
  - Integration with existing test suite

The benchmark system will help monitor performance over time and catch regressions before they reach production.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
czlonkowski
2025-07-28 22:45:09 +02:00
parent 0252788dd6
commit b5210e5963
52 changed files with 6843 additions and 16 deletions

160
tests/fixtures/database/test-nodes.json vendored Normal file
View File

@@ -0,0 +1,160 @@
{
"nodes": [
{
"style": "programmatic",
"nodeType": "nodes-base.httpRequest",
"displayName": "HTTP Request",
"description": "Makes HTTP requests and returns the response",
"category": "Core Nodes",
"properties": [
{
"name": "url",
"displayName": "URL",
"type": "string",
"required": true,
"default": ""
},
{
"name": "method",
"displayName": "Method",
"type": "options",
"options": [
{ "name": "GET", "value": "GET" },
{ "name": "POST", "value": "POST" },
{ "name": "PUT", "value": "PUT" },
{ "name": "DELETE", "value": "DELETE" }
],
"default": "GET"
}
],
"credentials": [],
"isAITool": true,
"isTrigger": false,
"isWebhook": false,
"operations": [],
"version": "1",
"isVersioned": false,
"packageName": "n8n-nodes-base",
"documentation": "The HTTP Request node makes HTTP requests and returns the response data."
},
{
"style": "programmatic",
"nodeType": "nodes-base.webhook",
"displayName": "Webhook",
"description": "Receives data from external services via webhooks",
"category": "Core Nodes",
"properties": [
{
"name": "httpMethod",
"displayName": "HTTP Method",
"type": "options",
"options": [
{ "name": "GET", "value": "GET" },
{ "name": "POST", "value": "POST" }
],
"default": "POST"
},
{
"name": "path",
"displayName": "Path",
"type": "string",
"default": "webhook"
}
],
"credentials": [],
"isAITool": false,
"isTrigger": true,
"isWebhook": true,
"operations": [],
"version": "1",
"isVersioned": false,
"packageName": "n8n-nodes-base",
"documentation": "The Webhook node creates an endpoint to receive data from external services."
},
{
"style": "declarative",
"nodeType": "nodes-base.slack",
"displayName": "Slack",
"description": "Send messages and interact with Slack",
"category": "Communication",
"properties": [],
"credentials": [
{
"name": "slackApi",
"required": true
}
],
"isAITool": true,
"isTrigger": false,
"isWebhook": false,
"operations": [
{
"name": "Message",
"value": "message",
"operations": [
{
"name": "Send",
"value": "send",
"description": "Send a message to a channel or user"
}
]
}
],
"version": "2.1",
"isVersioned": true,
"packageName": "n8n-nodes-base",
"documentation": "The Slack node allows you to send messages and interact with Slack workspaces."
}
],
"templates": [
{
"id": 1001,
"name": "HTTP to Webhook",
"description": "Fetch data from HTTP and send to webhook",
"workflow": {
"nodes": [
{
"id": "1",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [250, 300],
"parameters": {
"url": "https://api.example.com/data",
"method": "GET"
}
},
{
"id": "2",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [450, 300],
"parameters": {
"path": "data-webhook",
"httpMethod": "POST"
}
}
],
"connections": {
"HTTP Request": {
"main": [[{ "node": "Webhook", "type": "main", "index": 0 }]]
}
}
},
"nodes": [
{ "id": 1, "name": "HTTP Request", "icon": "http" },
{ "id": 2, "name": "Webhook", "icon": "webhook" }
],
"categories": ["Data Processing"],
"user": {
"id": 1,
"name": "Test User",
"username": "testuser",
"verified": false
},
"views": 150,
"createdAt": "2024-01-15T10:00:00Z",
"updatedAt": "2024-01-20T15:30:00Z",
"totalViews": 150
}
]
}