@orchesty/connector-loki 1.0.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 +7 -0
- package/LICENSE +190 -0
- package/coverage/clover.xml +106 -0
- package/coverage/coverage-final.json +4 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +146 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/Batch/LokiGetQueryListBatch.ts.html +799 -0
- package/coverage/lcov-report/src/Batch/index.html +116 -0
- package/coverage/lcov-report/src/LokiApplication.ts.html +364 -0
- package/coverage/lcov-report/src/index.html +116 -0
- package/coverage/lcov-report/test/dataProvider.ts.html +139 -0
- package/coverage/lcov-report/test/index.html +116 -0
- package/coverage/lcov.info +203 -0
- package/dist/Batch/LokiGetQueryListBatch.d.ts +129 -0
- package/dist/Batch/LokiGetQueryListBatch.js +68 -0
- package/dist/LokiApplication.d.ts +21 -0
- package/dist/LokiApplication.js +98 -0
- package/dist/package.json +22 -0
- package/jest.config.js +13 -0
- package/package.json +22 -0
- package/src/Batch/LokiGetQueryListBatch.ts +238 -0
- package/src/Batch/__tests__/Data/LokiGetQueryListBatch/input.json +8 -0
- package/src/Batch/__tests__/Data/LokiGetQueryListBatch/mock.json +259 -0
- package/src/Batch/__tests__/Data/LokiGetQueryListBatch/output.json +43 -0
- package/src/Batch/__tests__/LokiGetQueryListBatch.ts +17 -0
- package/src/LokiApplication.ts +93 -0
- package/test/dataProvider.ts +18 -0
- package/tsconfig.json +8 -0
- package/tsconfig.prod.json +13 -0
- package/tsconfig.prod.tsbuildinfo +1 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.LokiHeaders = exports.URL_KEY = exports.TENANT_KEY = exports.NAME = void 0;
|
|
40
|
+
const CoreFormsEnum_1 = __importStar(require("@orchesty/nodejs-sdk/dist/lib/Application/Base/CoreFormsEnum"));
|
|
41
|
+
const Field_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/Field"));
|
|
42
|
+
const FieldType_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/FieldType"));
|
|
43
|
+
const Form_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/Form"));
|
|
44
|
+
const FormStack_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/FormStack"));
|
|
45
|
+
const ABasicApplication_1 = require("@orchesty/nodejs-sdk/dist/lib/Authorization/Type/Basic/ABasicApplication");
|
|
46
|
+
const RequestDto_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Transport/Curl/RequestDto"));
|
|
47
|
+
const Base64_1 = require("@orchesty/nodejs-sdk/dist/lib/Utils/Base64");
|
|
48
|
+
const Headers_1 = require("@orchesty/nodejs-sdk/dist/lib/Utils/Headers");
|
|
49
|
+
exports.NAME = 'loki';
|
|
50
|
+
exports.TENANT_KEY = 'tenant';
|
|
51
|
+
exports.URL_KEY = 'url';
|
|
52
|
+
var LokiHeaders;
|
|
53
|
+
(function (LokiHeaders) {
|
|
54
|
+
LokiHeaders["TENANT"] = "X-Scope-OrgID";
|
|
55
|
+
})(LokiHeaders || (exports.LokiHeaders = LokiHeaders = {}));
|
|
56
|
+
class LokiApplication extends ABasicApplication_1.ABasicApplication {
|
|
57
|
+
getName() {
|
|
58
|
+
return exports.NAME;
|
|
59
|
+
}
|
|
60
|
+
getDescription() {
|
|
61
|
+
return 'Grafana Loki is a set of open source components that can be composed into a fully featured logging stack. A small index and highly compressed chunks simplifies the operation and significantly lowers the cost of Loki.';
|
|
62
|
+
}
|
|
63
|
+
getPublicName() {
|
|
64
|
+
return 'Loki';
|
|
65
|
+
}
|
|
66
|
+
getLogo() {
|
|
67
|
+
return 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5MCIgaGVpZ2h0PSIxMDQiIHhtbDpzcGFjZT0icHJlc2VydmUiIHZlcnNpb249IjEuMSI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgeTI9Ii0xMC4wMzIyNyIgeDI9Ii0xLjExNjg4IiB5MT0iMy4yMDUxNSIgeDE9IjAuOTIwMTYiIGlkPSJTVkdJRF8xXyI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYWVkMWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjE1YjJiIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCB5Mj0iLTUuODA2NjQiIHgyPSIwLjE0NDEiIHkxPSIzLjI5MTEyIiB4MT0iMC42NTg4OCIgaWQ9IlNWR0lEXzJfIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZhZWQxZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTViMmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IHkyPSItOC42NzU2OSIgeDI9Ii0wLjkwODEzIiB5MT0iNC41NjE3MyIgeDE9IjEuMTI4OTEiIGlkPSJTVkdJRF8zXyI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYWVkMWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjE1YjJiIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCB5Mj0iLTEwLjAzMjg2IiB4Mj0iLTEuMTE3MTEiIHkxPSIzLjIwNDU3IiB4MT0iMC45MTk5MyIgaWQ9IlNWR0lEXzRfIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZhZWQxZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTViMmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IHkyPSItOC42NzU1OCIgeDI9Ii0wLjkwOTY3IiB5MT0iNC41NjE4NCIgeDE9IjEuMTI5NSIgaWQ9IlNWR0lEXzVfIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZhZWQxZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTViMmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IHkyPSItNi43MzkwNyIgeDI9IjAuMDkxNDkiIHkxPSIyLjM1ODY5IiB4MT0iMC42MDYyNyIgaWQ9IlNWR0lEXzZfIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZhZWQxZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTViMmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IHkyPSItMTAuMDMyMzkiIHgyPSItMS4xMTg1MSIgeTE9IjMuMjA1MDQiIHgxPSIwLjkyMDY3IiBpZD0iU1ZHSURfN18iPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmFlZDFlIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2YxNWIyYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgeTI9Ii04LjY3NjE2IiB4Mj0iLTAuOTA3OSIgeTE9IjQuNTYxMjYiIHgxPSIxLjEyOTE0IiBpZD0iU1ZHSURfOF8iPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmFlZDFlIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2YxNWIyYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgeTI9Ii0wLjEyMzkyIiB4Mj0iMC4wMzQxMiIgeTE9IjEuNjcyMjciIHgxPSIxLjM4MzI0IiBpZD0iU1ZHSURfOV8iPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmFlZDFlIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2YxNWIyYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgeTI9Ii0wLjEyNDI5IiB4Mj0iMC4wMjU1MiIgeTE9IjEuNjcyOTQiIHgxPSIxLjM5ODc4IiBpZD0iU1ZHSURfMTBfIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZhZWQxZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTViMmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IHkyPSItMC4xMjQ2MiIgeDI9IjAuMDE4OCIgeTE9IjEuNjczNjEiIHgxPSIxLjQxMTIiIGlkPSJTVkdJRF8xMV8iPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmFlZDFlIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2YxNWIyYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgeTI9Ii0wLjEyNDEzIiB4Mj0iMC4wMjk5MSIgeTE9IjEuNjcyNzgiIHgxPSIxLjM5MTI5IiBpZD0iU1ZHSURfMTJfIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZhZWQxZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTViMmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IHkyPSItMC4xMjM2MSIgeDI9IjAuMDQ0NDciIHkxPSIxLjY3MTUxIiB4MT0iMS4zNjQ0NCIgaWQ9IlNWR0lEXzEzXyI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYWVkMWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjE1YjJiIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCB5Mj0iLTAuMTIzODQiIHgyPSIwLjAzOTciIHkxPSIxLjY3MTkiIHgxPSIxLjM3MzA0IiBpZD0iU1ZHSURfMTRfIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZhZWQxZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTViMmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8Zz4KICA8dGl0bGU+TGF5ZXIgMTwvdGl0bGU+CiAgPGcgaWQ9InN2Z18xIj4KICAgPGcgaWQ9InN2Z18xNSI+CiAgICA8cG9seWdvbiBpZD0ic3ZnXzE2IiBmaWxsPSJ1cmwoI1NWR0lEXzFfKSIgcG9pbnRzPSIyMS4xODk5OTQ4MTIwMTE3Miw5NC4zNTk5OTc1NzA1MTQ2OCAxMi45MDk5OTYwMzI3MTQ4NDQsOTUuNjM5OTk2MzQ5ODExNTUgMTQuMTg5OTk0ODEyMDExNzE5LDEwMy45MjAwMDI3NTg1MDI5NiAyMi40NzAwMDEyMjA3MDMxMjUsMTAyLjY0OTk5ODQ4NjA0MjAyICIvPgogICAgPHBvbHlnb24gaWQ9InN2Z18xNyIgZmlsbD0idXJsKCNTVkdJRF8yXykiIHBvaW50cz0iNTEuMDkwMDAzOTY3Mjg1MTU2LDg0Ljk2OTk5ODE4MDg2NjI0IDg3LjY1MDAwMTUyNTg3ODksNzkuMzQwMDAwOTI3NDQ4MjcgODYuMzcwMDAyNzQ2NTgyMDMsNzEuMDYwMDAyMTQ4MTUxNCA0OS44MTk5OTk2OTQ4MjQyMiw3Ni42Nzk5OTcyNjUzMzg5ICIvPgogICAgPHBvbHlnb24gaWQ9InN2Z18xOCIgZmlsbD0idXJsKCNTVkdJRF8zXykiIHBvaW50cz0iMzYuODQ5OTk4NDc0MTIxMDk0LDc4LjY3OTk5NzI2NTMzODkgMzguMTE5OTk1MTE3MTg3NSw4Ni45NjAwMDM2NzQwMzAzIDQ2LjQwOTk5NjAzMjcxNDg0NCw4NS42ODk5OTk0MDE1NjkzNyA0NS4xMjk5OTcyNTM0MTc5Nyw3Ny4zOTk5OTg0ODYwNDIwMiAiLz4KICAgIDxwb2x5Z29uIGlkPSJzdmdfMTkiIGZpbGw9InVybCgjU1ZHSURfNF8pIiBwb2ludHM9IjM1LjQzOTk5NDgxMjAxMTcyLDEwMC42NDk5OTg0ODYwNDIwMiAzNC4xNTk5OTYwMzI3MTQ4NDQsOTIuMzY5OTk5NzA2NzQ1MTUgMjUuODc5OTk3MjUzNDE3OTcsOTMuNjM5OTk2MzQ5ODExNTUgMjcuMTUwMDAxNTI1ODc4OTA2LDEwMS45Mjk5OTcyNjUzMzg5ICIvPgogICAgPHBvbHlnb24gaWQ9InN2Z18yMCIgZmlsbD0idXJsKCNTVkdJRF81XykiIHBvaW50cz0iMTIuMTg5OTk0ODEyMDExNzE5LDkwLjk1MDAwMTUzNzc5OTg0IDIwLjQ3MDAwMTIyMDcwMzEyNSw4OS42Nzk5OTcyNjUzMzg5IDE5LjE5OTk5Njk0ODI0MjE4OCw4MS4zODk5OTYzNDk4MTE1NSAxMC45MTk5OTgxNjg5NDUzMTIsODIuNjcwMDAyNzU4NTAyOTYgIi8+CiAgICA8cG9seWdvbiBpZD0ic3ZnXzIxIiBmaWxsPSJ1cmwoI1NWR0lEXzZfKSIgcG9pbnRzPSI4OC4zNzAwMDI3NDY1ODIwMyw4NC4wMzAwMDMzNjg4NTQ1MiA1MS44MTAwMDUxODc5ODgyOCw4OS42NDk5OTg0ODYwNDIwMiA1My4wOTAwMDM5NjcyODUxNTYsOTcuOTM5OTk5NDAxNTY5MzcgODkuNjM5OTkxNzYwMjUzOSw5Mi4zMTAwMDIxNDgxNTE0ICIvPgogICAgPHBvbHlnb24gaWQ9InN2Z18yMiIgZmlsbD0idXJsKCNTVkdJRF83XykiIHBvaW50cz0iMzguODQ5OTk4NDc0MTIxMDk0LDkxLjY0OTk5ODQ4NjA0MjAyIDQwLjExOTk5NTExNzE4NzUsOTkuOTI5OTk3MjY1MzM4OSA0OC40MDAwMDE1MjU4Nzg5MDYsOTguNjYwMDAwNjIyMjcyNDkgNDcuMTI5OTk3MjUzNDE3OTcsOTAuMzY5OTk5NzA2NzQ1MTUgIi8+CiAgICA8cG9seWdvbiBpZD0ic3ZnXzIzIiBmaWxsPSJ1cmwoI1NWR0lEXzhfKSIgcG9pbnRzPSIyNS4xNTk5OTYwMzI3MTQ4NDQsODguOTYwMDAzNjc0MDMwMyAzMy40Mzk5OTQ4MTIwMTE3Miw4Ny42Nzk5OTcyNjUzMzg5IDMyLjE2OTk5ODE2ODk0NTMxLDc5LjM5OTk5ODQ4NjA0MjAyIDIzLjg3OTk5NzI1MzQxNzk3LDgwLjY3MDAwMjc1ODUwMjk2ICIvPgogICAgPHBvbHlnb24gaWQ9InN2Z18yNCIgZmlsbD0idXJsKCNTVkdJRF85XykiIHBvaW50cz0iMTAuMTk5OTk2OTQ4MjQyMTg4LDc3Ljk5MDAwMjQ1MzMyNzE4IDEzLjY4OTk5NDgxMjAxMTcxOSw3Ny40NTAwMDE1Mzc3OTk4NCAzLjUsMTEuMTY5OTk5ODk3NDgwMDExIDAsMTEuNzA5OTk5ODU5MzMzMDM4ICIvPgogICAgPHBvbHlnb24gaWQ9InN2Z18yNSIgZmlsbD0idXJsKCNTVkdJRF8xMF8pIiBwb2ludHM9IjE1LDc3LjI0OTk5Njk2MDE2MzEyIDE4LjUsNzYuNzEwMDAzNjc0MDMwMyA3LjU1OTk5NzU1ODU5Mzc1LDUuNTUwMDAwMDExOTIwOTI5IDQuMDU5OTk3NTU4NTkzNzUsNi4wODk5OTk5NzM3NzM5NTYgIi8+CiAgICA8cG9seWdvbiBpZD0ic3ZnXzI2IiBmaWxsPSJ1cmwoI1NWR0lEXzExXykiIHBvaW50cz0iMjMuMjIwMDAxMjIwNzAzMTI1LDc1Ljk4MDAwMDMxNzA5NjcxIDI2LjcwOTk5OTA4NDQ3MjY1Niw3NS40Mzk5OTk0MDE1NjkzNyAxNS4xMTAwMDA2MTAzNTE1NjIsMCAxMS42MTAwMDA2MTAzNTE1NjIsMC41NDAwMDAwMjE0NTc2NzIxICIvPgogICAgPHBvbHlnb24gaWQ9InN2Z18yNyIgZmlsbD0idXJsKCNTVkdJRF8xMl8pIiBwb2ludHM9IjI4LjAxOTk5NjY0MzA2NjQwNiw3NS4yNDAwMDI0NTMzMjcxOCAzMS41MTk5OTY2NDMwNjY0MDYsNzQuNzAwMDAxNTM3Nzk5ODQgMjAuOTM5OTk0ODEyMDExNzIsNS45MTk5OTk4OTc0ODAwMTEgMTcuNDM5OTk0ODEyMDExNzIsNi40NTk5OTk4NTkzMzMwMzggIi8+CiAgICA8cG9seWdvbiBpZD0ic3ZnXzI4IiBmaWxsPSJ1cmwoI1NWR0lEXzEzXykiIHBvaW50cz0iMzYuMTI5OTk3MjUzNDE3OTcsNzMuOTk5OTk2OTYwMTYzMTIgMzkuNjI5OTk3MjUzNDE3OTcsNzMuNDYwMDAzNjc0MDMwMyAzMC4yMjk5OTU3Mjc1MzkwNjIsMTIuMzYwMDAwNDMxNTM3NjI4IDI2LjcyOTk5NTcyNzUzOTA2MiwxMi44OTAwMDAxNjQ1MDg4MiAiLz4KICAgIDxwb2x5Z29uIGlkPSJzdmdfMjkiIGZpbGw9InVybCgjU1ZHSURfMTRfKSIgcG9pbnRzPSI0MC45Mzk5OTQ4MTIwMTE3Miw3My4yNTk5OTkwOTYzOTM1OSA0NC40Mzk5OTQ4MTIwMTE3Miw3Mi43MTk5OTgxODA4NjYyNCAzNC42ODAwMDAzMDUxNzU3OCw5LjI3OTk5OTU1NDE1NzI1NyAzMS4xODAwMDAzMDUxNzU3OCw5LjgxMDAwMDI0MDgwMjc2NSAiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+';
|
|
68
|
+
}
|
|
69
|
+
getFormStack() {
|
|
70
|
+
return new FormStack_1.default().addForm(new Form_1.default(CoreFormsEnum_1.default.AUTHORIZATION_FORM, (0, CoreFormsEnum_1.getFormName)(CoreFormsEnum_1.default.AUTHORIZATION_FORM))
|
|
71
|
+
.addField(new Field_1.default(FieldType_1.default.URL, exports.URL_KEY, 'Url', undefined, true))
|
|
72
|
+
.addField(new Field_1.default(FieldType_1.default.TEXT, exports.TENANT_KEY, 'Tenant', undefined, false))
|
|
73
|
+
.addField(new Field_1.default(FieldType_1.default.TEXT, ABasicApplication_1.USER, 'User', undefined, false))
|
|
74
|
+
.addField(new Field_1.default(FieldType_1.default.TEXT, ABasicApplication_1.PASSWORD, 'Password', undefined, false)));
|
|
75
|
+
}
|
|
76
|
+
getRequestDto(dto, applicationInstall, method, path, data) {
|
|
77
|
+
const { user, password, tenant, url: lokiURL, } = applicationInstall.getSettings()[CoreFormsEnum_1.default.AUTHORIZATION_FORM];
|
|
78
|
+
const url = new URL(path ?? '', lokiURL).href;
|
|
79
|
+
const headers = {
|
|
80
|
+
[Headers_1.CommonHeaders.CONTENT_TYPE]: Headers_1.JSON_TYPE,
|
|
81
|
+
[Headers_1.CommonHeaders.ACCEPT]: Headers_1.JSON_TYPE,
|
|
82
|
+
};
|
|
83
|
+
if (user && password) {
|
|
84
|
+
headers[Headers_1.CommonHeaders.AUTHORIZATION] = `Basic ${(0, Base64_1.encode)(`${user}:${password}`)}`;
|
|
85
|
+
}
|
|
86
|
+
if (tenant) {
|
|
87
|
+
headers[LokiHeaders.TENANT] = tenant;
|
|
88
|
+
}
|
|
89
|
+
const requestDto = new RequestDto_1.default(url, method, dto, data, headers);
|
|
90
|
+
return requestDto;
|
|
91
|
+
}
|
|
92
|
+
isAuthorized(applicationInstall) {
|
|
93
|
+
const authorizationForm = applicationInstall.getSettings()[CoreFormsEnum_1.default.AUTHORIZATION_FORM];
|
|
94
|
+
return (authorizationForm?.[exports.URL_KEY]
|
|
95
|
+
?? (authorizationForm?.[exports.URL_KEY] && authorizationForm?.[ABasicApplication_1.USER] && authorizationForm?.[ABasicApplication_1.PASSWORD]));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.default = LokiApplication;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@orchesty/connector-loki",
|
|
3
|
+
"description": "",
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"url": "https://github.com/Orchesty/orchesty-nodejs-connectors",
|
|
7
|
+
"repository": "https://github.com/Orchesty/orchesty-nodejs-connectors",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "rm -rf dist && rm -rf tsconfig.prod.tsbuildinfo && tsc -d -p tsconfig.prod.json && cp package.json ./dist/package.json",
|
|
10
|
+
"test": "jest --coverage --forceExit --passWithNoTests",
|
|
11
|
+
"lint": "eslint src test --fix",
|
|
12
|
+
"lint-ci": "eslint src test"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [],
|
|
15
|
+
"author": "info@hanaboso.com",
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@orchesty/nodejs-sdk": "^4.3.6"
|
|
18
|
+
},
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=24"
|
|
21
|
+
}
|
|
22
|
+
}
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const baseConfig = require('../../jest.config.js');
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
...baseConfig,
|
|
5
|
+
roots: ["<rootDir>/src"],
|
|
6
|
+
setupFiles: ["<rootDir>/../../.jest/testEnvs.ts"],
|
|
7
|
+
setupFilesAfterEnv: ["<rootDir>/../../.jest/testLifecycle.ts"],
|
|
8
|
+
globalSetup: "<rootDir>/../../.jest/globalSetup.ts",
|
|
9
|
+
moduleNameMapper: {
|
|
10
|
+
"^@orchesty/nodejs-connectors/test/(.*)$": "<rootDir>/../../test/$1",
|
|
11
|
+
"^@orchesty/nodejs-connectors/lib/(.*)$": "<rootDir>/../../lib/$1",
|
|
12
|
+
},
|
|
13
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@orchesty/connector-loki",
|
|
3
|
+
"description": "",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"url": "https://github.com/Orchesty/orchesty-nodejs-connectors",
|
|
7
|
+
"repository": "https://github.com/Orchesty/orchesty-nodejs-connectors",
|
|
8
|
+
"keywords": [],
|
|
9
|
+
"author": "info@hanaboso.com",
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@orchesty/nodejs-sdk": "^4.3.6"
|
|
12
|
+
},
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=24"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "rm -rf dist && rm -rf tsconfig.prod.tsbuildinfo && tsc -d -p tsconfig.prod.json && cp package.json ./dist/package.json",
|
|
18
|
+
"test": "jest --coverage --forceExit --passWithNoTests",
|
|
19
|
+
"lint": "eslint src test --fix",
|
|
20
|
+
"lint-ci": "eslint src test"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import ABatchNode from '@orchesty/nodejs-sdk/dist/lib/Batch/ABatchNode';
|
|
2
|
+
import { HttpMethods } from '@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods';
|
|
3
|
+
import BatchProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/BatchProcessDto';
|
|
4
|
+
import ResultCode from '@orchesty/nodejs-sdk/dist/lib/Utils/ResultCode';
|
|
5
|
+
import { NAME as APPLICATION_NAME } from '../LokiApplication';
|
|
6
|
+
|
|
7
|
+
export const NAME = `${APPLICATION_NAME}-get-query-list-batch`;
|
|
8
|
+
|
|
9
|
+
enum Direction {
|
|
10
|
+
FORWARD = 'forward',
|
|
11
|
+
BACKWARD = 'backward',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default class LokiGetQueryListBatch extends ABatchNode {
|
|
15
|
+
|
|
16
|
+
public getName(): string {
|
|
17
|
+
return NAME;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public async processAction(dto: BatchProcessDto<IInput>): Promise<BatchProcessDto> {
|
|
21
|
+
const boundaryTimestamp = dto.getBatchCursor();
|
|
22
|
+
|
|
23
|
+
const { query, limit, start, end, since, interval, step, direction } = dto.getJsonData();
|
|
24
|
+
|
|
25
|
+
const params = new URLSearchParams({ query });
|
|
26
|
+
|
|
27
|
+
if (start || (boundaryTimestamp && direction === Direction.FORWARD)) {
|
|
28
|
+
params.set('start', (direction === Direction.FORWARD ? boundaryTimestamp || String(start) : String(start)));
|
|
29
|
+
}
|
|
30
|
+
if (end || (boundaryTimestamp && direction !== Direction.FORWARD)) {
|
|
31
|
+
params.set('end', (direction === Direction.FORWARD ? String(end) : boundaryTimestamp || String(end)));
|
|
32
|
+
}
|
|
33
|
+
if (limit) params.set('limit', String(limit));
|
|
34
|
+
if (since) params.set('since', since);
|
|
35
|
+
if (interval) params.set('interval', String(interval));
|
|
36
|
+
if (step) params.set('step', String(step));
|
|
37
|
+
if (direction) params.set('direction', direction);
|
|
38
|
+
|
|
39
|
+
const requestDto = await this.getApplication().getRequestDto(
|
|
40
|
+
dto,
|
|
41
|
+
await this.getApplicationInstallFromProcess(dto),
|
|
42
|
+
HttpMethods.GET,
|
|
43
|
+
`/loki/api/v1/query_range?${params}`,
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
const responseDto = await this.getSender().send<IOutput>(requestDto);
|
|
47
|
+
|
|
48
|
+
const { status, data } = responseDto.getJsonBody();
|
|
49
|
+
|
|
50
|
+
if (status !== 'success') {
|
|
51
|
+
dto.setStopProcess(ResultCode.STOP_AND_FAILED, 'Unexpected error occurred during LogQL query execution');
|
|
52
|
+
return dto;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const items: string[] = [];
|
|
56
|
+
if (data.resultType === 'streams') {
|
|
57
|
+
const result = data.result.flatMap((item) => item.values);
|
|
58
|
+
result.sort((a, b) => (
|
|
59
|
+
direction === Direction.FORWARD
|
|
60
|
+
? Number(a[0]) - Number(b[0])
|
|
61
|
+
: Number(b[0]) - Number(a[0])
|
|
62
|
+
));
|
|
63
|
+
items.push(...result.map((item) => item[1]));
|
|
64
|
+
if (result.length === (limit ?? 100)) {
|
|
65
|
+
const timestamp = Number(result[result.length - 1][0]);
|
|
66
|
+
dto.setBatchCursor(String(timestamp + (direction === Direction.FORWARD ? 1 : -1)));
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
const result = data.result.flatMap((item) => item.values);
|
|
70
|
+
result.sort((a, b) => (direction === Direction.FORWARD ? a[0] - b[0] : b[0] - a[0]));
|
|
71
|
+
items.push(...result.map((item) => item[1]));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return dto.setItemList(items);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
type Duration = `${number}${'ns' | 'us' | 'µs' | 'ms' | 's' | 'm' | 'h'}`;
|
|
80
|
+
|
|
81
|
+
export interface IInput {
|
|
82
|
+
/** LogQL query to retrieve data */
|
|
83
|
+
query: string;
|
|
84
|
+
/**
|
|
85
|
+
* Applied only to `streams` (log lines) response type. Reduces amount of log entries to specified number.
|
|
86
|
+
*
|
|
87
|
+
* - This defaults to 100
|
|
88
|
+
*/
|
|
89
|
+
limit?: number;
|
|
90
|
+
/**
|
|
91
|
+
* The unix epoch timestamp in nanoseconds or unix epoch timestamp in seconds with fractions (for floating point numbers)
|
|
92
|
+
* or string in `RFC3339` format which represents timestamp.
|
|
93
|
+
*
|
|
94
|
+
* - This defaults to 1 hour ago
|
|
95
|
+
*/
|
|
96
|
+
start?: number | string;
|
|
97
|
+
/**
|
|
98
|
+
* The unix epoch timestamp in nanoseconds or unix epoch timestamp in seconds with fractions (for floating point numbers)
|
|
99
|
+
* or string in `RFC3339` format which represents timestamp.
|
|
100
|
+
*
|
|
101
|
+
* - This defaults now
|
|
102
|
+
*/
|
|
103
|
+
end?: number | string;
|
|
104
|
+
/**
|
|
105
|
+
* A duration used to calculate `start` relative to `end`. If `start` is specified, then this value is ignored.
|
|
106
|
+
* If `end` is not specified or targets to future timestamp, then the `start` is calculated relatively to now.
|
|
107
|
+
*
|
|
108
|
+
* - This defaults to 1h
|
|
109
|
+
*/
|
|
110
|
+
since?: Duration;
|
|
111
|
+
/**
|
|
112
|
+
* Applied only to `matrix` response type. Query resolution step width in `duration` format or float number of seconds.
|
|
113
|
+
* The `duration` refers to Prometheus duration strings of the form `[0-9]+[smhdwy]`.
|
|
114
|
+
*
|
|
115
|
+
* - Defaults to a dynamic value based on start and end
|
|
116
|
+
*/
|
|
117
|
+
step?: string | number;
|
|
118
|
+
/**
|
|
119
|
+
* Applied only to `streams` response type. This iterates through logs by specified interval and returns one log entry
|
|
120
|
+
* at time. That means it takes first log entry within `start` then omits other entries until `start` + `interval` boundary
|
|
121
|
+
* is reached. Then repeats the step until `end` of interval.
|
|
122
|
+
*/
|
|
123
|
+
interval?: Duration | number;
|
|
124
|
+
/**
|
|
125
|
+
* Determines the sort order of logs.
|
|
126
|
+
*
|
|
127
|
+
* - This defaults to `backward`
|
|
128
|
+
*/
|
|
129
|
+
direction?: Direction;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export interface IOutput {
|
|
133
|
+
status: string;
|
|
134
|
+
data: ({
|
|
135
|
+
resultType: 'matrix';
|
|
136
|
+
result: {
|
|
137
|
+
metric: Record<string, unknown>;
|
|
138
|
+
values: [number, string][]
|
|
139
|
+
}[];
|
|
140
|
+
} | {
|
|
141
|
+
resultType: 'streams';
|
|
142
|
+
result: {
|
|
143
|
+
stream: Record<string, unknown>;
|
|
144
|
+
values: [string, string][]
|
|
145
|
+
}[];
|
|
146
|
+
}) & { stats: Statistics };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
interface Statistics {
|
|
150
|
+
summary: {
|
|
151
|
+
bytesProcessedPerSecond: number;
|
|
152
|
+
linesProcessedPerSecond: number;
|
|
153
|
+
totalBytesProcessed: number;
|
|
154
|
+
totalLinesProcessed: number;
|
|
155
|
+
execTime: number;
|
|
156
|
+
queueTime: number;
|
|
157
|
+
subqueries: number;
|
|
158
|
+
totalEntriesReturned: number;
|
|
159
|
+
splits: number;
|
|
160
|
+
shards: number;
|
|
161
|
+
totalPostFilterLines: number;
|
|
162
|
+
totalStructuredMetadataBytesProcessed: number;
|
|
163
|
+
};
|
|
164
|
+
querier: {
|
|
165
|
+
store: Store;
|
|
166
|
+
};
|
|
167
|
+
ingester: {
|
|
168
|
+
totalReached: number;
|
|
169
|
+
totalChunksMatched: number;
|
|
170
|
+
totalBatches: number;
|
|
171
|
+
totalLinesSent: number;
|
|
172
|
+
store: Store;
|
|
173
|
+
}
|
|
174
|
+
cache: {
|
|
175
|
+
chunk: CacheStatistic;
|
|
176
|
+
index: CacheStatistic;
|
|
177
|
+
result: CacheStatistic;
|
|
178
|
+
statsResult: CacheStatistic;
|
|
179
|
+
volumeResult: CacheStatistic;
|
|
180
|
+
seriesResult: CacheStatistic;
|
|
181
|
+
labelResult: CacheStatistic;
|
|
182
|
+
instantMetricResult: CacheStatistic;
|
|
183
|
+
};
|
|
184
|
+
index: {
|
|
185
|
+
totalChunks: number;
|
|
186
|
+
postFilterChunks: number;
|
|
187
|
+
shardsDuration: number;
|
|
188
|
+
usedBloomFilters: boolean;
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
interface Store {
|
|
193
|
+
totalChunksRef: number;
|
|
194
|
+
totalChunksDownloaded: number;
|
|
195
|
+
chunksDownloadTime: number;
|
|
196
|
+
queryReferencedStructuredMetadata: boolean;
|
|
197
|
+
queryUsedV2Engine: boolean;
|
|
198
|
+
chunk: {
|
|
199
|
+
headChunkBytes: number;
|
|
200
|
+
headChunkLines: number;
|
|
201
|
+
decompressedBytes: number;
|
|
202
|
+
decompressedLines: number;
|
|
203
|
+
compressedBytes: number;
|
|
204
|
+
totalDuplicates: number;
|
|
205
|
+
postFilterLines: number;
|
|
206
|
+
headChunkStructuredMetadataBytes: number;
|
|
207
|
+
decompressedStructuredMetadataBytes: number;
|
|
208
|
+
};
|
|
209
|
+
chunkRefsFetchTime: number;
|
|
210
|
+
congestionControlLatency: number;
|
|
211
|
+
pipelineWrapperFilteredLines: number;
|
|
212
|
+
dataobj: {
|
|
213
|
+
prePredicateDecompressedRows: number;
|
|
214
|
+
prePredicateDecompressedBytes: number;
|
|
215
|
+
prePredicateDecompressedStructuredMetadataBytes: number;
|
|
216
|
+
postPredicateRows: number;
|
|
217
|
+
postPredicateDecompressedBytes: number;
|
|
218
|
+
postPredicateStructuredMetadataBytes: number;
|
|
219
|
+
postFilterRows: number;
|
|
220
|
+
pagesScanned: number;
|
|
221
|
+
pagesDownloaded: number;
|
|
222
|
+
pagesDownloadedBytes: number;
|
|
223
|
+
pageBatches: number;
|
|
224
|
+
totalRowsAvailable: number;
|
|
225
|
+
totalPageDownloadTime: number;
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
interface CacheStatistic {
|
|
230
|
+
entriesFound: number;
|
|
231
|
+
entriesRequested: number;
|
|
232
|
+
entriesStored: number;
|
|
233
|
+
bytesReceived: number;
|
|
234
|
+
bytesSent: number;
|
|
235
|
+
requests: number;
|
|
236
|
+
downloadTime: number;
|
|
237
|
+
queryLengthServed: number;
|
|
238
|
+
}
|