@budibase/server 2.4.11 → 2.4.12-alpha.1
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/builder/assets/{index.83bb8d3b.js → index.72dd0c27.js} +375 -375
- package/builder/assets/{index.b0e3aca6.css → index.af76a09d.css} +2 -2
- package/builder/index.html +2 -2
- package/dist/api/controllers/public/metrics.js +113 -0
- package/dist/api/controllers/row/ExternalRequest.js +10 -2
- package/dist/api/controllers/row/external.js +1 -1
- package/dist/api/routes/public/index.js +8 -0
- package/dist/api/routes/public/metrics.js +30 -0
- package/dist/integrations/base/sql.js +1 -1
- package/dist/integrations/googlesheets.js +14 -3
- package/dist/package.json +7 -6
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/jest.config.ts +1 -0
- package/package.json +8 -7
- package/specs/openapi.json +39 -0
- package/specs/openapi.yaml +169 -0
- package/specs/resources/application.ts +11 -0
- package/specs/resources/index.ts +2 -0
- package/specs/resources/metrics.ts +81 -0
- package/src/api/controllers/public/metrics.ts +251 -0
- package/src/api/controllers/row/ExternalRequest.ts +12 -2
- package/src/api/controllers/row/external.ts +3 -3
- package/src/api/routes/public/index.ts +10 -1
- package/src/api/routes/public/metrics.ts +28 -0
- package/src/api/routes/public/tests/metrics.spec.js +34 -0
- package/src/definitions/openapi.ts +15 -0
- package/src/integrations/base/sql.ts +2 -1
- package/src/integrations/googlesheets.ts +30 -4
- package/tsconfig.json +5 -10
package/builder/index.html
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap"
|
|
11
11
|
rel="stylesheet"
|
|
12
12
|
/>
|
|
13
|
-
<script type="module" crossorigin src="/builder/assets/index.
|
|
14
|
-
<link rel="stylesheet" href="/builder/assets/index.
|
|
13
|
+
<script type="module" crossorigin src="/builder/assets/index.72dd0c27.js"></script>
|
|
14
|
+
<link rel="stylesheet" href="/builder/assets/index.af76a09d.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body id="app">
|
|
17
17
|
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.convertToOpenMetrics = exports.fetch = void 0;
|
|
16
|
+
const backend_core_1 = require("@budibase/backend-core");
|
|
17
|
+
const pro_1 = require("@budibase/pro");
|
|
18
|
+
const os_1 = __importDefault(require("os"));
|
|
19
|
+
function fetch(ctx) {
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
// *** OPERATING SYSTEM ***
|
|
22
|
+
const freeMem = os_1.default.freemem();
|
|
23
|
+
const totalMem = os_1.default.totalmem();
|
|
24
|
+
const usedMem = totalMem - freeMem;
|
|
25
|
+
const uptime = os_1.default.uptime();
|
|
26
|
+
// *** APPS ***
|
|
27
|
+
const allDatabases = yield backend_core_1.db.getAllDbs();
|
|
28
|
+
const devAppIDs = yield backend_core_1.db.getDevAppIDs();
|
|
29
|
+
const prodAppIDs = yield backend_core_1.db.getProdAppIDs();
|
|
30
|
+
const allAppIds = yield backend_core_1.db.getAllApps({ idsOnly: true });
|
|
31
|
+
// *** USERS ***
|
|
32
|
+
const usersObject = yield backend_core_1.users.getAllUserIds();
|
|
33
|
+
// *** QUOTAS ***
|
|
34
|
+
const usage = yield pro_1.quotas.getQuotaUsage();
|
|
35
|
+
const license = yield pro_1.licensing.cache.getCachedLicense();
|
|
36
|
+
const appsQuotaUsage = usage.usageQuota.apps;
|
|
37
|
+
const rowsQuotaUsage = usage.usageQuota.rows;
|
|
38
|
+
const pluginsQuotaUsage = usage.usageQuota.plugins;
|
|
39
|
+
const userGroupsQuotaUsage = usage.usageQuota.userGroups;
|
|
40
|
+
const queryQuotaUsage = usage.monthly.current.queries;
|
|
41
|
+
const automationsQuotaUsage = usage.monthly.current.automations;
|
|
42
|
+
const appsQuotaLimit = license.quotas.usage.static.apps.value;
|
|
43
|
+
const rowsQuotaLimit = license.quotas.usage.static.rows.value;
|
|
44
|
+
const userGroupsQuotaLimit = license.quotas.usage.static.userGroups.value;
|
|
45
|
+
const pluginsQuotaLimit = license.quotas.usage.static.plugins.value;
|
|
46
|
+
const queryQuotaLimit = license.quotas.usage.monthly.queries.value;
|
|
47
|
+
const automationsQuotaLimit = license.quotas.usage.monthly.automations.value;
|
|
48
|
+
// *** BUILD THE OUTPUT STRING ***
|
|
49
|
+
var outputString = "";
|
|
50
|
+
// **** budibase_os_uptime ****
|
|
51
|
+
outputString += convertToOpenMetrics("budibase_os_uptime", "Time in seconds that the host operating system has been up", "counter", uptime);
|
|
52
|
+
// **** budibase_os_free_mem ****
|
|
53
|
+
outputString += convertToOpenMetrics("budibase_os_free_mem", "Bytes of memory free for usage on the host operating system", "gauge", freeMem);
|
|
54
|
+
// **** budibase_os_total_mem ****
|
|
55
|
+
outputString += convertToOpenMetrics("budibase_os_total_mem", "Total bytes of memory on the host operating system", "gauge", totalMem);
|
|
56
|
+
// **** budibase_os_used_mem ****
|
|
57
|
+
outputString += convertToOpenMetrics("budibase_os_used_mem", "Total bytes of memory in use on the host operating system", "gauge", usedMem);
|
|
58
|
+
// **** budibase_os_load1 ****
|
|
59
|
+
outputString += convertToOpenMetrics("budibase_os_load1", "Host operating system load average", "gauge", os_1.default.loadavg()[0]);
|
|
60
|
+
// **** budibase_os_load5 ****
|
|
61
|
+
outputString += convertToOpenMetrics("budibase_os_load5", "Host operating system load average", "gauge", os_1.default.loadavg()[1]);
|
|
62
|
+
// **** budibase_os_load15 ****
|
|
63
|
+
outputString += convertToOpenMetrics("budibase_os_load15", "Host operating system load average", "gauge", os_1.default.loadavg()[2]);
|
|
64
|
+
// **** budibase_tenant_user_count ****
|
|
65
|
+
outputString += convertToOpenMetrics("budibase_tenant_user_count", "The number of users created", "gauge", usersObject.length);
|
|
66
|
+
// **** budibase_tenant_app_count ****
|
|
67
|
+
outputString += convertToOpenMetrics("budibase_tenant_app_count", "The number of apps created by a user", "gauge", allAppIds.length);
|
|
68
|
+
// **** budibase_tenant_production_app_count ****
|
|
69
|
+
outputString += convertToOpenMetrics("budibase_tenant_production_app_count", "The number of apps a user has published", "gauge", prodAppIDs.length);
|
|
70
|
+
// **** budibase_tenant_dev_app_count ****
|
|
71
|
+
outputString += convertToOpenMetrics("budibase_tenant_dev_app_count", "The number of apps a user has unpublished in development", "gauge", devAppIDs.length);
|
|
72
|
+
// **** budibase_tenant_db_count ****
|
|
73
|
+
outputString += convertToOpenMetrics("budibase_tenant_db_count", "The number of couchdb databases including global tables such as _users", "gauge", allDatabases.length);
|
|
74
|
+
// **** budibase_quota_usage_apps ****
|
|
75
|
+
outputString += convertToOpenMetrics("budibase_quota_usage_apps", "The number of apps created", "gauge", appsQuotaUsage);
|
|
76
|
+
// **** budibase_quota_limit_apps ****
|
|
77
|
+
outputString += convertToOpenMetrics("budibase_quota_limit_apps", "The limit on the number of apps that can be created", "gauge", appsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : appsQuotaLimit);
|
|
78
|
+
// **** budibase_quota_usage_rows ****
|
|
79
|
+
outputString += convertToOpenMetrics("budibase_quota_usage_rows", "The number of database rows used from the quota", "gauge", rowsQuotaUsage);
|
|
80
|
+
// **** budibase_quota_limit_rows ****
|
|
81
|
+
outputString += convertToOpenMetrics("budibase_quota_limit_rows", "The limit on the number of rows that can be created", "gauge", rowsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : rowsQuotaLimit);
|
|
82
|
+
// **** budibase_quota_usage_plugins ****
|
|
83
|
+
outputString += convertToOpenMetrics("budibase_quota_usage_plugins", "The number of plugins in use", "gauge", pluginsQuotaUsage);
|
|
84
|
+
// **** budibase_quota_limit_plugins ****
|
|
85
|
+
outputString += convertToOpenMetrics("budibase_quota_limit_plugins", "The limit on the number of plugins that can be created", "gauge", pluginsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : pluginsQuotaLimit);
|
|
86
|
+
// **** budibase_quota_usage_user_groups ****
|
|
87
|
+
outputString += convertToOpenMetrics("budibase_quota_usage_user_groups", "The number of user groups created", "gauge", userGroupsQuotaUsage);
|
|
88
|
+
// **** budibase_quota_limit_user_groups ****
|
|
89
|
+
outputString += convertToOpenMetrics("budibase_quota_limit_user_groups", "The limit on the number of user groups that can be created", "gauge", userGroupsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : userGroupsQuotaLimit);
|
|
90
|
+
// **** budibase_quota_usage_queries ****
|
|
91
|
+
outputString += convertToOpenMetrics("budibase_quota_usage_queries", "The number of queries used in the current month", "gauge", queryQuotaUsage);
|
|
92
|
+
// **** budibase_quota_limit_queries ****
|
|
93
|
+
outputString += convertToOpenMetrics("budibase_quota_limit_queries", "The limit on the number of queries for the current month", "gauge", queryQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : queryQuotaLimit);
|
|
94
|
+
// **** budibase_quota_usage_automations ****
|
|
95
|
+
outputString += convertToOpenMetrics("budibase_quota_usage_automations", "The number of automations used in the current month", "gauge", automationsQuotaUsage);
|
|
96
|
+
// **** budibase_quota_limit_automations ****
|
|
97
|
+
outputString += convertToOpenMetrics("budibase_quota_limit_automations", "The limit on the number of automations that can be created", "gauge", automationsQuotaLimit == -1
|
|
98
|
+
? Number.MAX_SAFE_INTEGER
|
|
99
|
+
: automationsQuotaLimit);
|
|
100
|
+
ctx.body = outputString;
|
|
101
|
+
ctx.set("Content-Type", "text/plain");
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
exports.fetch = fetch;
|
|
105
|
+
function convertToOpenMetrics(metricName, metricHelp, metricType, metricValue) {
|
|
106
|
+
return `# HELP ${metricName} ${metricHelp}.
|
|
107
|
+
# TYPE ${metricName} ${metricType}
|
|
108
|
+
${metricName} ${metricValue}\n`;
|
|
109
|
+
}
|
|
110
|
+
exports.convertToOpenMetrics = convertToOpenMetrics;
|
|
111
|
+
exports.default = {
|
|
112
|
+
fetch,
|
|
113
|
+
};
|
|
@@ -614,8 +614,16 @@ class ExternalRequest {
|
|
|
614
614
|
let { id, row, filters, sort, paginate, rows } = cleanupConfig(config, table);
|
|
615
615
|
//if the sort column is a formula, remove it
|
|
616
616
|
for (let sortColumn of Object.keys(sort || {})) {
|
|
617
|
-
if ((
|
|
618
|
-
|
|
617
|
+
if (!(sort === null || sort === void 0 ? void 0 : sort[sortColumn])) {
|
|
618
|
+
continue;
|
|
619
|
+
}
|
|
620
|
+
switch ((_a = table.schema[sortColumn]) === null || _a === void 0 ? void 0 : _a.type) {
|
|
621
|
+
case types_1.FieldType.FORMULA:
|
|
622
|
+
sort === null || sort === void 0 ? true : delete sort[sortColumn];
|
|
623
|
+
break;
|
|
624
|
+
case types_1.FieldType.NUMBER:
|
|
625
|
+
sort[sortColumn].type = types_1.SortType.number;
|
|
626
|
+
break;
|
|
619
627
|
}
|
|
620
628
|
}
|
|
621
629
|
filters = buildFilters(id, filters || {}, table);
|
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.shutdown = void 0;
|
|
7
7
|
const applications_1 = __importDefault(require("./applications"));
|
|
8
|
+
const metrics_1 = __importDefault(require("./metrics"));
|
|
8
9
|
const queries_1 = __importDefault(require("./queries"));
|
|
9
10
|
const tables_1 = __importDefault(require("./tables"));
|
|
10
11
|
const rows_1 = __importDefault(require("./rows"));
|
|
@@ -86,6 +87,12 @@ function addToRouter(endpoints) {
|
|
|
86
87
|
}
|
|
87
88
|
}
|
|
88
89
|
}
|
|
90
|
+
function applyAdminRoutes(endpoints) {
|
|
91
|
+
addMiddleware(endpoints.read, backend_core_1.middleware.builderOrAdmin);
|
|
92
|
+
addMiddleware(endpoints.write, backend_core_1.middleware.builderOrAdmin);
|
|
93
|
+
addToRouter(endpoints.read);
|
|
94
|
+
addToRouter(endpoints.write);
|
|
95
|
+
}
|
|
89
96
|
function applyRoutes(endpoints, permType, resource, subResource) {
|
|
90
97
|
const paramMiddleware = subResource
|
|
91
98
|
? (0, resourceId_1.paramSubResource)(resource, subResource)
|
|
@@ -107,6 +114,7 @@ function applyRoutes(endpoints, permType, resource, subResource) {
|
|
|
107
114
|
addToRouter(endpoints.read);
|
|
108
115
|
addToRouter(endpoints.write);
|
|
109
116
|
}
|
|
117
|
+
applyAdminRoutes(metrics_1.default);
|
|
110
118
|
applyRoutes(applications_1.default, PermissionType.APP, "appId");
|
|
111
119
|
applyRoutes(tables_1.default, PermissionType.TABLE, "tableId");
|
|
112
120
|
applyRoutes(users_1.default, PermissionType.USER, "userId");
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const metrics_1 = __importDefault(require("../../controllers/public/metrics"));
|
|
7
|
+
const Endpoint_1 = __importDefault(require("./utils/Endpoint"));
|
|
8
|
+
const read = [];
|
|
9
|
+
/**
|
|
10
|
+
* @openapi
|
|
11
|
+
* /metrics:
|
|
12
|
+
* get:
|
|
13
|
+
* operationId: metricsGet
|
|
14
|
+
* summary: Retrieve Budibase tenant metrics
|
|
15
|
+
* description: Output metrics in OpenMetrics format compatible with Prometheus
|
|
16
|
+
* tags:
|
|
17
|
+
* - metrics
|
|
18
|
+
* responses:
|
|
19
|
+
* 200:
|
|
20
|
+
* description: Returns tenant metrics.
|
|
21
|
+
* content:
|
|
22
|
+
* text/plain:
|
|
23
|
+
* schema:
|
|
24
|
+
* type: string
|
|
25
|
+
* examples:
|
|
26
|
+
* metrics:
|
|
27
|
+
* $ref: '#/components/examples/metrics'
|
|
28
|
+
*/
|
|
29
|
+
read.push(new Endpoint_1.default("get", "/metrics", metrics_1.default.fetch));
|
|
30
|
+
exports.default = { read };
|
|
@@ -293,7 +293,7 @@ class InternalBuilder {
|
|
|
293
293
|
const table = (_a = json.meta) === null || _a === void 0 ? void 0 : _a.table;
|
|
294
294
|
if (sort) {
|
|
295
295
|
for (let [key, value] of Object.entries(sort)) {
|
|
296
|
-
const direction = value === types_1.SortDirection.ASCENDING ? "asc" : "desc";
|
|
296
|
+
const direction = value.direction === types_1.SortDirection.ASCENDING ? "asc" : "desc";
|
|
297
297
|
query = query.orderBy(`${table === null || table === void 0 ? void 0 : table.name}.${key}`, direction);
|
|
298
298
|
}
|
|
299
299
|
}
|
|
@@ -19,6 +19,7 @@ const constants_1 = require("../constants");
|
|
|
19
19
|
const google_spreadsheet_1 = require("google-spreadsheet");
|
|
20
20
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
21
21
|
const backend_core_1 = require("@budibase/backend-core");
|
|
22
|
+
const shared_core_1 = require("@budibase/shared-core");
|
|
22
23
|
const SCHEMA = {
|
|
23
24
|
plus: true,
|
|
24
25
|
auth: {
|
|
@@ -196,7 +197,7 @@ class GoogleSheetsIntegration {
|
|
|
196
197
|
const sheet = json.endpoint.entityId;
|
|
197
198
|
const handlers = {
|
|
198
199
|
[constants_1.DataSourceOperation.CREATE]: () => this.create({ sheet, row: json.body }),
|
|
199
|
-
[constants_1.DataSourceOperation.READ]: () => this.read({ sheet }),
|
|
200
|
+
[constants_1.DataSourceOperation.READ]: () => this.read(Object.assign(Object.assign({}, json), { sheet })),
|
|
200
201
|
[constants_1.DataSourceOperation.UPDATE]: () => {
|
|
201
202
|
var _a, _b, _c;
|
|
202
203
|
return this.update({
|
|
@@ -312,11 +313,21 @@ class GoogleSheetsIntegration {
|
|
|
312
313
|
yield this.connect();
|
|
313
314
|
const sheet = this.client.sheetsByTitle[query.sheet];
|
|
314
315
|
const rows = yield sheet.getRows();
|
|
316
|
+
const filtered = shared_core_1.dataFilters.runLuceneQuery(rows, query.filters);
|
|
315
317
|
const headerValues = sheet.headerValues;
|
|
316
|
-
|
|
317
|
-
for (let row of
|
|
318
|
+
let response = [];
|
|
319
|
+
for (let row of filtered) {
|
|
318
320
|
response.push(this.buildRowObject(headerValues, row._rawData, row._rowNumber));
|
|
319
321
|
}
|
|
322
|
+
if (query.sort) {
|
|
323
|
+
if (Object.keys(query.sort).length !== 1) {
|
|
324
|
+
console.warn("Googlesheets does not support multiple sorting", {
|
|
325
|
+
sortInfo: query.sort,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
const [sortField, sortInfo] = Object.entries(query.sort)[0];
|
|
329
|
+
response = shared_core_1.dataFilters.luceneSort(response, sortField, sortInfo.direction, sortInfo.type);
|
|
330
|
+
}
|
|
320
331
|
return response;
|
|
321
332
|
}
|
|
322
333
|
catch (err) {
|
package/dist/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "2.4.
|
|
4
|
+
"version": "2.4.12-alpha.0",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -43,11 +43,12 @@
|
|
|
43
43
|
"license": "GPL-3.0",
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@apidevtools/swagger-parser": "10.0.3",
|
|
46
|
-
"@budibase/backend-core": "
|
|
47
|
-
"@budibase/client": "
|
|
48
|
-
"@budibase/pro": "2.4.
|
|
49
|
-
"@budibase/
|
|
50
|
-
"@budibase/
|
|
46
|
+
"@budibase/backend-core": "2.4.12-alpha.0",
|
|
47
|
+
"@budibase/client": "2.4.12-alpha.0",
|
|
48
|
+
"@budibase/pro": "2.4.12-alpha.0",
|
|
49
|
+
"@budibase/shared-core": "2.4.12-alpha.0",
|
|
50
|
+
"@budibase/string-templates": "2.4.12-alpha.0",
|
|
51
|
+
"@budibase/types": "2.4.12-alpha.0",
|
|
51
52
|
"@bull-board/api": "3.7.0",
|
|
52
53
|
"@bull-board/koa": "3.9.4",
|
|
53
54
|
"@elastic/elasticsearch": "7.10.0",
|