@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-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 ADDED
@@ -0,0 +1,14 @@
1
+ # @red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki
2
+
3
+ ## 1.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 3e2c3f7: Adding Workflow Logs endpoint. Loki provider added
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [3e2c3f7]
12
+ - Updated dependencies [f1b43c5]
13
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.4.0
14
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.0.0
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # Orchestrator Backend Module for Loki
2
+
3
+ This is an extension module to the `backstage-plugin-orchestrator-backend` plugin. It provides access to the Loki log provider
4
+
5
+ ## Prerequisites
6
+
7
+ Before installing this module, ensure that the Orchestrator backend plugin is integrated into your Backstage instance. Follow the [Orchestrator README](https://github.com/redhat-developer/rhdh-plugins/tree/main/workspaces/orchestrator) for setup instructions.
8
+
9
+ This module also requires a Loki `workflowLogProvider` integration to be configured in your `app-config.yaml`. This will be added to the `orchestrator` section and might look something like this:
10
+
11
+ ```
12
+ orchestrator:
13
+ workflowLogProvider:
14
+ loki:
15
+ baseUrl: http://localhost:3100
16
+ # logStreamSelectors:
17
+ # - label: 'app'
18
+ # value: '=~".+"'
19
+ ```
20
+
21
+ The `baseUrl` is required.
22
+
23
+ Multiple Log Stream Selectors can be specified in the `logStreamSelectors` section. See the loki docs to learn more about log stream selectors and their values: https://grafana.com/docs/loki/latest/query/log_queries/#log-stream-selector
24
+
25
+ ## Installation
26
+
27
+ To install this backend module:
28
+
29
+ ```bash
30
+ # From your root directory
31
+ yarn workspace backend add @red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki
32
+ ```
33
+
34
+ ```ts
35
+ // packages/backend/src/index.ts
36
+ import { createBackend } from '@backstage/backend-defaults';
37
+
38
+ const backend = createBackend();
39
+
40
+ // orchestrator
41
+ backend.add(
42
+ import('@red-hat-developer-hub/backstage-plugin-orchestrator-backend'),
43
+ );
44
+ // orchestrator Log Provider
45
+ backend.add(
46
+ import(
47
+ '@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki'
48
+ ),
49
+ );
50
+
51
+ backend.start();
52
+ ```
53
+
54
+ ## Usage
55
+
56
+ Once the module is successfully setup, a user can view an orchestrator workflows log. This can be accessed by the new backend endpoint here: RHDH_BACK_END_URL/api/orchestrator/v2/workflows/instances/WORKFLOW_INSTANCE_ID/logs
57
+
58
+ Or by clicking the "view log" link on the orchestrator front-end:![alt text](img/view-logs-button.png)
59
+
60
+ ![alt text](img/viewing-log.png)
package/config.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ /*
2
+ * Copyright Red Hat, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ export interface Config {
18
+ /**
19
+ * Configuration for the Orchestrator plugin.
20
+ */
21
+ orchestrator?: {
22
+ workflowLogProvider?: {
23
+ loki?: {
24
+ /**
25
+ * Base URL of the Loki service.
26
+ */
27
+ baseUrl: string;
28
+ logStreamSelectors?: Array<{
29
+ // label is the selector, something like 'app' or 'service_name', etc...
30
+ label: string;
31
+ // value is the label matching operator, so something like: '=~".+"'
32
+ value: string;
33
+ }>;
34
+ };
35
+ };
36
+ };
37
+ }
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var module$1 = require('./module.cjs.js');
6
+
7
+
8
+
9
+ exports.default = module$1.orchestratorModuleLoki;
10
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,11 @@
1
+ import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
+
3
+ /**
4
+
5
+ * Provides access to the Loki log provider for viewing Orchestrator workflow logs
6
+ *
7
+ * @public
8
+ */
9
+ declare const orchestratorModuleLoki: _backstage_backend_plugin_api.BackendFeature;
10
+
11
+ export { orchestratorModuleLoki as default };
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var backstagePluginOrchestratorNode = require('@red-hat-developer-hub/backstage-plugin-orchestrator-node');
5
+ var LokiProvider = require('./workflowLogsProviders/LokiProvider.cjs.js');
6
+
7
+ const orchestratorModuleLoki = backendPluginApi.createBackendModule({
8
+ pluginId: "orchestrator",
9
+ moduleId: "loki",
10
+ register(reg) {
11
+ reg.registerInit({
12
+ deps: {
13
+ config: backendPluginApi.coreServices.rootConfig,
14
+ logger: backendPluginApi.coreServices.logger,
15
+ workflowLogs: backstagePluginOrchestratorNode.workflowLogsExtensionEndpoint
16
+ },
17
+ async init({ config, logger, workflowLogs }) {
18
+ logger.info("Initialize the Loki orchestrator backend module");
19
+ workflowLogs.addWorkflowLogProvider(LokiProvider.LokiProvider.fromConfig(config));
20
+ }
21
+ });
22
+ }
23
+ });
24
+
25
+ exports.orchestratorModuleLoki = orchestratorModuleLoki;
26
+ //# sourceMappingURL=module.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.cjs.js","sources":["../src/module.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { workflowLogsExtensionEndpoint } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node';\nimport { LokiProvider } from './workflowLogsProviders/LokiProvider';\n/**\n\n * Provides access to the Loki log provider for viewing Orchestrator workflow logs\n *\n * @public\n */\nexport const orchestratorModuleLoki = createBackendModule({\n pluginId: 'orchestrator',\n moduleId: 'loki',\n register(reg) {\n reg.registerInit({\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n workflowLogs: workflowLogsExtensionEndpoint,\n },\n async init({ config, logger, workflowLogs }) {\n logger.info('Initialize the Loki orchestrator backend module');\n workflowLogs.addWorkflowLogProvider(LokiProvider.fromConfig(config));\n },\n });\n },\n});\n"],"names":["createBackendModule","coreServices","workflowLogsExtensionEndpoint","LokiProvider"],"mappings":";;;;;;AA2BO,MAAM,yBAAyBA,oCAAA,CAAoB;AAAA,EACxD,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,MAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,QAAQC,6BAAA,CAAa,UAAA;AAAA,QACrB,QAAQA,6BAAA,CAAa,MAAA;AAAA,QACrB,YAAA,EAAcC;AAAA,OAChB;AAAA,MACA,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,EAAQ,cAAa,EAAG;AAC3C,QAAA,MAAA,CAAO,KAAK,iDAAiD,CAAA;AAC7D,QAAA,YAAA,CAAa,sBAAA,CAAuBC,yBAAA,CAAa,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,MACrE;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
@@ -0,0 +1,79 @@
1
+ 'use strict';
2
+
3
+ var luxon = require('luxon');
4
+
5
+ class LokiProvider {
6
+ baseURL;
7
+ selectors;
8
+ constructor(config) {
9
+ this.baseURL = config.getString("baseUrl");
10
+ this.selectors = config.getOptional("logStreamSelectors") || [];
11
+ }
12
+ getBaseURL() {
13
+ return this.baseURL;
14
+ }
15
+ getProviderId() {
16
+ return "loki";
17
+ }
18
+ getSelectors() {
19
+ return this.selectors;
20
+ }
21
+ async fetchWorkflowLogsByInstance(instance) {
22
+ const startTime = luxon.DateTime.fromISO(instance.start, {
23
+ setZone: true
24
+ }).minus({ minutes: 5 }).toISO();
25
+ const endTime = instance.end ? luxon.DateTime.fromISO(instance.end, { setZone: true }).plus({ minutes: 5 }).toISO() : luxon.DateTime.fromISO(instance.start, { setZone: true }).plus({ days: 29 }).toISO();
26
+ const lokiApiEndpoint = "/loki/api/v1/query_range";
27
+ let streamSelector = "";
28
+ if (this.selectors.length < 1) {
29
+ streamSelector = 'service_name=~".+"';
30
+ } else {
31
+ this.selectors.forEach(
32
+ (entry, index, arr) => {
33
+ streamSelector += `${entry.label || "service_name"}${entry.value || '=~".+"'}${index !== arr.length - 1 ? "," : ""}`;
34
+ }
35
+ );
36
+ }
37
+ const logPipelineFilter = `|="${instance.id}"`;
38
+ const params = new URLSearchParams({
39
+ query: `{${streamSelector}} ${logPipelineFilter}`,
40
+ start: startTime,
41
+ end: endTime
42
+ });
43
+ const urlToFetch = `${this.baseURL}${lokiApiEndpoint}?${params.toString()}`;
44
+ let allResults;
45
+ try {
46
+ const response = await fetch(urlToFetch);
47
+ if (!response.ok) {
48
+ throw new Error(await response.text());
49
+ }
50
+ const jsonResponse = await response.json();
51
+ allResults = jsonResponse.data.result.flatMap((val) => {
52
+ return val.values;
53
+ }).map((val) => {
54
+ return {
55
+ id: val[0],
56
+ log: val[1]
57
+ };
58
+ });
59
+ } catch (error) {
60
+ throw new Error(`Problem fetching loki logs: ${error.message}`);
61
+ }
62
+ const workflowLogsResponse = {
63
+ instanceId: instance.id,
64
+ logs: allResults.sort((a, b) => {
65
+ return Number(a.id) - Number(b.id);
66
+ })
67
+ };
68
+ return workflowLogsResponse;
69
+ }
70
+ static fromConfig(config) {
71
+ const lokiConfig = config.getConfig(
72
+ "orchestrator.workflowLogProvider.loki"
73
+ );
74
+ return new LokiProvider(lokiConfig);
75
+ }
76
+ }
77
+
78
+ exports.LokiProvider = LokiProvider;
79
+ //# sourceMappingURL=LokiProvider.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LokiProvider.cjs.js","sources":["../../src/workflowLogsProviders/LokiProvider.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Config } from '@backstage/config';\nimport { DateTime } from 'luxon';\nimport {\n ProcessInstanceDTO,\n WorkflowLogsResponse,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\nimport { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node';\n\nexport class LokiProvider implements WorkflowLogProvider {\n private readonly baseURL: string;\n private readonly selectors: any;\n private constructor(config: Config) {\n this.baseURL = config.getString('baseUrl');\n this.selectors = config.getOptional('logStreamSelectors') || [];\n }\n getBaseURL(): string {\n return this.baseURL;\n }\n\n getProviderId() {\n return 'loki';\n }\n\n getSelectors() {\n return this.selectors;\n }\n\n async fetchWorkflowLogsByInstance(\n instance: ProcessInstanceDTO,\n ): Promise<WorkflowLogsResponse> {\n // Because of timing issues, subtract 5 mintues from the start and add 5 minutes to the end\n const startTime = DateTime.fromISO(instance.start as string, {\n setZone: true,\n })\n .minus({ minutes: 5 })\n .toISO();\n // Loki queries time range can't exceeds the limit (query length: 959h37m33.575s, limit: 30d1h)\n // If there is no end date specified, then just add 29 days to the start date\n // Assume that if there is an end date the range between start and end isn't more than 30 days\n const endTime = instance.end\n ? DateTime.fromISO(instance.end as string, { setZone: true })\n .plus({ minutes: 5 })\n .toISO()\n : DateTime.fromISO(instance.start as string, { setZone: true })\n .plus({ days: 29 })\n .toISO();\n const lokiApiEndpoint = '/loki/api/v1/query_range';\n // Query is created with a log stream selector and then a log pipeline for more filtering\n // format looks like this: {stream-selector=expression} | log pipeline/log filter expression\n // The log stream selector part of the query here is getting all service names\n // This might need to be configurable, based on https://grafana.com/docs/loki/latest/query/log_queries/#log-stream-selector\n // Log pipeline part looks for the workflow instance id in those logs\n // Create the streamSelector\n let streamSelector: string = '';\n if (this.selectors.length < 1) {\n streamSelector = 'service_name=~\".+\"';\n } else {\n this.selectors.forEach(\n (\n entry: { label: any; value: any },\n index: number,\n arr: string | any[],\n ) => {\n // something about that last comma\n streamSelector += `${entry.label || 'service_name'}${entry.value || '=~\".+\"'}${index !== arr.length - 1 ? ',' : ''}`;\n },\n );\n }\n const logPipelineFilter = `|=\"${instance.id}\"`;\n const params = new URLSearchParams({\n query: `{${streamSelector}} ${logPipelineFilter}`,\n start: startTime as string,\n end: endTime as string,\n });\n\n const urlToFetch = `${this.baseURL}${lokiApiEndpoint}?${params.toString()}`;\n\n let allResults;\n try {\n const response = await fetch(urlToFetch);\n if (!response.ok) {\n throw new Error(await response.text());\n }\n\n const jsonResponse = await response.json();\n\n /**\n Data should look like this\n {\n \"instanceId\": \"efe0490f-6300-453b-bcb6-f47eb7efbb36\",\n \"logs\": [\n {\n id: \"1763129443414066000\",\n log: \"2025-11-14 14:08:52,645 d5932f2cb566 INFO [org.kie.kogito.serverless.workflow.devservices.DevModeServerlessWorkflowLogger:40] (executor-thread-97) Starting workflow 'hello_world' (efe0490f-6300-453b-bcb6-f47eb7efbb36)\"\n },\n ...\n ]\n }\n */\n // flatMap and map the results to an array like this:\n /**\n * {\n * id: '123456',\n * log: '2025-11-14 14:08:52,645 d5932f2cb566 INFO [org.kie.kogito.serverless.workflow.devservices.De....'\n * }\n */\n allResults = jsonResponse.data.result\n .flatMap((val: any[]) => {\n return val.values;\n })\n .map((val: any[]) => {\n return {\n id: val[0],\n log: val[1],\n };\n });\n } catch (error) {\n throw new Error(`Problem fetching loki logs: ${error.message}`);\n }\n\n const workflowLogsResponse: WorkflowLogsResponse = {\n instanceId: instance.id,\n logs: allResults.sort((a: { id: number }, b: { id: number }) => {\n return Number(a.id) - Number(b.id);\n }),\n };\n return workflowLogsResponse;\n }\n\n static fromConfig(config: Config): LokiProvider {\n const lokiConfig = config.getConfig(\n 'orchestrator.workflowLogProvider.loki',\n );\n return new LokiProvider(lokiConfig);\n }\n}\n"],"names":["DateTime"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend-module-loki",
3
+ "version": "1.0.0",
4
+ "license": "Apache-2.0",
5
+ "description": "The loki backend module for the orchestrator plugin.",
6
+ "main": "./dist/index.cjs.js",
7
+ "types": "./dist/index.d.ts",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "backstage": {
12
+ "role": "backend-plugin-module",
13
+ "pluginId": "orchestrator",
14
+ "pluginPackage": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend",
15
+ "features": {
16
+ ".": "@backstage/BackendFeature"
17
+ }
18
+ },
19
+ "exports": {
20
+ ".": {
21
+ "backstage": "@backstage/BackendFeature",
22
+ "require": "./dist/index.cjs.js",
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.cjs.js"
25
+ },
26
+ "./package.json": "./package.json"
27
+ },
28
+ "typesVersions": {
29
+ "*": {
30
+ "package.json": [
31
+ "package.json"
32
+ ]
33
+ }
34
+ },
35
+ "scripts": {
36
+ "start": "backstage-cli package start",
37
+ "build": "backstage-cli package build",
38
+ "lint": "backstage-cli package lint",
39
+ "test": "backstage-cli package test",
40
+ "clean": "backstage-cli package clean",
41
+ "prepack": "backstage-cli package prepack",
42
+ "postpack": "backstage-cli package postpack",
43
+ "tsc": "tsc",
44
+ "prettier:check": "prettier --ignore-unknown --check .",
45
+ "prettier:fix": "prettier --ignore-unknown --write ."
46
+ },
47
+ "dependencies": {
48
+ "@backstage/backend-plugin-api": "^1.5.0",
49
+ "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.4.0",
50
+ "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "^1.0.0",
51
+ "luxon": "^3.7.2"
52
+ },
53
+ "devDependencies": {
54
+ "@backstage/backend-test-utils": "^1.10.0",
55
+ "@backstage/cli": "^0.34.5",
56
+ "@backstage/config": "^1.3.6"
57
+ },
58
+ "files": [
59
+ "dist",
60
+ "config.d.ts"
61
+ ],
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "https://github.com/redhat-developer/rhdh-plugins",
65
+ "directory": "workspaces/orchestrator/plugins/orchestrator-backend-module-loki"
66
+ },
67
+ "keywords": [
68
+ "backstage",
69
+ "plugin"
70
+ ],
71
+ "homepage": "https://red.ht/rhdh",
72
+ "bugs": "https://github.com/redhat-developer/rhdh-plugins/issues",
73
+ "author": "Red Hat"
74
+ }