@backstage/plugin-catalog-backend-module-incremental-ingestion 0.5.5-next.2 → 0.5.5
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 +18 -0
- package/alpha/package.json +1 -1
- package/dist/alpha.cjs.js +2 -3
- package/dist/alpha.cjs.js.map +1 -1
- package/dist/alpha.d.ts +3 -54
- package/dist/engine/IncrementalIngestionEngine.cjs.js +5 -5
- package/dist/engine/IncrementalIngestionEngine.cjs.js.map +1 -1
- package/dist/index.cjs.js +5 -0
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +57 -2
- package/dist/module/catalogModuleIncrementalIngestionEntityProvider.cjs.js.map +1 -1
- package/dist/service/IncrementalCatalogBuilder.cjs.js +0 -1
- package/dist/service/IncrementalCatalogBuilder.cjs.js.map +1 -1
- package/package.json +13 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @backstage/plugin-catalog-backend-module-incremental-ingestion
|
|
2
2
|
|
|
3
|
+
## 0.5.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 4b60e0c: Remove extension points from `/alpha` export, they're available from the main package already
|
|
8
|
+
- 094eaa3: Remove references to in-repo backend-common
|
|
9
|
+
- 3109c24: The export for the new backend system at the `/alpha` export is now also available via the main entry point, which means that you can remove the `/alpha` suffix from the import.
|
|
10
|
+
- 2107965: Turn down the logging level on most "all is well" type log messages
|
|
11
|
+
- Updated dependencies
|
|
12
|
+
- @backstage/plugin-catalog-backend@1.27.0
|
|
13
|
+
- @backstage/plugin-events-node@0.4.1
|
|
14
|
+
- @backstage/plugin-catalog-node@1.13.1
|
|
15
|
+
- @backstage/backend-plugin-api@1.0.1
|
|
16
|
+
- @backstage/catalog-model@1.7.0
|
|
17
|
+
- @backstage/config@1.2.0
|
|
18
|
+
- @backstage/errors@1.2.4
|
|
19
|
+
- @backstage/plugin-permission-common@0.8.1
|
|
20
|
+
|
|
3
21
|
## 0.5.5-next.2
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
package/alpha/package.json
CHANGED
package/dist/alpha.cjs.js
CHANGED
|
@@ -4,8 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var catalogModuleIncrementalIngestionEntityProvider = require('./module/catalogModuleIncrementalIngestionEntityProvider.cjs.js');
|
|
6
6
|
|
|
7
|
+
const _feature = catalogModuleIncrementalIngestionEntityProvider.catalogModuleIncrementalIngestionEntityProvider;
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
exports.default = catalogModuleIncrementalIngestionEntityProvider.catalogModuleIncrementalIngestionEntityProvider;
|
|
10
|
-
exports.incrementalIngestionProvidersExtensionPoint = catalogModuleIncrementalIngestionEntityProvider.incrementalIngestionProvidersExtensionPoint;
|
|
9
|
+
exports.default = _feature;
|
|
11
10
|
//# sourceMappingURL=alpha.cjs.js.map
|
package/dist/alpha.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"alpha.cjs.js","sources":["../src/alpha.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\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 { default as feature } from './module';\n\n/** @alpha */\nconst _feature = feature;\nexport default _feature;\n"],"names":["feature"],"mappings":";;;;;;AAmBA,MAAM,QAAW,GAAAA;;;;"}
|
package/dist/alpha.d.ts
CHANGED
|
@@ -1,57 +1,6 @@
|
|
|
1
1
|
import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
|
|
2
|
-
import { IncrementalEntityProviderOptions, IncrementalEntityProvider } from '@backstage/plugin-catalog-backend-module-incremental-ingestion';
|
|
3
2
|
|
|
4
|
-
/**
|
|
5
|
-
|
|
6
|
-
* Interface for {@link incrementalIngestionProvidersExtensionPoint}.
|
|
7
|
-
*/
|
|
8
|
-
interface IncrementalIngestionProviderExtensionPoint {
|
|
9
|
-
/** Adds a new incremental entity provider */
|
|
10
|
-
addProvider<TCursor, TContext>(config: {
|
|
11
|
-
options: IncrementalEntityProviderOptions;
|
|
12
|
-
provider: IncrementalEntityProvider<TCursor, TContext>;
|
|
13
|
-
}): void;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* @alpha
|
|
17
|
-
*
|
|
18
|
-
* Extension point for registering incremental ingestion providers.
|
|
19
|
-
* The `catalogModuleIncrementalIngestionEntityProvider` must be installed for these providers to work.
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
*
|
|
23
|
-
* ```ts
|
|
24
|
-
* backend.add(createBackendModule({
|
|
25
|
-
* pluginId: 'catalog',
|
|
26
|
-
* moduleId: 'my-incremental-provider',
|
|
27
|
-
* register(env) {
|
|
28
|
-
* env.registerInit({
|
|
29
|
-
* deps: {
|
|
30
|
-
* extension: incrementalIngestionProvidersExtensionPoint,
|
|
31
|
-
* },
|
|
32
|
-
* async init({ extension }) {
|
|
33
|
-
* extension.addProvider({
|
|
34
|
-
* burstInterval: ...,
|
|
35
|
-
* burstLength: ...,
|
|
36
|
-
* restLength: ...,
|
|
37
|
-
* }, {
|
|
38
|
-
* next(context, cursor) {
|
|
39
|
-
* ...
|
|
40
|
-
* },
|
|
41
|
-
* ...
|
|
42
|
-
* })
|
|
43
|
-
* })
|
|
44
|
-
* })
|
|
45
|
-
* }
|
|
46
|
-
* }))
|
|
47
|
-
* ```
|
|
48
|
-
*/
|
|
49
|
-
declare const incrementalIngestionProvidersExtensionPoint: _backstage_backend_plugin_api.ExtensionPoint<IncrementalIngestionProviderExtensionPoint>;
|
|
50
|
-
/**
|
|
51
|
-
* Registers the incremental entity provider with the catalog processing extension point.
|
|
52
|
-
*
|
|
53
|
-
* @alpha
|
|
54
|
-
*/
|
|
55
|
-
declare const catalogModuleIncrementalIngestionEntityProvider: _backstage_backend_plugin_api.BackendFeature;
|
|
3
|
+
/** @alpha */
|
|
4
|
+
declare const _feature: _backstage_backend_plugin_api.BackendFeature;
|
|
56
5
|
|
|
57
|
-
export {
|
|
6
|
+
export { _feature as default };
|
|
@@ -42,12 +42,12 @@ class IncrementalIngestionEngine {
|
|
|
42
42
|
await this.manager.clearFinishedIngestions(
|
|
43
43
|
this.options.provider.getProviderName()
|
|
44
44
|
);
|
|
45
|
-
this.options.logger.
|
|
45
|
+
this.options.logger.debug(
|
|
46
46
|
`incremental-engine: Ingestion ${ingestionId} rest period complete. Ingestion will start again`
|
|
47
47
|
);
|
|
48
48
|
await this.manager.setProviderComplete(ingestionId);
|
|
49
49
|
} else {
|
|
50
|
-
this.options.logger.
|
|
50
|
+
this.options.logger.debug(
|
|
51
51
|
`incremental-engine: Ingestion '${ingestionId}' rest period continuing`
|
|
52
52
|
);
|
|
53
53
|
}
|
|
@@ -66,7 +66,7 @@ class IncrementalIngestionEngine {
|
|
|
66
66
|
);
|
|
67
67
|
} else {
|
|
68
68
|
await this.manager.setProviderInterstitial(ingestionId);
|
|
69
|
-
this.options.logger.
|
|
69
|
+
this.options.logger.debug(
|
|
70
70
|
`incremental-engine: Ingestion '${ingestionId}' continuing`
|
|
71
71
|
);
|
|
72
72
|
}
|
|
@@ -108,7 +108,7 @@ class IncrementalIngestionEngine {
|
|
|
108
108
|
);
|
|
109
109
|
await this.manager.setProviderIngesting(ingestionId);
|
|
110
110
|
} else {
|
|
111
|
-
this.options.logger.
|
|
111
|
+
this.options.logger.debug(
|
|
112
112
|
`incremental-engine: Ingestion '${ingestionId}' backoff continuing`
|
|
113
113
|
);
|
|
114
114
|
}
|
|
@@ -134,7 +134,7 @@ class IncrementalIngestionEngine {
|
|
|
134
134
|
const providerName = this.options.provider.getProviderName();
|
|
135
135
|
const record = await this.manager.getCurrentIngestionRecord(providerName);
|
|
136
136
|
if (record) {
|
|
137
|
-
this.options.logger.
|
|
137
|
+
this.options.logger.debug(
|
|
138
138
|
`incremental-engine: Ingestion record found: '${record.id}'`
|
|
139
139
|
);
|
|
140
140
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncrementalIngestionEngine.cjs.js","sources":["../../src/engine/IncrementalIngestionEngine.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\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 { DeferredEntity } from '@backstage/plugin-catalog-node';\nimport { IterationEngine, IterationEngineOptions } from '../types';\nimport { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';\nimport { performance } from 'perf_hooks';\nimport { Duration, DurationObjectUnits } from 'luxon';\nimport { v4 } from 'uuid';\nimport { stringifyError } from '@backstage/errors';\nimport { EventParams, EventSubscriber } from '@backstage/plugin-events-node';\n\nexport class IncrementalIngestionEngine\n implements IterationEngine, EventSubscriber\n{\n private readonly restLength: Duration;\n private readonly backoff: DurationObjectUnits[];\n\n private manager: IncrementalIngestionDatabaseManager;\n\n constructor(private options: IterationEngineOptions) {\n this.manager = options.manager;\n this.restLength = Duration.fromObject(options.restLength);\n this.backoff = options.backoff ?? [\n { minutes: 1 },\n { minutes: 5 },\n { minutes: 30 },\n { hours: 3 },\n ];\n }\n\n async taskFn(signal: AbortSignal) {\n try {\n this.options.logger.debug('Begin tick');\n await this.handleNextAction(signal);\n } catch (error) {\n this.options.logger.error(`${error}`);\n throw error;\n } finally {\n this.options.logger.debug('End tick');\n }\n }\n\n async handleNextAction(signal: AbortSignal) {\n await this.options.ready;\n\n const result = await this.getCurrentAction();\n if (result) {\n const { ingestionId, nextActionAt, nextAction, attempts } = result;\n\n switch (nextAction) {\n case 'rest':\n if (Date.now() > nextActionAt) {\n await this.manager.clearFinishedIngestions(\n this.options.provider.getProviderName(),\n );\n this.options.logger.info(\n `incremental-engine: Ingestion ${ingestionId} rest period complete. Ingestion will start again`,\n );\n\n await this.manager.setProviderComplete(ingestionId);\n } else {\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' rest period continuing`,\n );\n }\n break;\n case 'ingest':\n try {\n await this.manager.setProviderBursting(ingestionId);\n const done = await this.ingestOneBurst(ingestionId, signal);\n if (done) {\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' complete, transitioning to rest period of ${this.restLength.toHuman()}`,\n );\n await this.manager.setProviderResting(\n ingestionId,\n this.restLength,\n );\n } else {\n await this.manager.setProviderInterstitial(ingestionId);\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' continuing`,\n );\n }\n } catch (error) {\n if (\n (error as Error).message &&\n (error as Error).message === 'CANCEL'\n ) {\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' canceled`,\n );\n await this.manager.setProviderCanceling(\n ingestionId,\n (error as Error).message,\n );\n } else {\n const currentBackoff = Duration.fromObject(\n this.backoff[Math.min(this.backoff.length - 1, attempts)],\n );\n\n const backoffLength = currentBackoff.as('milliseconds');\n this.options.logger.error(\n `incremental-engine: Ingestion '${ingestionId}' failed`,\n error,\n );\n\n const truncatedError = stringifyError(error).substring(0, 700);\n this.options.logger.error(\n `incremental-engine: Ingestion '${ingestionId}' threw an error during ingestion burst. Ingestion will backoff for ${currentBackoff.toHuman()} (${truncatedError})`,\n );\n\n await this.manager.setProviderBackoff(\n ingestionId,\n attempts,\n error as Error,\n backoffLength,\n );\n }\n }\n break;\n case 'backoff':\n if (Date.now() > nextActionAt) {\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' backoff complete, will attempt to resume`,\n );\n await this.manager.setProviderIngesting(ingestionId);\n } else {\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' backoff continuing`,\n );\n }\n break;\n case 'cancel':\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' canceling, will restart`,\n );\n await this.manager.setProviderCanceled(ingestionId);\n break;\n default:\n this.options.logger.error(\n `incremental-engine: Ingestion '${ingestionId}' received unknown action '${nextAction}'`,\n );\n }\n } else {\n this.options.logger.error(\n `incremental-engine: Engine tried to create duplicate ingestion record for provider '${this.options.provider.getProviderName()}'.`,\n );\n }\n }\n\n async getCurrentAction() {\n const providerName = this.options.provider.getProviderName();\n const record = await this.manager.getCurrentIngestionRecord(providerName);\n if (record) {\n this.options.logger.info(\n `incremental-engine: Ingestion record found: '${record.id}'`,\n );\n return {\n ingestionId: record.id,\n nextAction: record.next_action as 'rest' | 'ingest' | 'backoff',\n attempts: record.attempts as number,\n nextActionAt: record.next_action_at.valueOf() as number,\n };\n }\n const result = await this.manager.createProviderIngestionRecord(\n providerName,\n );\n if (result) {\n this.options.logger.info(\n `incremental-engine: Ingestion record created: '${result.ingestionId}'`,\n );\n }\n return result;\n }\n\n async ingestOneBurst(id: string, signal: AbortSignal) {\n const lastMark = await this.manager.getLastMark(id);\n\n const cursor = lastMark ? lastMark.cursor : undefined;\n let sequence = lastMark ? lastMark.sequence + 1 : 0;\n\n const start = performance.now();\n let count = 0;\n let done = false;\n this.options.logger.info(\n `incremental-engine: Ingestion '${id}' burst initiated`,\n );\n\n await this.options.provider.around(async (context: unknown) => {\n let next = await this.options.provider.next(context, cursor);\n count++;\n for (;;) {\n done = next.done;\n await this.mark({\n id,\n sequence,\n entities: next?.entities,\n done: next.done,\n cursor: next?.cursor,\n });\n if (signal.aborted || next.done) {\n break;\n } else {\n next = await this.options.provider.next(context, next.cursor);\n count++;\n sequence++;\n }\n }\n });\n\n this.options.logger.info(\n `incremental-engine: Ingestion '${id}' burst complete. (${count} batches in ${Math.round(\n performance.now() - start,\n )}ms).`,\n );\n return done;\n }\n\n async mark(options: {\n id: string;\n sequence: number;\n entities?: DeferredEntity[];\n done: boolean;\n cursor?: unknown;\n }) {\n const { id, sequence, entities, done, cursor } = options;\n this.options.logger.debug(\n `incremental-engine: Ingestion '${id}': MARK ${\n entities ? entities.length : 0\n } entities, cursor: ${\n cursor ? JSON.stringify(cursor) : 'none'\n }, done: ${done}`,\n );\n const markId = v4();\n\n await this.manager.createMark({\n record: {\n id: markId,\n ingestion_id: id,\n cursor,\n sequence,\n },\n });\n\n if (entities && entities.length > 0) {\n await this.manager.createMarkEntities(markId, entities);\n }\n\n const added =\n entities?.map(deferred => ({\n ...deferred,\n entity: {\n ...deferred.entity,\n metadata: {\n ...deferred.entity.metadata,\n annotations: {\n ...deferred.entity.metadata.annotations,\n },\n },\n },\n })) ?? [];\n\n const removed: { entityRef: string }[] = [];\n\n if (done) {\n this.options.logger.info(\n `incremental-engine: Ingestion '${id}': Final page reached, calculating removed entities`,\n );\n const result = await this.manager.computeRemoved(\n this.options.provider.getProviderName(),\n id,\n );\n\n const { total } = result;\n\n let doRemoval = true;\n if (this.options.rejectEmptySourceCollections) {\n if (total === 0) {\n this.options.logger.error(\n `incremental-engine: Ingestion '${id}': Rejecting empty entity collection!`,\n );\n doRemoval = false;\n }\n }\n\n if (this.options.rejectRemovalsAbovePercentage) {\n // If the total entities upserted in this ingestion is 0, then\n // 100% of entities are stale and marked for removal.\n const percentRemoved =\n total > 0 ? (result.removed.length / total) * 100 : 100;\n if (percentRemoved <= this.options.rejectRemovalsAbovePercentage) {\n this.options.logger.info(\n `incremental-engine: Ingestion '${id}': Removing ${result.removed.length} entities that have no matching assets`,\n );\n } else {\n const notice = `Attempted to remove ${percentRemoved}% of matching entities!`;\n this.options.logger.error(\n `incremental-engine: Ingestion '${id}': ${notice}`,\n );\n await this.manager.updateIngestionRecordById({\n ingestionId: id,\n update: {\n last_error: `REMOVAL_THRESHOLD exceeded on ingestion mark ${markId}: ${notice}`,\n },\n });\n doRemoval = false;\n }\n }\n if (doRemoval) {\n for (const entityRef of result.removed) {\n removed.push(entityRef);\n }\n }\n }\n\n await this.options.connection.applyMutation({\n type: 'delta',\n added,\n removed,\n });\n }\n\n async onEvent(params: EventParams): Promise<void> {\n const { topic } = params;\n if (!this.supportsEventTopics().includes(topic)) {\n return;\n }\n\n const { logger, provider, connection } = this.options;\n const providerName = provider.getProviderName();\n logger.debug(`incremental-engine: ${providerName} received ${topic} event`);\n\n if (!provider.eventHandler) {\n return;\n }\n\n const result = await provider.eventHandler.onEvent(params);\n\n if (result.type === 'delta') {\n if (result.added.length > 0) {\n const ingestionRecord = await this.manager.getCurrentIngestionRecord(\n providerName,\n );\n\n if (!ingestionRecord) {\n logger.debug(\n `incremental-engine: ${providerName} skipping delta addition because incremental ingestion is restarting.`,\n );\n } else {\n const mark =\n ingestionRecord.status === 'resting'\n ? await this.manager.getLastMark(ingestionRecord.id)\n : await this.manager.getFirstMark(ingestionRecord.id);\n\n if (!mark) {\n throw new Error(\n `Cannot apply delta, page records are missing! Please re-run incremental ingestion for ${providerName}.`,\n );\n }\n await this.manager.createMarkEntities(mark.id, result.added);\n }\n }\n\n if (result.removed.length > 0) {\n await this.manager.deleteEntityRecordsByRef(result.removed);\n }\n\n await connection.applyMutation(result);\n logger.debug(\n `incremental-engine: ${providerName} processed delta from '${topic}' event`,\n );\n } else {\n logger.debug(\n `incremental-engine: ${providerName} ignored event from topic '${topic}'`,\n );\n }\n }\n\n supportsEventTopics(): string[] {\n const { provider } = this.options;\n const topics = provider.eventHandler\n ? provider.eventHandler.supportsEventTopics()\n : [];\n return topics;\n }\n}\n"],"names":["Duration","stringifyError","performance","v4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"IncrementalIngestionEngine.cjs.js","sources":["../../src/engine/IncrementalIngestionEngine.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\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 { DeferredEntity } from '@backstage/plugin-catalog-node';\nimport { IterationEngine, IterationEngineOptions } from '../types';\nimport { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';\nimport { performance } from 'perf_hooks';\nimport { Duration, DurationObjectUnits } from 'luxon';\nimport { v4 } from 'uuid';\nimport { stringifyError } from '@backstage/errors';\nimport { EventParams, EventSubscriber } from '@backstage/plugin-events-node';\n\nexport class IncrementalIngestionEngine\n implements IterationEngine, EventSubscriber\n{\n private readonly restLength: Duration;\n private readonly backoff: DurationObjectUnits[];\n\n private manager: IncrementalIngestionDatabaseManager;\n\n constructor(private options: IterationEngineOptions) {\n this.manager = options.manager;\n this.restLength = Duration.fromObject(options.restLength);\n this.backoff = options.backoff ?? [\n { minutes: 1 },\n { minutes: 5 },\n { minutes: 30 },\n { hours: 3 },\n ];\n }\n\n async taskFn(signal: AbortSignal) {\n try {\n this.options.logger.debug('Begin tick');\n await this.handleNextAction(signal);\n } catch (error) {\n this.options.logger.error(`${error}`);\n throw error;\n } finally {\n this.options.logger.debug('End tick');\n }\n }\n\n async handleNextAction(signal: AbortSignal) {\n await this.options.ready;\n\n const result = await this.getCurrentAction();\n if (result) {\n const { ingestionId, nextActionAt, nextAction, attempts } = result;\n\n switch (nextAction) {\n case 'rest':\n if (Date.now() > nextActionAt) {\n await this.manager.clearFinishedIngestions(\n this.options.provider.getProviderName(),\n );\n this.options.logger.debug(\n `incremental-engine: Ingestion ${ingestionId} rest period complete. Ingestion will start again`,\n );\n\n await this.manager.setProviderComplete(ingestionId);\n } else {\n this.options.logger.debug(\n `incremental-engine: Ingestion '${ingestionId}' rest period continuing`,\n );\n }\n break;\n case 'ingest':\n try {\n await this.manager.setProviderBursting(ingestionId);\n const done = await this.ingestOneBurst(ingestionId, signal);\n if (done) {\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' complete, transitioning to rest period of ${this.restLength.toHuman()}`,\n );\n await this.manager.setProviderResting(\n ingestionId,\n this.restLength,\n );\n } else {\n await this.manager.setProviderInterstitial(ingestionId);\n this.options.logger.debug(\n `incremental-engine: Ingestion '${ingestionId}' continuing`,\n );\n }\n } catch (error) {\n if (\n (error as Error).message &&\n (error as Error).message === 'CANCEL'\n ) {\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' canceled`,\n );\n await this.manager.setProviderCanceling(\n ingestionId,\n (error as Error).message,\n );\n } else {\n const currentBackoff = Duration.fromObject(\n this.backoff[Math.min(this.backoff.length - 1, attempts)],\n );\n\n const backoffLength = currentBackoff.as('milliseconds');\n this.options.logger.error(\n `incremental-engine: Ingestion '${ingestionId}' failed`,\n error,\n );\n\n const truncatedError = stringifyError(error).substring(0, 700);\n this.options.logger.error(\n `incremental-engine: Ingestion '${ingestionId}' threw an error during ingestion burst. Ingestion will backoff for ${currentBackoff.toHuman()} (${truncatedError})`,\n );\n\n await this.manager.setProviderBackoff(\n ingestionId,\n attempts,\n error as Error,\n backoffLength,\n );\n }\n }\n break;\n case 'backoff':\n if (Date.now() > nextActionAt) {\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' backoff complete, will attempt to resume`,\n );\n await this.manager.setProviderIngesting(ingestionId);\n } else {\n this.options.logger.debug(\n `incremental-engine: Ingestion '${ingestionId}' backoff continuing`,\n );\n }\n break;\n case 'cancel':\n this.options.logger.info(\n `incremental-engine: Ingestion '${ingestionId}' canceling, will restart`,\n );\n await this.manager.setProviderCanceled(ingestionId);\n break;\n default:\n this.options.logger.error(\n `incremental-engine: Ingestion '${ingestionId}' received unknown action '${nextAction}'`,\n );\n }\n } else {\n this.options.logger.error(\n `incremental-engine: Engine tried to create duplicate ingestion record for provider '${this.options.provider.getProviderName()}'.`,\n );\n }\n }\n\n async getCurrentAction() {\n const providerName = this.options.provider.getProviderName();\n const record = await this.manager.getCurrentIngestionRecord(providerName);\n if (record) {\n this.options.logger.debug(\n `incremental-engine: Ingestion record found: '${record.id}'`,\n );\n return {\n ingestionId: record.id,\n nextAction: record.next_action as 'rest' | 'ingest' | 'backoff',\n attempts: record.attempts as number,\n nextActionAt: record.next_action_at.valueOf() as number,\n };\n }\n const result = await this.manager.createProviderIngestionRecord(\n providerName,\n );\n if (result) {\n this.options.logger.info(\n `incremental-engine: Ingestion record created: '${result.ingestionId}'`,\n );\n }\n return result;\n }\n\n async ingestOneBurst(id: string, signal: AbortSignal) {\n const lastMark = await this.manager.getLastMark(id);\n\n const cursor = lastMark ? lastMark.cursor : undefined;\n let sequence = lastMark ? lastMark.sequence + 1 : 0;\n\n const start = performance.now();\n let count = 0;\n let done = false;\n this.options.logger.info(\n `incremental-engine: Ingestion '${id}' burst initiated`,\n );\n\n await this.options.provider.around(async (context: unknown) => {\n let next = await this.options.provider.next(context, cursor);\n count++;\n for (;;) {\n done = next.done;\n await this.mark({\n id,\n sequence,\n entities: next?.entities,\n done: next.done,\n cursor: next?.cursor,\n });\n if (signal.aborted || next.done) {\n break;\n } else {\n next = await this.options.provider.next(context, next.cursor);\n count++;\n sequence++;\n }\n }\n });\n\n this.options.logger.info(\n `incremental-engine: Ingestion '${id}' burst complete. (${count} batches in ${Math.round(\n performance.now() - start,\n )}ms).`,\n );\n return done;\n }\n\n async mark(options: {\n id: string;\n sequence: number;\n entities?: DeferredEntity[];\n done: boolean;\n cursor?: unknown;\n }) {\n const { id, sequence, entities, done, cursor } = options;\n this.options.logger.debug(\n `incremental-engine: Ingestion '${id}': MARK ${\n entities ? entities.length : 0\n } entities, cursor: ${\n cursor ? JSON.stringify(cursor) : 'none'\n }, done: ${done}`,\n );\n const markId = v4();\n\n await this.manager.createMark({\n record: {\n id: markId,\n ingestion_id: id,\n cursor,\n sequence,\n },\n });\n\n if (entities && entities.length > 0) {\n await this.manager.createMarkEntities(markId, entities);\n }\n\n const added =\n entities?.map(deferred => ({\n ...deferred,\n entity: {\n ...deferred.entity,\n metadata: {\n ...deferred.entity.metadata,\n annotations: {\n ...deferred.entity.metadata.annotations,\n },\n },\n },\n })) ?? [];\n\n const removed: { entityRef: string }[] = [];\n\n if (done) {\n this.options.logger.info(\n `incremental-engine: Ingestion '${id}': Final page reached, calculating removed entities`,\n );\n const result = await this.manager.computeRemoved(\n this.options.provider.getProviderName(),\n id,\n );\n\n const { total } = result;\n\n let doRemoval = true;\n if (this.options.rejectEmptySourceCollections) {\n if (total === 0) {\n this.options.logger.error(\n `incremental-engine: Ingestion '${id}': Rejecting empty entity collection!`,\n );\n doRemoval = false;\n }\n }\n\n if (this.options.rejectRemovalsAbovePercentage) {\n // If the total entities upserted in this ingestion is 0, then\n // 100% of entities are stale and marked for removal.\n const percentRemoved =\n total > 0 ? (result.removed.length / total) * 100 : 100;\n if (percentRemoved <= this.options.rejectRemovalsAbovePercentage) {\n this.options.logger.info(\n `incremental-engine: Ingestion '${id}': Removing ${result.removed.length} entities that have no matching assets`,\n );\n } else {\n const notice = `Attempted to remove ${percentRemoved}% of matching entities!`;\n this.options.logger.error(\n `incremental-engine: Ingestion '${id}': ${notice}`,\n );\n await this.manager.updateIngestionRecordById({\n ingestionId: id,\n update: {\n last_error: `REMOVAL_THRESHOLD exceeded on ingestion mark ${markId}: ${notice}`,\n },\n });\n doRemoval = false;\n }\n }\n if (doRemoval) {\n for (const entityRef of result.removed) {\n removed.push(entityRef);\n }\n }\n }\n\n await this.options.connection.applyMutation({\n type: 'delta',\n added,\n removed,\n });\n }\n\n async onEvent(params: EventParams): Promise<void> {\n const { topic } = params;\n if (!this.supportsEventTopics().includes(topic)) {\n return;\n }\n\n const { logger, provider, connection } = this.options;\n const providerName = provider.getProviderName();\n logger.debug(`incremental-engine: ${providerName} received ${topic} event`);\n\n if (!provider.eventHandler) {\n return;\n }\n\n const result = await provider.eventHandler.onEvent(params);\n\n if (result.type === 'delta') {\n if (result.added.length > 0) {\n const ingestionRecord = await this.manager.getCurrentIngestionRecord(\n providerName,\n );\n\n if (!ingestionRecord) {\n logger.debug(\n `incremental-engine: ${providerName} skipping delta addition because incremental ingestion is restarting.`,\n );\n } else {\n const mark =\n ingestionRecord.status === 'resting'\n ? await this.manager.getLastMark(ingestionRecord.id)\n : await this.manager.getFirstMark(ingestionRecord.id);\n\n if (!mark) {\n throw new Error(\n `Cannot apply delta, page records are missing! Please re-run incremental ingestion for ${providerName}.`,\n );\n }\n await this.manager.createMarkEntities(mark.id, result.added);\n }\n }\n\n if (result.removed.length > 0) {\n await this.manager.deleteEntityRecordsByRef(result.removed);\n }\n\n await connection.applyMutation(result);\n logger.debug(\n `incremental-engine: ${providerName} processed delta from '${topic}' event`,\n );\n } else {\n logger.debug(\n `incremental-engine: ${providerName} ignored event from topic '${topic}'`,\n );\n }\n }\n\n supportsEventTopics(): string[] {\n const { provider } = this.options;\n const topics = provider.eventHandler\n ? provider.eventHandler.supportsEventTopics()\n : [];\n return topics;\n }\n}\n"],"names":["Duration","stringifyError","performance","v4"],"mappings":"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"}
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var catalogModuleIncrementalIngestionEntityProvider = require('./module/catalogModuleIncrementalIngestionEntityProvider.cjs.js');
|
|
3
6
|
var IncrementalCatalogBuilder = require('./service/IncrementalCatalogBuilder.cjs.js');
|
|
4
7
|
|
|
5
8
|
|
|
6
9
|
|
|
10
|
+
exports.default = catalogModuleIncrementalIngestionEntityProvider.catalogModuleIncrementalIngestionEntityProvider;
|
|
11
|
+
exports.incrementalIngestionProvidersExtensionPoint = catalogModuleIncrementalIngestionEntityProvider.incrementalIngestionProvidersExtensionPoint;
|
|
7
12
|
exports.IncrementalCatalogBuilder = IncrementalCatalogBuilder.IncrementalCatalogBuilder;
|
|
8
13
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
/// <reference types="express" />
|
|
2
|
+
import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
|
|
3
|
+
import { SchedulerService, UrlReaderService } from '@backstage/backend-plugin-api';
|
|
4
|
+
import { IncrementalEntityProviderOptions as IncrementalEntityProviderOptions$1, IncrementalEntityProvider as IncrementalEntityProvider$1 } from '@backstage/plugin-catalog-backend-module-incremental-ingestion';
|
|
2
5
|
import * as express from 'express';
|
|
3
6
|
import { PluginDatabaseManager } from '@backstage/backend-common';
|
|
4
7
|
import { Config } from '@backstage/config';
|
|
@@ -7,9 +10,61 @@ import { EventParams, EventSubscriber } from '@backstage/plugin-events-node';
|
|
|
7
10
|
import { PermissionEvaluator } from '@backstage/plugin-permission-common';
|
|
8
11
|
import { DurationObjectUnits } from 'luxon';
|
|
9
12
|
import { Logger } from 'winston';
|
|
10
|
-
import { SchedulerService, UrlReaderService } from '@backstage/backend-plugin-api';
|
|
11
13
|
import { CatalogBuilder } from '@backstage/plugin-catalog-backend';
|
|
12
14
|
|
|
15
|
+
/**
|
|
16
|
+
* @public
|
|
17
|
+
* Interface for {@link incrementalIngestionProvidersExtensionPoint}.
|
|
18
|
+
*/
|
|
19
|
+
interface IncrementalIngestionProviderExtensionPoint {
|
|
20
|
+
/** Adds a new incremental entity provider */
|
|
21
|
+
addProvider<TCursor, TContext>(config: {
|
|
22
|
+
options: IncrementalEntityProviderOptions$1;
|
|
23
|
+
provider: IncrementalEntityProvider$1<TCursor, TContext>;
|
|
24
|
+
}): void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* @public
|
|
28
|
+
*
|
|
29
|
+
* Extension point for registering incremental ingestion providers.
|
|
30
|
+
* The `catalogModuleIncrementalIngestionEntityProvider` must be installed for these providers to work.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
*
|
|
34
|
+
* ```ts
|
|
35
|
+
* backend.add(createBackendModule({
|
|
36
|
+
* pluginId: 'catalog',
|
|
37
|
+
* moduleId: 'my-incremental-provider',
|
|
38
|
+
* register(env) {
|
|
39
|
+
* env.registerInit({
|
|
40
|
+
* deps: {
|
|
41
|
+
* extension: incrementalIngestionProvidersExtensionPoint,
|
|
42
|
+
* },
|
|
43
|
+
* async init({ extension }) {
|
|
44
|
+
* extension.addProvider({
|
|
45
|
+
* burstInterval: ...,
|
|
46
|
+
* burstLength: ...,
|
|
47
|
+
* restLength: ...,
|
|
48
|
+
* }, {
|
|
49
|
+
* next(context, cursor) {
|
|
50
|
+
* ...
|
|
51
|
+
* },
|
|
52
|
+
* ...
|
|
53
|
+
* })
|
|
54
|
+
* })
|
|
55
|
+
* })
|
|
56
|
+
* }
|
|
57
|
+
* }))
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
declare const incrementalIngestionProvidersExtensionPoint: _backstage_backend_plugin_api.ExtensionPoint<IncrementalIngestionProviderExtensionPoint>;
|
|
61
|
+
/**
|
|
62
|
+
* Registers the incremental entity provider with the catalog processing extension point.
|
|
63
|
+
*
|
|
64
|
+
* @public
|
|
65
|
+
*/
|
|
66
|
+
declare const catalogModuleIncrementalIngestionEntityProvider: _backstage_backend_plugin_api.BackendFeature;
|
|
67
|
+
|
|
13
68
|
/**
|
|
14
69
|
* Ingest entities into the catalog in bite-sized chunks.
|
|
15
70
|
*
|
|
@@ -175,4 +230,4 @@ declare class IncrementalCatalogBuilder {
|
|
|
175
230
|
addIncrementalEntityProvider<TCursor, TContext>(provider: IncrementalEntityProvider<TCursor, TContext>, options: IncrementalEntityProviderOptions): EventSubscriber;
|
|
176
231
|
}
|
|
177
232
|
|
|
178
|
-
export { type EntityIteratorResult, IncrementalCatalogBuilder, type IncrementalEntityEventResult, type IncrementalEntityProvider, type IncrementalEntityProviderOptions, type PluginEnvironment };
|
|
233
|
+
export { type EntityIteratorResult, IncrementalCatalogBuilder, type IncrementalEntityEventResult, type IncrementalEntityProvider, type IncrementalEntityProviderOptions, type IncrementalIngestionProviderExtensionPoint, type PluginEnvironment, catalogModuleIncrementalIngestionEntityProvider as default, incrementalIngestionProvidersExtensionPoint };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogModuleIncrementalIngestionEntityProvider.cjs.js","sources":["../../src/module/catalogModuleIncrementalIngestionEntityProvider.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\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 {\n coreServices,\n createBackendModule,\n createExtensionPoint,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\nimport {\n IncrementalEntityProvider,\n IncrementalEntityProviderOptions,\n} from '@backstage/plugin-catalog-backend-module-incremental-ingestion';\nimport { WrapperProviders } from './WrapperProviders';\n\n/**\n * @
|
|
1
|
+
{"version":3,"file":"catalogModuleIncrementalIngestionEntityProvider.cjs.js","sources":["../../src/module/catalogModuleIncrementalIngestionEntityProvider.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\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 {\n coreServices,\n createBackendModule,\n createExtensionPoint,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\nimport {\n IncrementalEntityProvider,\n IncrementalEntityProviderOptions,\n} from '@backstage/plugin-catalog-backend-module-incremental-ingestion';\nimport { WrapperProviders } from './WrapperProviders';\n\n/**\n * @public\n * Interface for {@link incrementalIngestionProvidersExtensionPoint}.\n */\nexport interface IncrementalIngestionProviderExtensionPoint {\n /** Adds a new incremental entity provider */\n addProvider<TCursor, TContext>(config: {\n options: IncrementalEntityProviderOptions;\n provider: IncrementalEntityProvider<TCursor, TContext>;\n }): void;\n}\n\n/**\n * @public\n *\n * Extension point for registering incremental ingestion providers.\n * The `catalogModuleIncrementalIngestionEntityProvider` must be installed for these providers to work.\n *\n * @example\n *\n * ```ts\n * backend.add(createBackendModule({\n * pluginId: 'catalog',\n * moduleId: 'my-incremental-provider',\n * register(env) {\n * env.registerInit({\n * deps: {\n * extension: incrementalIngestionProvidersExtensionPoint,\n * },\n * async init({ extension }) {\n * extension.addProvider({\n * burstInterval: ...,\n * burstLength: ...,\n * restLength: ...,\n * }, {\n * next(context, cursor) {\n * ...\n * },\n * ...\n * })\n * })\n * })\n * }\n * }))\n * ```\n */\nexport const incrementalIngestionProvidersExtensionPoint =\n createExtensionPoint<IncrementalIngestionProviderExtensionPoint>({\n id: 'catalog.incrementalIngestionProvider.providers',\n });\n\n/**\n * Registers the incremental entity provider with the catalog processing extension point.\n *\n * @public\n */\nexport const catalogModuleIncrementalIngestionEntityProvider =\n createBackendModule({\n pluginId: 'catalog',\n moduleId: 'incremental-ingestion-entity-provider',\n register(env) {\n const addedProviders = new Array<{\n provider: IncrementalEntityProvider<unknown, unknown>;\n options: IncrementalEntityProviderOptions;\n }>();\n\n env.registerExtensionPoint(incrementalIngestionProvidersExtensionPoint, {\n addProvider({ options, provider }) {\n addedProviders.push({ options, provider });\n },\n });\n\n env.registerInit({\n deps: {\n catalog: catalogProcessingExtensionPoint,\n config: coreServices.rootConfig,\n database: coreServices.database,\n httpRouter: coreServices.httpRouter,\n logger: coreServices.logger,\n scheduler: coreServices.scheduler,\n },\n async init({\n catalog,\n config,\n database,\n httpRouter,\n logger,\n scheduler,\n }) {\n const client = await database.getClient();\n\n const providers = new WrapperProviders({\n config,\n logger,\n client,\n scheduler,\n });\n\n for (const entry of addedProviders) {\n const wrapped = providers.wrap(entry.provider, entry.options);\n catalog.addEntityProvider(wrapped);\n }\n\n httpRouter.use(await providers.adminRouter());\n },\n });\n },\n });\n"],"names":["createExtensionPoint","createBackendModule","catalogProcessingExtensionPoint","coreServices","WrapperProviders"],"mappings":";;;;;;AA0EO,MAAM,8CACXA,qCAAiE,CAAA;AAAA,EAC/D,EAAI,EAAA,gDAAA;AACN,CAAC,EAAA;AAOI,MAAM,kDACXC,oCAAoB,CAAA;AAAA,EAClB,QAAU,EAAA,SAAA;AAAA,EACV,QAAU,EAAA,uCAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAM,MAAA,cAAA,GAAiB,IAAI,KAGxB,EAAA,CAAA;AAEH,IAAA,GAAA,CAAI,uBAAuB,2CAA6C,EAAA;AAAA,MACtE,WAAY,CAAA,EAAE,OAAS,EAAA,QAAA,EAAY,EAAA;AACjC,QAAA,cAAA,CAAe,IAAK,CAAA,EAAE,OAAS,EAAA,QAAA,EAAU,CAAA,CAAA;AAAA,OAC3C;AAAA,KACD,CAAA,CAAA;AAED,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,OAAS,EAAAC,qCAAA;AAAA,QACT,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,UAAUA,6BAAa,CAAA,QAAA;AAAA,QACvB,YAAYA,6BAAa,CAAA,UAAA;AAAA,QACzB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,WAAWA,6BAAa,CAAA,SAAA;AAAA,OAC1B;AAAA,MACA,MAAM,IAAK,CAAA;AAAA,QACT,OAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA;AAAA,OACC,EAAA;AACD,QAAM,MAAA,MAAA,GAAS,MAAM,QAAA,CAAS,SAAU,EAAA,CAAA;AAExC,QAAM,MAAA,SAAA,GAAY,IAAIC,iCAAiB,CAAA;AAAA,UACrC,MAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA,SAAA;AAAA,SACD,CAAA,CAAA;AAED,QAAA,KAAA,MAAW,SAAS,cAAgB,EAAA;AAClC,UAAA,MAAM,UAAU,SAAU,CAAA,IAAA,CAAK,KAAM,CAAA,QAAA,EAAU,MAAM,OAAO,CAAA,CAAA;AAC5D,UAAA,OAAA,CAAQ,kBAAkB,OAAO,CAAA,CAAA;AAAA,SACnC;AAEA,QAAA,UAAA,CAAW,GAAI,CAAA,MAAM,SAAU,CAAA,WAAA,EAAa,CAAA,CAAA;AAAA,OAC9C;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncrementalCatalogBuilder.cjs.js","sources":["../../src/service/IncrementalCatalogBuilder.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\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 {\n IncrementalEntityProvider,\n IncrementalEntityProviderOptions,\n PluginEnvironment,\n} from '../types';\nimport { CatalogBuilder as CoreCatalogBuilder } from '@backstage/plugin-catalog-backend';\nimport { Duration } from 'luxon';\nimport { Knex } from 'knex';\nimport { IncrementalIngestionEngine } from '../engine/IncrementalIngestionEngine';\nimport { applyDatabaseMigrations } from '../database/migrations';\nimport { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';\nimport { IncrementalProviderRouter } from '../router/routes';\nimport { Deferred } from '../util';\nimport { EventParams, EventSubscriber } from '@backstage/plugin-events-node';\n\n/** @public */\nexport class IncrementalCatalogBuilder {\n /**\n * Creates the incremental catalog builder, which extends the regular catalog builder.\n * @param env - PluginEnvironment\n * @param builder - CatalogBuilder\n * @returns IncrementalCatalogBuilder\n */\n static async create(env: PluginEnvironment, builder: CoreCatalogBuilder) {\n const client = await env.database.getClient();\n const manager = new IncrementalIngestionDatabaseManager({ client });\n return new IncrementalCatalogBuilder(env, builder, client, manager);\n }\n\n private ready: Deferred<void>;\n\n private constructor(\n private env: PluginEnvironment,\n private builder: CoreCatalogBuilder,\n private client: Knex,\n private manager: IncrementalIngestionDatabaseManager,\n ) {\n this.ready = new Deferred<void>();\n }\n\n async build() {\n await applyDatabaseMigrations(this.client);\n this.ready.resolve();\n\n const routerLogger = this.env.logger.child({\n router: 'IncrementalProviderAdmin',\n });\n\n const incrementalAdminRouter = await new IncrementalProviderRouter(\n this.manager,\n routerLogger,\n ).createRouter();\n\n return { incrementalAdminRouter };\n }\n\n addIncrementalEntityProvider<TCursor, TContext>(\n provider: IncrementalEntityProvider<TCursor, TContext>,\n options: IncrementalEntityProviderOptions,\n ): EventSubscriber {\n const { burstInterval, burstLength, restLength } = options;\n const { logger: catalogLogger, scheduler } = this.env;\n const ready = this.ready;\n\n const manager = this.manager;\n\n let engine: IncrementalIngestionEngine;\n\n this.builder.addEntityProvider({\n getProviderName: provider.getProviderName.bind(provider),\n async connect(connection) {\n const logger = catalogLogger.child({\n entityProvider: provider.getProviderName(),\n });\n\n
|
|
1
|
+
{"version":3,"file":"IncrementalCatalogBuilder.cjs.js","sources":["../../src/service/IncrementalCatalogBuilder.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\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 {\n IncrementalEntityProvider,\n IncrementalEntityProviderOptions,\n PluginEnvironment,\n} from '../types';\nimport { CatalogBuilder as CoreCatalogBuilder } from '@backstage/plugin-catalog-backend';\nimport { Duration } from 'luxon';\nimport { Knex } from 'knex';\nimport { IncrementalIngestionEngine } from '../engine/IncrementalIngestionEngine';\nimport { applyDatabaseMigrations } from '../database/migrations';\nimport { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';\nimport { IncrementalProviderRouter } from '../router/routes';\nimport { Deferred } from '../util';\nimport { EventParams, EventSubscriber } from '@backstage/plugin-events-node';\n\n/** @public */\nexport class IncrementalCatalogBuilder {\n /**\n * Creates the incremental catalog builder, which extends the regular catalog builder.\n * @param env - PluginEnvironment\n * @param builder - CatalogBuilder\n * @returns IncrementalCatalogBuilder\n */\n static async create(env: PluginEnvironment, builder: CoreCatalogBuilder) {\n const client = await env.database.getClient();\n const manager = new IncrementalIngestionDatabaseManager({ client });\n return new IncrementalCatalogBuilder(env, builder, client, manager);\n }\n\n private ready: Deferred<void>;\n\n private constructor(\n private env: PluginEnvironment,\n private builder: CoreCatalogBuilder,\n private client: Knex,\n private manager: IncrementalIngestionDatabaseManager,\n ) {\n this.ready = new Deferred<void>();\n }\n\n async build() {\n await applyDatabaseMigrations(this.client);\n this.ready.resolve();\n\n const routerLogger = this.env.logger.child({\n router: 'IncrementalProviderAdmin',\n });\n\n const incrementalAdminRouter = await new IncrementalProviderRouter(\n this.manager,\n routerLogger,\n ).createRouter();\n\n return { incrementalAdminRouter };\n }\n\n addIncrementalEntityProvider<TCursor, TContext>(\n provider: IncrementalEntityProvider<TCursor, TContext>,\n options: IncrementalEntityProviderOptions,\n ): EventSubscriber {\n const { burstInterval, burstLength, restLength } = options;\n const { logger: catalogLogger, scheduler } = this.env;\n const ready = this.ready;\n\n const manager = this.manager;\n\n let engine: IncrementalIngestionEngine;\n\n this.builder.addEntityProvider({\n getProviderName: provider.getProviderName.bind(provider),\n async connect(connection) {\n const logger = catalogLogger.child({\n entityProvider: provider.getProviderName(),\n });\n\n engine = new IncrementalIngestionEngine({\n ...options,\n ready,\n manager,\n logger,\n provider,\n restLength,\n connection,\n });\n\n const frequency = Duration.isDuration(burstInterval)\n ? burstInterval\n : Duration.fromObject(burstInterval);\n const length = Duration.isDuration(burstLength)\n ? burstLength\n : Duration.fromObject(burstLength);\n\n await scheduler.scheduleTask({\n id: provider.getProviderName(),\n fn: engine.taskFn.bind(engine),\n frequency,\n timeout: length,\n });\n },\n });\n\n return {\n onEvent: (params: EventParams) => engine.onEvent(params),\n supportsEventTopics() {\n return engine.supportsEventTopics();\n },\n };\n }\n}\n"],"names":["Deferred","IncrementalIngestionDatabaseManager","applyDatabaseMigrations","IncrementalProviderRouter","IncrementalIngestionEngine","Duration"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-catalog-backend-module-incremental-ingestion",
|
|
3
|
-
"version": "0.5.5
|
|
3
|
+
"version": "0.5.5",
|
|
4
4
|
"description": "An entity provider for streaming large asset sources into the catalog",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "backend-plugin-module",
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"license": "Apache-2.0",
|
|
23
23
|
"exports": {
|
|
24
24
|
".": {
|
|
25
|
+
"backstage": "@backstage/BackendFeature",
|
|
25
26
|
"require": "./dist/index.cjs.js",
|
|
26
27
|
"types": "./dist/index.d.ts",
|
|
27
28
|
"default": "./dist/index.cjs.js"
|
|
@@ -52,14 +53,14 @@
|
|
|
52
53
|
},
|
|
53
54
|
"dependencies": {
|
|
54
55
|
"@backstage/backend-common": "^0.25.0",
|
|
55
|
-
"@backstage/backend-plugin-api": "1.0.1
|
|
56
|
-
"@backstage/catalog-model": "1.7.0",
|
|
57
|
-
"@backstage/config": "1.2.0",
|
|
58
|
-
"@backstage/errors": "1.2.4",
|
|
59
|
-
"@backstage/plugin-catalog-backend": "1.
|
|
60
|
-
"@backstage/plugin-catalog-node": "1.13.1
|
|
61
|
-
"@backstage/plugin-events-node": "0.4.1
|
|
62
|
-
"@backstage/plugin-permission-common": "0.8.1",
|
|
56
|
+
"@backstage/backend-plugin-api": "^1.0.1",
|
|
57
|
+
"@backstage/catalog-model": "^1.7.0",
|
|
58
|
+
"@backstage/config": "^1.2.0",
|
|
59
|
+
"@backstage/errors": "^1.2.4",
|
|
60
|
+
"@backstage/plugin-catalog-backend": "^1.27.0",
|
|
61
|
+
"@backstage/plugin-catalog-node": "^1.13.1",
|
|
62
|
+
"@backstage/plugin-events-node": "^0.4.1",
|
|
63
|
+
"@backstage/plugin-permission-common": "^0.8.1",
|
|
63
64
|
"@types/express": "^4.17.6",
|
|
64
65
|
"@types/luxon": "^3.0.0",
|
|
65
66
|
"express": "^4.17.1",
|
|
@@ -69,8 +70,8 @@
|
|
|
69
70
|
"uuid": "^9.0.0"
|
|
70
71
|
},
|
|
71
72
|
"devDependencies": {
|
|
72
|
-
"@backstage/backend-defaults": "0.5.1
|
|
73
|
-
"@backstage/backend-test-utils": "1.0.1
|
|
74
|
-
"@backstage/cli": "0.28.0
|
|
73
|
+
"@backstage/backend-defaults": "^0.5.1",
|
|
74
|
+
"@backstage/backend-test-utils": "^1.0.1",
|
|
75
|
+
"@backstage/cli": "^0.28.0"
|
|
75
76
|
}
|
|
76
77
|
}
|