@equinor/fusion-framework-module-analytics 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/LICENSE +21 -0
- package/README.md +248 -0
- package/dist/esm/AnalyticsConfigurator.interface.js +2 -0
- package/dist/esm/AnalyticsConfigurator.interface.js.map +1 -0
- package/dist/esm/AnalyticsConfigurator.js +61 -0
- package/dist/esm/AnalyticsConfigurator.js.map +1 -0
- package/dist/esm/AnalyticsProvider.interface.js +2 -0
- package/dist/esm/AnalyticsProvider.interface.js.map +1 -0
- package/dist/esm/AnalyticsProvider.js +92 -0
- package/dist/esm/AnalyticsProvider.js.map +1 -0
- package/dist/esm/adapters/AnalyticsAdapter.interface.js +2 -0
- package/dist/esm/adapters/AnalyticsAdapter.interface.js.map +1 -0
- package/dist/esm/adapters/ConsoleAnalyticsAdapter.js +12 -0
- package/dist/esm/adapters/ConsoleAnalyticsAdapter.js.map +1 -0
- package/dist/esm/adapters/FusionAnalyticsAdapter.js +42 -0
- package/dist/esm/adapters/FusionAnalyticsAdapter.js.map +1 -0
- package/dist/esm/adapters/index.js +3 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/collectors/AnalyticsCollector.interface.js +2 -0
- package/dist/esm/collectors/AnalyticsCollector.interface.js.map +1 -0
- package/dist/esm/collectors/AppLoadedCollector.js +42 -0
- package/dist/esm/collectors/AppLoadedCollector.js.map +1 -0
- package/dist/esm/collectors/AppSelectedCollector.js +32 -0
- package/dist/esm/collectors/AppSelectedCollector.js.map +1 -0
- package/dist/esm/collectors/BaseCollector.js +40 -0
- package/dist/esm/collectors/BaseCollector.js.map +1 -0
- package/dist/esm/collectors/ContextSelectedCollector.js +36 -0
- package/dist/esm/collectors/ContextSelectedCollector.js.map +1 -0
- package/dist/esm/collectors/index.js +4 -0
- package/dist/esm/collectors/index.js.map +1 -0
- package/dist/esm/collectors/utils/extractAppMetadata.js +37 -0
- package/dist/esm/collectors/utils/extractAppMetadata.js.map +1 -0
- package/dist/esm/collectors/utils/extractContextMetadata.js +23 -0
- package/dist/esm/collectors/utils/extractContextMetadata.js.map +1 -0
- package/dist/esm/enable-analytics.js +20 -0
- package/dist/esm/enable-analytics.js.map +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logExporters/fusionOTLPLogExporter/FusionOTLPLogExporter.js +22 -0
- package/dist/esm/logExporters/fusionOTLPLogExporter/FusionOTLPLogExporter.js.map +1 -0
- package/dist/esm/logExporters/fusionOTLPLogExporter/HttpClientExporterTransport.js +84 -0
- package/dist/esm/logExporters/fusionOTLPLogExporter/HttpClientExporterTransport.js.map +1 -0
- package/dist/esm/logExporters/index.js +3 -0
- package/dist/esm/logExporters/index.js.map +1 -0
- package/dist/esm/module.js +28 -0
- package/dist/esm/module.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/version.js +3 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/AnalyticsConfigurator.d.ts +39 -0
- package/dist/types/AnalyticsConfigurator.interface.d.ts +39 -0
- package/dist/types/AnalyticsProvider.d.ts +45 -0
- package/dist/types/AnalyticsProvider.interface.d.ts +20 -0
- package/dist/types/adapters/AnalyticsAdapter.interface.d.ts +21 -0
- package/dist/types/adapters/ConsoleAnalyticsAdapter.d.ts +9 -0
- package/dist/types/adapters/FusionAnalyticsAdapter.d.ts +19 -0
- package/dist/types/adapters/index.d.ts +3 -0
- package/dist/types/collectors/AnalyticsCollector.interface.d.ts +16 -0
- package/dist/types/collectors/AppLoadedCollector.d.ts +23 -0
- package/dist/types/collectors/AppSelectedCollector.d.ts +21 -0
- package/dist/types/collectors/BaseCollector.d.ts +27 -0
- package/dist/types/collectors/ContextSelectedCollector.d.ts +21 -0
- package/dist/types/collectors/index.d.ts +4 -0
- package/dist/types/collectors/utils/extractAppMetadata.d.ts +17 -0
- package/dist/types/collectors/utils/extractContextMetadata.d.ts +11 -0
- package/dist/types/enable-analytics.d.ts +11 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/logExporters/fusionOTLPLogExporter/FusionOTLPLogExporter.d.ts +11 -0
- package/dist/types/logExporters/fusionOTLPLogExporter/HttpClientExporterTransport.d.ts +12 -0
- package/dist/types/logExporters/index.d.ts +2 -0
- package/dist/types/module.d.ts +44 -0
- package/dist/types/types.d.ts +22 -0
- package/dist/types/version.d.ts +1 -0
- package/package.json +72 -0
- package/src/AnalyticsConfigurator.interface.ts +48 -0
- package/src/AnalyticsConfigurator.ts +116 -0
- package/src/AnalyticsProvider.interface.ts +22 -0
- package/src/AnalyticsProvider.ts +118 -0
- package/src/adapters/AnalyticsAdapter.interface.ts +23 -0
- package/src/adapters/ConsoleAnalyticsAdapter.ts +17 -0
- package/src/adapters/FusionAnalyticsAdapter.ts +61 -0
- package/src/adapters/index.ts +3 -0
- package/src/collectors/AnalyticsCollector.interface.ts +18 -0
- package/src/collectors/AppLoadedCollector.ts +74 -0
- package/src/collectors/AppSelectedCollector.ts +53 -0
- package/src/collectors/BaseCollector.ts +65 -0
- package/src/collectors/ContextSelectedCollector.ts +56 -0
- package/src/collectors/index.ts +4 -0
- package/src/collectors/utils/extractAppMetadata.ts +45 -0
- package/src/collectors/utils/extractContextMetadata.ts +27 -0
- package/src/enable-analytics.ts +27 -0
- package/src/index.ts +11 -0
- package/src/logExporters/fusionOTLPLogExporter/FusionOTLPLogExporter.ts +41 -0
- package/src/logExporters/fusionOTLPLogExporter/HttpClientExporterTransport.ts +89 -0
- package/src/logExporters/index.ts +2 -0
- package/src/module.ts +59 -0
- package/src/types.ts +29 -0
- package/src/version.ts +2 -0
- package/tsconfig.json +29 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { from, map, Subject } from 'rxjs';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* Function to create zod schema to be used when collecting
|
|
5
|
+
*/
|
|
6
|
+
export const createSchema = (value, attributes) => {
|
|
7
|
+
return z.object({
|
|
8
|
+
name: z.string(),
|
|
9
|
+
value: value,
|
|
10
|
+
attributes: attributes.optional(),
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* A base collector to help with parsing the events with provided schema before
|
|
15
|
+
* emitting.
|
|
16
|
+
*/
|
|
17
|
+
export class BaseCollector {
|
|
18
|
+
#schema;
|
|
19
|
+
#name;
|
|
20
|
+
#subject = new Subject();
|
|
21
|
+
constructor(name, schema) {
|
|
22
|
+
this.#name = name;
|
|
23
|
+
this.#schema = schema;
|
|
24
|
+
}
|
|
25
|
+
initialize() {
|
|
26
|
+
from(this._initialize())
|
|
27
|
+
.pipe(map(({ value, attributes }) => {
|
|
28
|
+
return {
|
|
29
|
+
name: this.#name,
|
|
30
|
+
value: value,
|
|
31
|
+
attributes: attributes,
|
|
32
|
+
};
|
|
33
|
+
}), map((x) => this.#schema.parse(x)))
|
|
34
|
+
.subscribe(this.#subject);
|
|
35
|
+
}
|
|
36
|
+
subscribe(observer) {
|
|
37
|
+
return this.#subject.subscribe(observer);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=BaseCollector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseCollector.js","sourceRoot":"","sources":["../../../src/collectors/BaseCollector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAwB,OAAO,EAAsC,MAAM,MAAM,CAAC;AACpG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAA0B,EAC1B,UAA8B,EAC9B,EAAE;IACF,OAAO,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE;KAClC,CAAC,CAAC;AACL,CAAC,CAAC;AAMF;;;GAGG;AACH,MAAM,OAAgB,aAAa;IAKjC,OAAO,CAAiC;IACxC,KAAK,CAAS;IACd,QAAQ,GAAqD,IAAI,OAAO,EAErE,CAAC;IAEJ,YAAY,IAAY,EAAE,MAAsC;QAC9D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAID,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;aACrB,IAAI,CACH,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;YAC5B,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,KAAK;gBAChB,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,UAAU;aACvB,CAAC;QACJ,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAClC;aACA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,SAAS,CAAC,QAAoE;QAC5E,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { distinctUntilChanged, map, pairwise } from 'rxjs';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { BaseCollector, createSchema } from './BaseCollector.js';
|
|
4
|
+
import { contextSchema, extractContextMetadata, } from './utils/extractContextMetadata.js';
|
|
5
|
+
/**
|
|
6
|
+
* The schema of the data to be sent.
|
|
7
|
+
*/
|
|
8
|
+
const eventSchema = createSchema(contextSchema, z.object({ previous: contextSchema }));
|
|
9
|
+
/**
|
|
10
|
+
* Collector to listen for context changes and add values and attributes for
|
|
11
|
+
* further processing by adapters.
|
|
12
|
+
*/
|
|
13
|
+
export class ContextSelectedCollector extends BaseCollector {
|
|
14
|
+
#contextProvider;
|
|
15
|
+
constructor(contextProvider) {
|
|
16
|
+
super('context-selected', eventSchema);
|
|
17
|
+
this.#contextProvider = contextProvider;
|
|
18
|
+
}
|
|
19
|
+
_initialize() {
|
|
20
|
+
const contextSelected$ = this.#contextProvider.currentContext$.pipe(
|
|
21
|
+
// Only emit when an actual change has happened.
|
|
22
|
+
distinctUntilChanged((prev, curr) => prev?.id === curr?.id),
|
|
23
|
+
// Provide both the old and the new value.
|
|
24
|
+
pairwise());
|
|
25
|
+
const data$ = contextSelected$.pipe(map(([prev, next]) => {
|
|
26
|
+
return {
|
|
27
|
+
value: next && extractContextMetadata(next),
|
|
28
|
+
attributes: {
|
|
29
|
+
previous: prev && extractContextMetadata(prev),
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}));
|
|
33
|
+
return data$;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ContextSelectedCollector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextSelectedCollector.js","sourceRoot":"","sources":["../../../src/collectors/ContextSelectedCollector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAwB,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAEL,aAAa,EACb,sBAAsB,GACvB,MAAM,mCAAmC,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;AAEvF;;;GAGG;AACH,MAAM,OAAO,wBACX,SAAQ,aAA8D;IAGtE,gBAAgB,CAAmB;IAEnC,YAAY,eAAiC;QAC3C,KAAK,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;QACvC,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;IAC1C,CAAC;IAED,WAAW;QAIT,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI;QACjE,gDAAgD;QAChD,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QAC3D,0CAA0C;QAC1C,QAAQ,EAAE,CACX,CAAC;QAEF,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CACjC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;YACnB,OAAO;gBACL,KAAK,EAAE,IAAI,IAAI,sBAAsB,CAAC,IAAI,CAAC;gBAC3C,UAAU,EAAE;oBACV,QAAQ,EAAE,IAAI,IAAI,sBAAsB,CAAC,IAAI,CAAC;iBAC/C;aACF,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/collectors/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// Schema representing an object with key appKey and a string value.
|
|
3
|
+
// Used to parse an object containing appKey.
|
|
4
|
+
export const appKeySchema = z
|
|
5
|
+
.object({
|
|
6
|
+
appKey: z.string().optional(),
|
|
7
|
+
})
|
|
8
|
+
.optional()
|
|
9
|
+
.nullable();
|
|
10
|
+
// Schema representing an object with data points of an app.
|
|
11
|
+
// Used to parse an object with app data.
|
|
12
|
+
export const appSchema = z
|
|
13
|
+
.object({
|
|
14
|
+
appKey: z.string(),
|
|
15
|
+
displayName: z.string(),
|
|
16
|
+
type: z.string(),
|
|
17
|
+
categoryName: z.string().optional(),
|
|
18
|
+
buildVersion: z.string().optional(),
|
|
19
|
+
buildTag: z.string().optional().nullable(),
|
|
20
|
+
})
|
|
21
|
+
.optional();
|
|
22
|
+
export const extractAppKeyMetadata = (app) => {
|
|
23
|
+
return {
|
|
24
|
+
appKey: app?.appKey,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export const extractAppMetadata = (app) => {
|
|
28
|
+
return {
|
|
29
|
+
appKey: app.appKey,
|
|
30
|
+
displayName: app.displayName,
|
|
31
|
+
type: app.type,
|
|
32
|
+
categoryName: app.category?.name,
|
|
33
|
+
buildVersion: app.build?.version,
|
|
34
|
+
buildTag: app.build?.tag,
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=extractAppMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractAppMetadata.js","sourceRoot":"","sources":["../../../../src/collectors/utils/extractAppMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,oEAAoE;AACpE,6CAA6C;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC;KACD,QAAQ,EAAE;KACV,QAAQ,EAAE,CAAC;AAEd,4DAA4D;AAC5D,yCAAyC;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC3C,CAAC;KACD,QAAQ,EAAE,CAAC;AAMd,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAe,EAAgC,EAAE;IACrF,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,MAAM;KACpB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAgB,EAA6B,EAAE;IAChF,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,YAAY,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI;QAChC,YAAY,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO;QAChC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG;KACzB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// Schema representing an object with data points of a Fusion context.
|
|
3
|
+
// Used to parse an object with context data.
|
|
4
|
+
export const contextSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
id: z.string(),
|
|
7
|
+
type: z.string(),
|
|
8
|
+
title: z.string().optional(),
|
|
9
|
+
externalId: z.string().optional(),
|
|
10
|
+
source: z.string().optional(),
|
|
11
|
+
})
|
|
12
|
+
.optional()
|
|
13
|
+
.nullable();
|
|
14
|
+
export const extractContextMetadata = (context) => {
|
|
15
|
+
return {
|
|
16
|
+
id: context.id,
|
|
17
|
+
externalId: context.externalId,
|
|
18
|
+
title: context.title,
|
|
19
|
+
type: context.type.id,
|
|
20
|
+
source: context.source,
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=extractContextMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractContextMetadata.js","sourceRoot":"","sources":["../../../../src/collectors/utils/extractContextMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,sEAAsE;AACtE,6CAA6C;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC;KACD,QAAQ,EAAE;KACV,QAAQ,EAAE,CAAC;AAId,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAoB,EAAiC,EAAE;IAC5F,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;QACrB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { module } from './module.js';
|
|
2
|
+
/**
|
|
3
|
+
* Enables analytics for agiven module configurator.
|
|
4
|
+
*
|
|
5
|
+
* @param configurator - The module configurator instance to which analytics should be attached.
|
|
6
|
+
* @param callback - An optional callback to further configure the analytics builder. Can be synchronous or asynchronous.
|
|
7
|
+
*/
|
|
8
|
+
export const enableAnalytics = (
|
|
9
|
+
// biome-ignore lint/suspicious/noExplicitAny: must be any to support all module types
|
|
10
|
+
configurator, callback) => {
|
|
11
|
+
configurator.addConfig({
|
|
12
|
+
module,
|
|
13
|
+
configure: async (builder) => {
|
|
14
|
+
if (callback) {
|
|
15
|
+
await Promise.resolve(callback(builder));
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=enable-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable-analytics.js","sourceRoot":"","sources":["../../src/enable-analytics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAKrC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;AAC7B,sFAAsF;AACtF,YAA4C,EAC5C,QAAmC,EAC7B,EAAE;IACR,YAAY,CAAC,SAAS,CAAC;QACrB,MAAM;QACN,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC3B,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { module as analyticsModule } from './module.js';
|
|
2
|
+
export { AnalyticsProvider } from './AnalyticsProvider.js';
|
|
3
|
+
export { AnalyticsConfigurator } from './AnalyticsConfigurator.js';
|
|
4
|
+
export { enableAnalytics } from './enable-analytics.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAmB,MAAM,aAAa,CAAC;AAIzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAI3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { JsonLogsSerializer } from '@opentelemetry/otlp-transformer';
|
|
2
|
+
import { createOtlpNetworkExportDelegate, OTLPExporterBase, } from '@opentelemetry/otlp-exporter-base';
|
|
3
|
+
import { HttpClientExporterTransport } from './HttpClientExporterTransport.js';
|
|
4
|
+
// The shared default configuration needed for the OTLPNetworkExportDelegate
|
|
5
|
+
function getSharedConfigurationDefaults() {
|
|
6
|
+
return {
|
|
7
|
+
timeoutMillis: 10000,
|
|
8
|
+
concurrencyLimit: 30,
|
|
9
|
+
compression: 'none',
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A log exporter extending OTLPExporterBase but substitute the normal transport
|
|
14
|
+
* with a HttpClientExporterTransport. This will use the provided httpClient to
|
|
15
|
+
* emit the event.
|
|
16
|
+
*/
|
|
17
|
+
export class FusionOTLPLogExporter extends OTLPExporterBase {
|
|
18
|
+
constructor(httpClient) {
|
|
19
|
+
super(createOtlpNetworkExportDelegate(getSharedConfigurationDefaults(), JsonLogsSerializer, new HttpClientExporterTransport(httpClient)));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=FusionOTLPLogExporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FusionOTLPLogExporter.js","sourceRoot":"","sources":["../../../../src/logExporters/fusionOTLPLogExporter/FusionOTLPLogExporter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,OAAO,EACL,+BAA+B,EAC/B,gBAAgB,GAEjB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,4EAA4E;AAC5E,SAAS,8BAA8B;IACrC,OAAO;QACL,aAAa,EAAE,KAAK;QACpB,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,MAAM;KACpB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,qBACX,SAAQ,gBAAqC;IAG7C,YAAY,UAAuB;QACjC,KAAK,CACH,+BAA+B,CAC7B,8BAA8B,EAAE,EAChC,kBAAkB,EAClB,IAAI,2BAA2B,CAAC,UAAU,CAAC,CAC5C,CACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
function isExportRetryable(statusCode) {
|
|
2
|
+
// Status codes of when we should consider retrying.
|
|
3
|
+
// 429 Too Many Requests
|
|
4
|
+
// 502 Bad Gateway
|
|
5
|
+
// 503 Service Unavailable
|
|
6
|
+
// 504 Gateway Timeout
|
|
7
|
+
const retryCodes = [429, 502, 503, 504];
|
|
8
|
+
return retryCodes.includes(statusCode);
|
|
9
|
+
}
|
|
10
|
+
// Parse the `Retry-After` header and return when the service will allow a retry.
|
|
11
|
+
function parseRetryAfterToMills(retryAfter) {
|
|
12
|
+
if (retryAfter == null) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
const seconds = Number.parseInt(retryAfter, 10);
|
|
16
|
+
if (Number.isInteger(seconds)) {
|
|
17
|
+
return seconds > 0 ? seconds * 1000 : -1;
|
|
18
|
+
}
|
|
19
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After#directives
|
|
20
|
+
const delay = new Date(retryAfter).getTime() - Date.now();
|
|
21
|
+
if (delay >= 0) {
|
|
22
|
+
return delay;
|
|
23
|
+
}
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A Exporter Transport to POST events to provided path using the provided httpClient
|
|
28
|
+
*/
|
|
29
|
+
export class HttpClientExporterTransport {
|
|
30
|
+
httpClient;
|
|
31
|
+
path;
|
|
32
|
+
constructor(httpClient, path = '/v1/logs') {
|
|
33
|
+
this.httpClient = httpClient;
|
|
34
|
+
this.path = path;
|
|
35
|
+
}
|
|
36
|
+
// Will send data with the httpClient.
|
|
37
|
+
// If the service responds with a non 2** statusCode, we check if it is
|
|
38
|
+
// retryable.
|
|
39
|
+
// The timeoutMillis determines when to abort if the service has not yet
|
|
40
|
+
// responded.
|
|
41
|
+
async send(data, timeoutMillis) {
|
|
42
|
+
const abortController = new AbortController();
|
|
43
|
+
const timeout = setTimeout(() => abortController.abort(), timeoutMillis);
|
|
44
|
+
try {
|
|
45
|
+
const response = await this.httpClient.fetch(this.path, {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
body: new Blob([data.slice().buffer], { type: 'application/json' }),
|
|
48
|
+
signal: abortController.signal,
|
|
49
|
+
});
|
|
50
|
+
if (response.ok) {
|
|
51
|
+
return { status: 'success' };
|
|
52
|
+
}
|
|
53
|
+
else if (isExportRetryable(response.status)) {
|
|
54
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
55
|
+
const retryInMillis = parseRetryAfterToMills(retryAfter);
|
|
56
|
+
return { status: 'retryable', retryInMillis };
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
status: 'failure',
|
|
60
|
+
error: new Error('Fetch request failed with non-retryable status'),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const err = error;
|
|
65
|
+
if (err?.name === 'AbortError') {
|
|
66
|
+
return {
|
|
67
|
+
status: 'failure',
|
|
68
|
+
error: new Error('Fetch request timed out', { cause: err }),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
status: 'failure',
|
|
73
|
+
error: new Error('Fetch request errored', { cause: err }),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
clearTimeout(timeout);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
shutdown() {
|
|
81
|
+
// intentionally left empty, nothing to do.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=HttpClientExporterTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClientExporterTransport.js","sourceRoot":"","sources":["../../../../src/logExporters/fusionOTLPLogExporter/HttpClientExporterTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/logExporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AnalyticsConfigurator } from './AnalyticsConfigurator.js';
|
|
2
|
+
import { AnalyticsProvider } from './AnalyticsProvider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Analytics module definition for the Fusion Framework.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* This module provides analytics capabilities by configuring and initializing a analytics provider.
|
|
8
|
+
*
|
|
9
|
+
* @type {AnalyticsModule}
|
|
10
|
+
*
|
|
11
|
+
* @property {string} name - The name of the module ('analytics').
|
|
12
|
+
* @property {() => AnalyticsConfigurator} configure - Factory function to create a new AnalyticsConfigurator instance.
|
|
13
|
+
* @property {(args) => Promise<IAnalyticsProvider>} initialize - Asynchronous initializer that creates and returns a AnalyticsProvider.
|
|
14
|
+
* - @param args - Initialization arguments, including configuration and module dependencies.
|
|
15
|
+
* - @returns A promise that resolves to an instance of IAnalyticsProvider.
|
|
16
|
+
*/
|
|
17
|
+
export const module = {
|
|
18
|
+
name: 'analytics',
|
|
19
|
+
configure: () => new AnalyticsConfigurator(),
|
|
20
|
+
initialize: async (args) => {
|
|
21
|
+
const config = await args.config.createConfigAsync(args);
|
|
22
|
+
const provider = new AnalyticsProvider(config);
|
|
23
|
+
await provider.initialize();
|
|
24
|
+
return provider;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
export default module;
|
|
28
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAqB3D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,qBAAqB,EAAE;IAC5C,UAAU,EAAE,KAAK,EAAE,IAAI,EAA+B,EAAE;QACtD,MAAM,MAAM,GAAG,MAAO,IAAI,CAAC,MAAgC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpF,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAE5B,OAAO,QAAQ,CAAC;IAClB,CAAC;CACwB,CAAC;AAE5B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|