Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion packages/api/src/metrics/OpenTelemetryServer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import {
closeable,
Closeable,
Sequencer,
SequencerModule,
sequencerModule,
Expand Down Expand Up @@ -32,7 +34,13 @@ export type OpenTelemetryServerConfig = {
};

@sequencerModule()
export class OpenTelemetryServer extends SequencerModule<OpenTelemetryServerConfig> {
@closeable()
export class OpenTelemetryServer
extends SequencerModule<OpenTelemetryServerConfig>
implements Closeable
{
private sdk?: NodeSDK;

public constructor(
@inject("Sequencer") private readonly sequencer: Sequencer<any>
) {
Expand Down Expand Up @@ -89,12 +97,17 @@ export class OpenTelemetryServer extends SequencerModule<OpenTelemetryServerConf
});

sdk.start();
this.sdk = sdk;

// TODO Write logger to directly integrate with our logging library
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR);

log.info("OpenTelemetryServer started");
}

public async close() {
await this.sdk?.shutdown();
}
}

OpenTelemetryServer satisfies DependencyFactory;
69 changes: 60 additions & 9 deletions packages/common/src/config/ModuleContainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,18 +85,39 @@ export interface ModulesRecord<
[name: string]: ModuleType;
}

// config record derived from the provided modules and their config types
export type ModulesConfig<Modules extends ModulesRecord> = {
// this will translate into = key: module name, value: module.config
[ConfigKey in StringKeyOf<Modules>]: InstanceType<
Modules[ConfigKey]
> extends Configurable<infer Config>
type ExtractConfig<Module extends BaseModuleType> =
InstanceType<Module> extends Configurable<infer Config>
? Config extends NoConfig
? Config | undefined
: Config
: never;

type OnlyDefined<R extends Record<string, unknown>> = {
[Key in keyof R as NoConfig extends R[Key] ? never : Key]: R[Key];
};
type OptionalUndefined<R extends Record<string, unknown>> = {
[Key in keyof R as NoConfig extends R[Key] ? Key : never]?: R[Key];
};

type MakeNoConfigOptional<A extends Record<string, unknown>> = OnlyDefined<A> &
OptionalUndefined<A>;

export type CompletedModulesConfig<Modules extends ModulesRecord> = {
// this will translate into = key: module name, value: module.config
[ConfigKey in StringKeyOf<Modules>]: ExtractConfig<Modules[ConfigKey]>;
};

// config record derived from the provided modules and their config types
export type ModulesConfig<Modules extends ModulesRecord> = MakeNoConfigOptional<
CompletedModulesConfig<Modules>
>;

// export type MakeNeeded<R extends { }>

// export type ShortConfig<Modules extends ModulesRecord> =
// ModulesConfig<Modules>
// >;

/**
* This type make any config partial (i.e. optional) up to the first level
* So { Module: { a: { b: string } } }
Expand Down Expand Up @@ -287,6 +308,26 @@ export class ModuleContainer<Modules extends ModulesRecord>
});
}

private completeConfig(
config: ModulesConfig<Modules>
): ModulesConfig<Modules> {
const keys = Object.keys(config);
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
const moduleNames = this.moduleNames as StringKeyOf<Modules>[];
const noConfigParts = moduleNames
.filter((moduleName) => !keys.includes(moduleName))
.reduce<Record<string, NoConfig>>((obj, moduleName) => {
obj[moduleName] = {};
return obj;
}, {});

// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
return {
...config,
...noConfigParts,
} as unknown as ModulesConfig<Modules>;
}

/**
* Provide additional configuration after the ModuleContainer was created.
*
Expand All @@ -296,7 +337,7 @@ export class ModuleContainer<Modules extends ModulesRecord>
* @param config
*/
public configure(config: ModulesConfig<Modules>) {
this.config = config;
this.config = this.completeConfig(config);
}

public configurePartial(config: RecursivePartial<ModulesConfig<Modules>>) {
Expand All @@ -314,8 +355,14 @@ export class ModuleContainer<Modules extends ModulesRecord>
super.config = merge<
ModulesConfig<Modules> | NoConfig,
ModulesConfig<Modules>
>(this.currentConfig ?? {}, config);
>(this.currentConfig ?? {}, this.completeConfig(config));
}
// public set config(config: ShortConfig<Modules>) {
// super.config = merge<ShortConfig<Modules> | NoConfig, ShortConfig<Modules>>(
// this.currentConfig ?? {},
// config
// );
// }

/**
* Resolves a module from the current module container
Expand Down Expand Up @@ -364,7 +411,11 @@ export class ModuleContainer<Modules extends ModulesRecord>
moduleName: StringKeyOf<Modules>,
containedModule: InstanceType<Modules[StringKeyOf<Modules>]>
) {
const config = super.config?.[moduleName];
const config =
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
(super.config as unknown as CompletedModulesConfig<Modules>)?.[
moduleName
];
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
if (!config) {
throw errors.configNotSetInContainer(moduleName.toString());
Expand Down
4 changes: 4 additions & 0 deletions packages/common/test/config/ModuleContainer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ class TestModule
}
}

class NoConfigModule extends BaseTestModule<NoConfig> {}

interface OtherTestModuleConfig {
otherTestConfigProperty: number;
}
Expand Down Expand Up @@ -79,6 +81,7 @@ describe("moduleContainer", () => {
let container: TestModuleContainer<{
TestModule: typeof TestModule;
OtherTestModule: typeof OtherTestModule;
NoConfigModule: typeof NoConfigModule;
}>;
const testConfigProperty = 0;

Expand All @@ -88,6 +91,7 @@ describe("moduleContainer", () => {
OtherTestModule,
// this module would not be assignable to TestModuleContainer
// WrongTestModule,
NoConfigModule,
});
});

Expand Down
Loading