n8n-nodes-parseable 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/LICENSE +661 -0
- package/README.md +134 -0
- package/SECURITY.md +5 -0
- package/dist/credentials/ParseableApi.credentials.d.ts +10 -0
- package/dist/credentials/ParseableApi.credentials.js +65 -0
- package/dist/credentials/ParseableApi.credentials.js.map +1 -0
- package/dist/credentials/parseable.svg +7 -0
- package/dist/nodes/Parseable/Parseable.node.d.ts +11 -0
- package/dist/nodes/Parseable/Parseable.node.js +345 -0
- package/dist/nodes/Parseable/Parseable.node.js.map +1 -0
- package/dist/nodes/Parseable/Parseable.node.json +10 -0
- package/dist/nodes/Parseable/parseable.dark.svg +7 -0
- package/dist/nodes/Parseable/parseable.svg +7 -0
- package/dist/package.json +66 -0
- package/package.json +66 -0
package/README.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# n8n-nodes-parseable
|
|
2
|
+
|
|
3
|
+
Official n8n community node for [Parseable](https://www.parseable.com/), an open source observability data lake.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Query records with SQL.
|
|
8
|
+
- Query metrics with instant or range PromQL.
|
|
9
|
+
- Ingest JSON events into a Parseable dataset.
|
|
10
|
+
- Use separate query and ingestion endpoints for distributed deployments.
|
|
11
|
+
- Authenticate with a Parseable API key.
|
|
12
|
+
- Route requests to an optional Parseable tenant.
|
|
13
|
+
- Use the node as a tool in n8n AI Agent workflows.
|
|
14
|
+
|
|
15
|
+
## Requirements
|
|
16
|
+
|
|
17
|
+
- n8n with community-node support.
|
|
18
|
+
- Node.js 22.21 or newer for local development.
|
|
19
|
+
- A Parseable API key with only the permissions required by the selected operations.
|
|
20
|
+
- Parseable Cloud or Enterprise for PromQL. SQL and JSON ingestion are available without PromQL.
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
After publication, install `n8n-nodes-parseable` from **Settings > Community Nodes** in n8n. Verified versions can also be discovered from the node panel.
|
|
25
|
+
|
|
26
|
+
## Credentials
|
|
27
|
+
|
|
28
|
+
Create **Parseable API** credentials in n8n:
|
|
29
|
+
|
|
30
|
+
| Field | Purpose |
|
|
31
|
+
| --------------- | ------------------------------------------------- |
|
|
32
|
+
| Query Base URL | Parseable endpoint serving SQL and PromQL queries |
|
|
33
|
+
| Ingest Base URL | Parseable endpoint accepting JSON events |
|
|
34
|
+
| API Key | Sent as `Authorization: Bearer <API key>` |
|
|
35
|
+
| Tenant ID | Optional tenant sent as `X-P-Tenant` |
|
|
36
|
+
|
|
37
|
+
For a standalone Parseable deployment, query and ingest URLs are normally identical. Distributed deployments can use different URLs. Do not include endpoint paths such as `/api/v1/query`; the node appends them.
|
|
38
|
+
|
|
39
|
+
The credential test calls `GET /api/v1/logstream` through the query URL. It confirms query-side authentication and reachability. Test ingestion separately before production use.
|
|
40
|
+
|
|
41
|
+
See [API key documentation](https://www.parseable.com/docs/user-guide/api-keys) and [multi-tenancy documentation](https://www.parseable.com/docs/user-guide/multi-tenancy).
|
|
42
|
+
|
|
43
|
+
## Operations
|
|
44
|
+
|
|
45
|
+
### Query Records (SQL)
|
|
46
|
+
|
|
47
|
+
Runs `POST /api/v1/query`. Select a dataset, start time, end time, and SQL query.
|
|
48
|
+
|
|
49
|
+
Use `{{dataset}}` wherever the quoted dataset identifier belongs:
|
|
50
|
+
|
|
51
|
+
```sql
|
|
52
|
+
SELECT *
|
|
53
|
+
FROM {{dataset}}
|
|
54
|
+
WHERE level = 'error'
|
|
55
|
+
ORDER BY p_timestamp DESC
|
|
56
|
+
LIMIT 50
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The node safely quotes the selected dataset. Additional datasets can still be written explicitly for supported cross-dataset queries. Each returned row becomes one n8n output item.
|
|
60
|
+
|
|
61
|
+
### Query Metrics (PromQL)
|
|
62
|
+
|
|
63
|
+
Queries the selected metrics dataset through Parseable's Prometheus-compatible API:
|
|
64
|
+
|
|
65
|
+
- **Instant** uses `GET /prometheus/api/v1/query`.
|
|
66
|
+
- **Range** uses `GET /prometheus/api/v1/query_range` and requires start, end, and step.
|
|
67
|
+
|
|
68
|
+
Example:
|
|
69
|
+
|
|
70
|
+
```promql
|
|
71
|
+
rate(http_requests_total[5m])
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The complete Prometheus response is returned as one n8n item. PromQL requires Parseable Cloud or Enterprise. See [PromQL documentation](https://www.parseable.com/docs/user-guide/promql).
|
|
75
|
+
|
|
76
|
+
### Ingest Events
|
|
77
|
+
|
|
78
|
+
Sends a JSON object or non-empty array of objects to `POST /api/v1/ingest`. The selected dataset is sent as `X-P-Stream`. Parseable can create the dataset on first ingestion when server configuration and API-key permissions allow it.
|
|
79
|
+
|
|
80
|
+
The default event value is current n8n item:
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
{{$json}}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Successful output includes dataset name and ingested event count. This operation is intended for workflow events and records. Use OpenTelemetry collectors for complete n8n platform logs and traces.
|
|
87
|
+
|
|
88
|
+
## Workflow examples
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
Schedule → Parseable SQL query → IF errors exist → Slack
|
|
92
|
+
Webhook → Transform event → Parseable ingest
|
|
93
|
+
AI Agent → Parseable SQL/PromQL tool → Investigation summary
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Execution behavior
|
|
97
|
+
|
|
98
|
+
- Each incoming n8n item is processed independently.
|
|
99
|
+
- Dataset names support n8n expressions, for example `{{$json.dataset}}`.
|
|
100
|
+
- SQL and PromQL requests use Query Base URL; ingestion uses Ingest Base URL.
|
|
101
|
+
- With **Continue On Fail** disabled, invalid parameters or API failures stop execution.
|
|
102
|
+
- With **Continue On Fail** enabled, failures return an item containing `error` and processing continues.
|
|
103
|
+
- URLs must use HTTP or HTTPS and cannot contain embedded credentials, query parameters, or fragments.
|
|
104
|
+
- Empty datasets, invalid time ranges, empty ingestion arrays, and non-object events are rejected before a request is sent.
|
|
105
|
+
|
|
106
|
+
## Permissions
|
|
107
|
+
|
|
108
|
+
Use least-privilege API keys:
|
|
109
|
+
|
|
110
|
+
- Query permission for SQL and PromQL.
|
|
111
|
+
- Ingest permission for event ingestion.
|
|
112
|
+
- Tenant-scoped permissions when multi-tenancy is enabled.
|
|
113
|
+
|
|
114
|
+
Avoid sending passwords, credentials, personal data, or secrets as events.
|
|
115
|
+
|
|
116
|
+
## Development
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
npm ci
|
|
120
|
+
npm test
|
|
121
|
+
npm run lint
|
|
122
|
+
npm run build
|
|
123
|
+
npm pack --dry-run
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Run `npm run dev` to test node in local n8n.
|
|
127
|
+
|
|
128
|
+
## Security
|
|
129
|
+
|
|
130
|
+
See [SECURITY.md](SECURITY.md).
|
|
131
|
+
|
|
132
|
+
## License
|
|
133
|
+
|
|
134
|
+
[GNU Affero General Public License v3.0](LICENSE)
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
Report security vulnerabilities privately to `security@parseable.com`. Do not open a public issue for a suspected vulnerability.
|
|
4
|
+
|
|
5
|
+
Include affected version, reproduction steps, impact, and any suggested mitigation. Never include production API keys or customer data.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IAuthenticate, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
+
export declare class ParseableApi implements ICredentialType {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
icon: "file:parseable.svg";
|
|
6
|
+
documentationUrl: string;
|
|
7
|
+
properties: INodeProperties[];
|
|
8
|
+
authenticate: IAuthenticate;
|
|
9
|
+
test: ICredentialTestRequest;
|
|
10
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ParseableApi = void 0;
|
|
4
|
+
class ParseableApi {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'parseableApi';
|
|
7
|
+
this.displayName = 'Parseable API';
|
|
8
|
+
this.icon = 'file:parseable.svg';
|
|
9
|
+
this.documentationUrl = 'https://www.parseable.com/docs/user-guide/api-keys';
|
|
10
|
+
this.properties = [
|
|
11
|
+
{
|
|
12
|
+
displayName: 'Query Base URL',
|
|
13
|
+
name: 'queryBaseUrl',
|
|
14
|
+
type: 'string',
|
|
15
|
+
default: 'http://localhost:8000',
|
|
16
|
+
placeholder: 'https://query.parseable.example.com',
|
|
17
|
+
description: 'URL serving SQL and PromQL queries',
|
|
18
|
+
required: true,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
displayName: 'Ingest Base URL',
|
|
22
|
+
name: 'ingestBaseUrl',
|
|
23
|
+
type: 'string',
|
|
24
|
+
default: 'http://localhost:8000',
|
|
25
|
+
placeholder: 'https://ingest.parseable.example.com',
|
|
26
|
+
description: 'URL accepting event ingestion',
|
|
27
|
+
required: true,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
displayName: 'API Key',
|
|
31
|
+
name: 'apiKey',
|
|
32
|
+
type: 'string',
|
|
33
|
+
typeOptions: { password: true },
|
|
34
|
+
default: '',
|
|
35
|
+
required: true,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
displayName: 'Tenant ID',
|
|
39
|
+
name: 'tenantId',
|
|
40
|
+
type: 'string',
|
|
41
|
+
default: '',
|
|
42
|
+
description: 'Tenant ID for multi-tenant installations such as Parseable Cloud',
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
this.authenticate = async (credentials, requestOptions) => {
|
|
46
|
+
requestOptions.headers = {
|
|
47
|
+
...requestOptions.headers,
|
|
48
|
+
Authorization: `Bearer ${credentials.apiKey}`,
|
|
49
|
+
};
|
|
50
|
+
if (credentials.tenantId) {
|
|
51
|
+
requestOptions.headers['X-P-Tenant'] = credentials.tenantId;
|
|
52
|
+
}
|
|
53
|
+
return requestOptions;
|
|
54
|
+
};
|
|
55
|
+
this.test = {
|
|
56
|
+
request: {
|
|
57
|
+
baseURL: '={{$credentials.queryBaseUrl.replace(/\\/+$/, "")}}',
|
|
58
|
+
url: '/api/v1/logstream',
|
|
59
|
+
method: 'GET',
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.ParseableApi = ParseableApi;
|
|
65
|
+
//# sourceMappingURL=ParseableApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParseableApi.credentials.js","sourceRoot":"","sources":["../../credentials/ParseableApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,YAAY;IAAzB;QACC,SAAI,GAAG,cAAc,CAAC;QACtB,gBAAW,GAAG,eAAe,CAAC;QAC9B,SAAI,GAAG,oBAA6B,CAAC;QACrC,qBAAgB,GAAG,oDAAoD,CAAC;QACxE,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,gBAAgB;gBAC7B,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,uBAAuB;gBAChC,WAAW,EAAE,qCAAqC;gBAClD,WAAW,EAAE,oCAAoC;gBACjD,QAAQ,EAAE,IAAI;aACd;YACD;gBACC,WAAW,EAAE,iBAAiB;gBAC9B,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,uBAAuB;gBAChC,WAAW,EAAE,sCAAsC;gBACnD,WAAW,EAAE,+BAA+B;gBAC5C,QAAQ,EAAE,IAAI;aACd;YACD;gBACC,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;aACd;YACD;gBACC,WAAW,EAAE,WAAW;gBACxB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,kEAAkE;aAC/E;SACD,CAAC;QACF,iBAAY,GAAkB,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;YACnE,cAAc,CAAC,OAAO,GAAG;gBACxB,GAAG,cAAc,CAAC,OAAO;gBACzB,aAAa,EAAE,UAAU,WAAW,CAAC,MAAgB,EAAE;aACvD,CAAC;YACF,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC1B,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC,QAAkB,CAAC;YACvE,CAAC;YAED,OAAO,cAAc,CAAC;QACvB,CAAC,CAAC;QACF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,qDAAqD;gBAC9D,GAAG,EAAE,mBAAmB;gBACxB,MAAM,EAAE,KAAK;aACb;SACD,CAAC;IACH,CAAC;CAAA;AA1DD,oCA0DC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M382.773 157.268C397.535 142.483 421.487 142.465 436.272 157.227C451.056 171.989 451.074 195.941 436.313 210.725L209.118 438.268C194.356 453.052 170.404 453.07 155.619 438.308C140.835 423.547 140.816 399.594 155.578 384.81L382.773 157.268Z" fill="#17181C"/>
|
|
3
|
+
<path d="M252.088 66.3252C260.324 58.1127 253.929 43.9364 242.382 44.8067C193.082 48.4586 144.758 69.1201 106.893 106.879C69.0268 144.638 48.0602 193.072 43.9897 242.641C43.0212 254.296 57.0531 260.856 65.289 252.598L252.088 66.3252Z" fill="#17181C"/>
|
|
4
|
+
<path d="M445.222 259.741C453.472 251.543 467.744 257.877 466.886 269.356C463.287 318.365 442.574 366.428 404.644 404.123C366.714 441.818 318.018 462.733 268.155 466.854C256.431 467.835 249.809 453.897 258.105 445.699L445.222 259.741Z" fill="#17181C"/>
|
|
5
|
+
<path d="M193.421 287.684L355.277 126.213C373.428 107.827 367.604 77.2794 343.884 66.6349L343.225 66.3675C328.748 59.8827 311.691 63.0294 300.607 74.303L138.937 235.588C124.295 250.418 124.633 274.077 139.692 288.488C154.75 302.899 178.781 302.56 193.422 287.73L193.421 287.684Z" fill="#17181C"/>
|
|
6
|
+
<path d="M135.028 330.482C135.028 350.426 118.477 366.593 98.0599 366.593C77.643 366.593 61.0918 350.426 61.0918 330.482C61.0918 310.538 77.643 294.37 98.0599 294.37C118.477 294.37 135.028 310.538 135.028 330.482Z" fill="#17181C"/>
|
|
7
|
+
</svg>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IDataObject, IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
export declare function normalizeBaseUrl(baseUrl: string): string;
|
|
3
|
+
export declare function isValidBaseUrl(baseUrl: string): boolean;
|
|
4
|
+
export declare function normalizeDataset(dataset: string): string | undefined;
|
|
5
|
+
export declare function normalizeEvents(value: unknown): IDataObject[] | undefined;
|
|
6
|
+
export declare function renderSqlQuery(query: string, dataset: string): string | undefined;
|
|
7
|
+
export declare function isValidTimeRange(start: string, end: string): boolean;
|
|
8
|
+
export declare class Parseable implements INodeType {
|
|
9
|
+
description: INodeTypeDescription;
|
|
10
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Parseable = void 0;
|
|
4
|
+
exports.normalizeBaseUrl = normalizeBaseUrl;
|
|
5
|
+
exports.isValidBaseUrl = isValidBaseUrl;
|
|
6
|
+
exports.normalizeDataset = normalizeDataset;
|
|
7
|
+
exports.normalizeEvents = normalizeEvents;
|
|
8
|
+
exports.renderSqlQuery = renderSqlQuery;
|
|
9
|
+
exports.isValidTimeRange = isValidTimeRange;
|
|
10
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
11
|
+
function normalizeBaseUrl(baseUrl) {
|
|
12
|
+
return baseUrl.replace(/\/+$/, '');
|
|
13
|
+
}
|
|
14
|
+
function isValidBaseUrl(baseUrl) {
|
|
15
|
+
try {
|
|
16
|
+
const url = new URL(baseUrl);
|
|
17
|
+
return ((url.protocol === 'http:' || url.protocol === 'https:') &&
|
|
18
|
+
url.username === '' &&
|
|
19
|
+
url.password === '' &&
|
|
20
|
+
url.search === '' &&
|
|
21
|
+
url.hash === '');
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function normalizeDataset(dataset) {
|
|
28
|
+
const normalized = dataset.trim();
|
|
29
|
+
const containsControlCharacter = [...normalized].some((character) => {
|
|
30
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
31
|
+
return codePoint <= 31 || codePoint === 127;
|
|
32
|
+
});
|
|
33
|
+
return normalized !== '' && !containsControlCharacter ? normalized : undefined;
|
|
34
|
+
}
|
|
35
|
+
function normalizeEvents(value) {
|
|
36
|
+
const isObject = (event) => typeof event === 'object' && event !== null && !Array.isArray(event);
|
|
37
|
+
if (Array.isArray(value)) {
|
|
38
|
+
return value.length > 0 && value.every(isObject) ? value : undefined;
|
|
39
|
+
}
|
|
40
|
+
return isObject(value) ? [value] : undefined;
|
|
41
|
+
}
|
|
42
|
+
function renderSqlQuery(query, dataset) {
|
|
43
|
+
if (!query.includes('{{dataset}}')) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return query.replaceAll('{{dataset}}', `"${dataset.replaceAll('"', '""')}"`);
|
|
47
|
+
}
|
|
48
|
+
function isValidTimeRange(start, end) {
|
|
49
|
+
const startTime = Date.parse(start);
|
|
50
|
+
const endTime = Date.parse(end);
|
|
51
|
+
return Number.isFinite(startTime) && Number.isFinite(endTime) && startTime <= endTime;
|
|
52
|
+
}
|
|
53
|
+
class Parseable {
|
|
54
|
+
constructor() {
|
|
55
|
+
this.description = {
|
|
56
|
+
displayName: 'Parseable',
|
|
57
|
+
name: 'parseable',
|
|
58
|
+
icon: { light: 'file:parseable.svg', dark: 'file:parseable.dark.svg' },
|
|
59
|
+
group: ['input', 'output'],
|
|
60
|
+
version: 1,
|
|
61
|
+
subtitle: '={{$parameter["operation"]}}',
|
|
62
|
+
description: 'Query and ingest observability data with Parseable',
|
|
63
|
+
defaults: { name: 'Parseable' },
|
|
64
|
+
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
65
|
+
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
66
|
+
usableAsTool: true,
|
|
67
|
+
credentials: [{ name: 'parseableApi', required: true }],
|
|
68
|
+
properties: [
|
|
69
|
+
{
|
|
70
|
+
displayName: 'Operation',
|
|
71
|
+
name: 'operation',
|
|
72
|
+
type: 'options',
|
|
73
|
+
noDataExpression: true,
|
|
74
|
+
options: [
|
|
75
|
+
{
|
|
76
|
+
name: 'Ingest Events',
|
|
77
|
+
value: 'ingest',
|
|
78
|
+
description: 'Send JSON events to a dataset',
|
|
79
|
+
action: 'Ingest events',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'Query Metrics (PromQL)',
|
|
83
|
+
value: 'queryPromql',
|
|
84
|
+
description: 'Run a PromQL query (Parseable Cloud and Enterprise)',
|
|
85
|
+
action: 'Query metrics',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'Query Records (SQL)',
|
|
89
|
+
value: 'querySql',
|
|
90
|
+
description: 'Run a SQL query over Parseable data',
|
|
91
|
+
action: 'Query records with SQL',
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
default: 'querySql',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
displayName: 'Dataset Name',
|
|
98
|
+
name: 'dataset',
|
|
99
|
+
type: 'string',
|
|
100
|
+
default: '',
|
|
101
|
+
required: true,
|
|
102
|
+
description: 'Dataset used by the selected operation',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
displayName: 'SQL Query',
|
|
106
|
+
name: 'query',
|
|
107
|
+
type: 'string',
|
|
108
|
+
typeOptions: { rows: 5 },
|
|
109
|
+
default: 'SELECT * FROM {{dataset}} LIMIT 50',
|
|
110
|
+
required: true,
|
|
111
|
+
displayOptions: { show: { operation: ['querySql'] } },
|
|
112
|
+
description: 'SQL query; {{dataset}} is safely replaced with Dataset Name',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
displayName: 'Start Time',
|
|
116
|
+
name: 'startTime',
|
|
117
|
+
type: 'dateTime',
|
|
118
|
+
default: '={{$now.minus({ hours: 1 }).toISO()}}',
|
|
119
|
+
required: true,
|
|
120
|
+
displayOptions: { show: { operation: ['querySql'] } },
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
displayName: 'End Time',
|
|
124
|
+
name: 'endTime',
|
|
125
|
+
type: 'dateTime',
|
|
126
|
+
default: '={{$now.toISO()}}',
|
|
127
|
+
required: true,
|
|
128
|
+
displayOptions: { show: { operation: ['querySql'] } },
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
displayName: 'Query Type',
|
|
132
|
+
name: 'promqlQueryType',
|
|
133
|
+
type: 'options',
|
|
134
|
+
options: [
|
|
135
|
+
{ name: 'Instant', value: 'instant' },
|
|
136
|
+
{ name: 'Range', value: 'range' },
|
|
137
|
+
],
|
|
138
|
+
default: 'range',
|
|
139
|
+
displayOptions: { show: { operation: ['queryPromql'] } },
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
displayName: 'PromQL Query',
|
|
143
|
+
name: 'promqlQuery',
|
|
144
|
+
type: 'string',
|
|
145
|
+
typeOptions: { rows: 3 },
|
|
146
|
+
default: 'rate(http_requests_total[5m])',
|
|
147
|
+
required: true,
|
|
148
|
+
displayOptions: { show: { operation: ['queryPromql'] } },
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
displayName: 'Evaluation Time',
|
|
152
|
+
name: 'promqlTime',
|
|
153
|
+
type: 'dateTime',
|
|
154
|
+
default: '={{$now.toISO()}}',
|
|
155
|
+
displayOptions: {
|
|
156
|
+
show: { operation: ['queryPromql'], promqlQueryType: ['instant'] },
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
displayName: 'Start Time',
|
|
161
|
+
name: 'promqlStart',
|
|
162
|
+
type: 'dateTime',
|
|
163
|
+
default: '={{$now.minus({ hours: 1 }).toISO()}}',
|
|
164
|
+
required: true,
|
|
165
|
+
displayOptions: {
|
|
166
|
+
show: { operation: ['queryPromql'], promqlQueryType: ['range'] },
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
displayName: 'End Time',
|
|
171
|
+
name: 'promqlEnd',
|
|
172
|
+
type: 'dateTime',
|
|
173
|
+
default: '={{$now.toISO()}}',
|
|
174
|
+
required: true,
|
|
175
|
+
displayOptions: {
|
|
176
|
+
show: { operation: ['queryPromql'], promqlQueryType: ['range'] },
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
displayName: 'Step',
|
|
181
|
+
name: 'promqlStep',
|
|
182
|
+
type: 'string',
|
|
183
|
+
default: '1m',
|
|
184
|
+
required: true,
|
|
185
|
+
displayOptions: {
|
|
186
|
+
show: { operation: ['queryPromql'], promqlQueryType: ['range'] },
|
|
187
|
+
},
|
|
188
|
+
description: 'Query resolution, such as 15s, 1m, or 5m',
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
displayName: 'Events',
|
|
192
|
+
name: 'events',
|
|
193
|
+
type: 'json',
|
|
194
|
+
default: '={{$json}}',
|
|
195
|
+
required: true,
|
|
196
|
+
displayOptions: { show: { operation: ['ingest'] } },
|
|
197
|
+
description: 'JSON object or array of objects to ingest',
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
async execute() {
|
|
203
|
+
const items = this.getInputData();
|
|
204
|
+
const returnData = [];
|
|
205
|
+
for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
|
|
206
|
+
try {
|
|
207
|
+
const credentials = await this.getCredentials('parseableApi');
|
|
208
|
+
const rawQueryBaseUrl = credentials.queryBaseUrl;
|
|
209
|
+
const rawIngestBaseUrl = credentials.ingestBaseUrl;
|
|
210
|
+
if (!isValidBaseUrl(rawQueryBaseUrl) || !isValidBaseUrl(rawIngestBaseUrl)) {
|
|
211
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Base URLs must be valid HTTP or HTTPS URLs without credentials, query parameters, or fragments', { itemIndex });
|
|
212
|
+
}
|
|
213
|
+
const queryBaseUrl = normalizeBaseUrl(rawQueryBaseUrl);
|
|
214
|
+
const ingestBaseUrl = normalizeBaseUrl(rawIngestBaseUrl);
|
|
215
|
+
const operation = this.getNodeParameter('operation', itemIndex);
|
|
216
|
+
const dataset = normalizeDataset(this.getNodeParameter('dataset', itemIndex));
|
|
217
|
+
if (!dataset) {
|
|
218
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Dataset Name cannot be empty or contain control characters', {
|
|
219
|
+
itemIndex,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
if (operation === 'querySql') {
|
|
223
|
+
const startTime = this.getNodeParameter('startTime', itemIndex);
|
|
224
|
+
const endTime = this.getNodeParameter('endTime', itemIndex);
|
|
225
|
+
if (!isValidTimeRange(startTime, endTime)) {
|
|
226
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Start Time must be before or equal to End Time', {
|
|
227
|
+
itemIndex,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
const query = renderSqlQuery(this.getNodeParameter('query', itemIndex), dataset);
|
|
231
|
+
if (!query) {
|
|
232
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'SQL Query must include the {{dataset}} placeholder', { itemIndex });
|
|
233
|
+
}
|
|
234
|
+
const response = await this.helpers.httpRequestWithAuthentication.call(this, 'parseableApi', {
|
|
235
|
+
method: 'POST',
|
|
236
|
+
url: `${queryBaseUrl}/api/v1/query`,
|
|
237
|
+
body: {
|
|
238
|
+
query,
|
|
239
|
+
startTime,
|
|
240
|
+
endTime,
|
|
241
|
+
},
|
|
242
|
+
json: true,
|
|
243
|
+
});
|
|
244
|
+
for (const row of Array.isArray(response) ? response : [response])
|
|
245
|
+
returnData.push({
|
|
246
|
+
json: row,
|
|
247
|
+
pairedItem: { item: itemIndex },
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
else if (operation === 'queryPromql') {
|
|
251
|
+
const queryType = this.getNodeParameter('promqlQueryType', itemIndex);
|
|
252
|
+
if (queryType !== 'instant' && queryType !== 'range') {
|
|
253
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unsupported PromQL query type: ${queryType}`, {
|
|
254
|
+
itemIndex,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
const promqlQuery = this.getNodeParameter('promqlQuery', itemIndex).trim();
|
|
258
|
+
if (!promqlQuery) {
|
|
259
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'PromQL Query cannot be empty', {
|
|
260
|
+
itemIndex,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
const qs = {
|
|
264
|
+
query: promqlQuery,
|
|
265
|
+
stream: dataset,
|
|
266
|
+
timestamp_format: 'rfc3339',
|
|
267
|
+
};
|
|
268
|
+
if (queryType === 'instant') {
|
|
269
|
+
const time = this.getNodeParameter('promqlTime', itemIndex);
|
|
270
|
+
if (!Number.isFinite(Date.parse(time))) {
|
|
271
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Evaluation Time must be valid', {
|
|
272
|
+
itemIndex,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
qs.time = time;
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
const start = this.getNodeParameter('promqlStart', itemIndex);
|
|
279
|
+
const end = this.getNodeParameter('promqlEnd', itemIndex);
|
|
280
|
+
if (!isValidTimeRange(start, end)) {
|
|
281
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Start Time must be before or equal to End Time', { itemIndex });
|
|
282
|
+
}
|
|
283
|
+
qs.start = start;
|
|
284
|
+
qs.end = end;
|
|
285
|
+
const step = this.getNodeParameter('promqlStep', itemIndex).trim();
|
|
286
|
+
if (!step) {
|
|
287
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Step cannot be empty', { itemIndex });
|
|
288
|
+
}
|
|
289
|
+
qs.step = step;
|
|
290
|
+
}
|
|
291
|
+
const response = await this.helpers.httpRequestWithAuthentication.call(this, 'parseableApi', {
|
|
292
|
+
method: 'GET',
|
|
293
|
+
url: `${queryBaseUrl}/prometheus/api/v1/${queryType === 'instant' ? 'query' : 'query_range'}`,
|
|
294
|
+
qs,
|
|
295
|
+
json: true,
|
|
296
|
+
});
|
|
297
|
+
returnData.push({
|
|
298
|
+
json: response,
|
|
299
|
+
pairedItem: { item: itemIndex },
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
else if (operation === 'ingest') {
|
|
303
|
+
const events = normalizeEvents(this.getNodeParameter('events', itemIndex));
|
|
304
|
+
if (!events) {
|
|
305
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Events must be a JSON object or a non-empty array of JSON objects', { itemIndex });
|
|
306
|
+
}
|
|
307
|
+
await this.helpers.httpRequestWithAuthentication.call(this, 'parseableApi', {
|
|
308
|
+
method: 'POST',
|
|
309
|
+
url: `${ingestBaseUrl}/api/v1/ingest`,
|
|
310
|
+
headers: { 'X-P-Stream': dataset },
|
|
311
|
+
body: events,
|
|
312
|
+
json: true,
|
|
313
|
+
});
|
|
314
|
+
returnData.push({
|
|
315
|
+
json: { success: true, dataset, eventCount: events.length },
|
|
316
|
+
pairedItem: { item: itemIndex },
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unsupported operation: ${operation}`, {
|
|
321
|
+
itemIndex,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
if (this.continueOnFail()) {
|
|
327
|
+
returnData.push({
|
|
328
|
+
json: {
|
|
329
|
+
error: error instanceof Error ? error.message : String(error),
|
|
330
|
+
},
|
|
331
|
+
pairedItem: { item: itemIndex },
|
|
332
|
+
});
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
if (error instanceof n8n_workflow_1.NodeOperationError) {
|
|
336
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), error.message, { itemIndex });
|
|
337
|
+
}
|
|
338
|
+
throw new n8n_workflow_1.NodeApiError(this.getNode(), error, { itemIndex });
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return [returnData];
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
exports.Parseable = Parseable;
|
|
345
|
+
//# sourceMappingURL=Parseable.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Parseable.node.js","sourceRoot":"","sources":["../../../nodes/Parseable/Parseable.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"node": "n8n-nodes-parseable.parseable",
|
|
3
|
+
"nodeVersion": "1.0",
|
|
4
|
+
"codexVersion": "1.0",
|
|
5
|
+
"categories": ["Development", "Data & Storage"],
|
|
6
|
+
"resources": {
|
|
7
|
+
"credentialDocumentation": [{ "url": "https://www.parseable.com/docs/user-guide/api-keys" }],
|
|
8
|
+
"primaryDocumentation": [{ "url": "https://www.parseable.com/docs/api" }]
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M382.773 157.268C397.535 142.483 421.487 142.465 436.272 157.227C451.056 171.989 451.074 195.941 436.313 210.725L209.118 438.268C194.356 453.052 170.404 453.07 155.619 438.308C140.835 423.547 140.816 399.594 155.578 384.81L382.773 157.268Z" fill="#17181C"/>
|
|
3
|
+
<path d="M252.088 66.3252C260.324 58.1127 253.929 43.9364 242.382 44.8067C193.082 48.4586 144.758 69.1201 106.893 106.879C69.0268 144.638 48.0602 193.072 43.9897 242.641C43.0212 254.296 57.0531 260.856 65.289 252.598L252.088 66.3252Z" fill="#17181C"/>
|
|
4
|
+
<path d="M445.222 259.741C453.472 251.543 467.744 257.877 466.886 269.356C463.287 318.365 442.574 366.428 404.644 404.123C366.714 441.818 318.018 462.733 268.155 466.854C256.431 467.835 249.809 453.897 258.105 445.699L445.222 259.741Z" fill="#17181C"/>
|
|
5
|
+
<path d="M193.421 287.684L355.277 126.213C373.428 107.827 367.604 77.2794 343.884 66.6349L343.225 66.3675C328.748 59.8827 311.691 63.0294 300.607 74.303L138.937 235.588C124.295 250.418 124.633 274.077 139.692 288.488C154.75 302.899 178.781 302.56 193.422 287.73L193.421 287.684Z" fill="#17181C"/>
|
|
6
|
+
<path d="M135.028 330.482C135.028 350.426 118.477 366.593 98.0599 366.593C77.643 366.593 61.0918 350.426 61.0918 330.482C61.0918 310.538 77.643 294.37 98.0599 294.37C118.477 294.37 135.028 310.538 135.028 330.482Z" fill="#17181C"/>
|
|
7
|
+
</svg>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M382.773 157.268C397.535 142.483 421.487 142.465 436.272 157.227C451.056 171.989 451.074 195.941 436.313 210.725L209.118 438.268C194.356 453.052 170.404 453.07 155.619 438.308C140.835 423.547 140.816 399.594 155.578 384.81L382.773 157.268Z" fill="#17181C"/>
|
|
3
|
+
<path d="M252.088 66.3252C260.324 58.1127 253.929 43.9364 242.382 44.8067C193.082 48.4586 144.758 69.1201 106.893 106.879C69.0268 144.638 48.0602 193.072 43.9897 242.641C43.0212 254.296 57.0531 260.856 65.289 252.598L252.088 66.3252Z" fill="#17181C"/>
|
|
4
|
+
<path d="M445.222 259.741C453.472 251.543 467.744 257.877 466.886 269.356C463.287 318.365 442.574 366.428 404.644 404.123C366.714 441.818 318.018 462.733 268.155 466.854C256.431 467.835 249.809 453.897 258.105 445.699L445.222 259.741Z" fill="#17181C"/>
|
|
5
|
+
<path d="M193.421 287.684L355.277 126.213C373.428 107.827 367.604 77.2794 343.884 66.6349L343.225 66.3675C328.748 59.8827 311.691 63.0294 300.607 74.303L138.937 235.588C124.295 250.418 124.633 274.077 139.692 288.488C154.75 302.899 178.781 302.56 193.422 287.73L193.421 287.684Z" fill="#17181C"/>
|
|
6
|
+
<path d="M135.028 330.482C135.028 350.426 118.477 366.593 98.0599 366.593C77.643 366.593 61.0918 350.426 61.0918 330.482C61.0918 310.538 77.643 294.37 98.0599 294.37C118.477 294.37 135.028 310.538 135.028 330.482Z" fill="#17181C"/>
|
|
7
|
+
</svg>
|