diff --git a/libs/providers/launchdarkly-client/README.md b/libs/providers/launchdarkly-client/README.md index 08e4f9dee..9a10ade31 100644 --- a/libs/providers/launchdarkly-client/README.md +++ b/libs/providers/launchdarkly-client/README.md @@ -59,6 +59,16 @@ await OpenFeature.setContext({ key: 'my-key' }); Read more about LD contexts [here](https://launchdarkly.github.io/js-client-sdk/interfaces/LDContextCommon.html) +## Tracking + +You can send custom events to LaunchDarkly metrics for use in +experiments and guarded rollouts. To learn more, read [Sending custom events](https://launchdarkly.com/docs/sdk/features/events). + +```ts +const client = await OpenFeature.getClient(); +client.track('event-key-123abc', { customProperty: someValue }) +``` + ## Building Run `nx package providers-launchdarkly-client` to build the library. diff --git a/libs/providers/launchdarkly-client/src/lib/launchdarkly-client-provider.spec.ts b/libs/providers/launchdarkly-client/src/lib/launchdarkly-client-provider.spec.ts index 26068236f..40c5e883b 100644 --- a/libs/providers/launchdarkly-client/src/lib/launchdarkly-client-provider.spec.ts +++ b/libs/providers/launchdarkly-client/src/lib/launchdarkly-client-provider.spec.ts @@ -27,6 +27,7 @@ describe('LaunchDarklyClientProvider', () => { waitForInitialization: jest.fn(), on: jest.fn(), close: jest.fn(), + track: jest.fn(), } as unknown as jest.Mocked; beforeAll(() => { @@ -376,6 +377,18 @@ describe('LaunchDarklyClientProvider', () => { }); }); + it('calls the client track method properly', async () => { + ldClientMock.track = jest.fn().mockResolvedValue({}); + ofClient.track('event-key-123abc', { value: 99.77, currency: 'USD' }); + expect(ldClientMock.track).toHaveBeenCalledWith('event-key-123abc', { currency: 'USD' }, 99.77); + + ofClient.track('event-key-123abc', { value: 99.77 }); + expect(ldClientMock.track).toHaveBeenCalledWith('event-key-123abc', {}, 99.77); + + ofClient.track('event-key-123abc', { currency: 'USD' }); + expect(ldClientMock.track).toHaveBeenCalledWith('event-key-123abc', { currency: 'USD' }, undefined); + }); + describe('onContextChange', () => { it('logs information about missing keys', async () => { ldClientMock.identify = jest.fn().mockResolvedValue({}); diff --git a/libs/providers/launchdarkly-client/src/lib/launchdarkly-client-provider.ts b/libs/providers/launchdarkly-client/src/lib/launchdarkly-client-provider.ts index cff95db2f..386dc0329 100644 --- a/libs/providers/launchdarkly-client/src/lib/launchdarkly-client-provider.ts +++ b/libs/providers/launchdarkly-client/src/lib/launchdarkly-client-provider.ts @@ -11,6 +11,7 @@ import { OpenFeatureEventEmitter, ProviderEvents, ProviderStatus, + TrackingEventDetails, } from '@openfeature/web-sdk'; import isEmpty from 'lodash.isempty'; @@ -153,6 +154,11 @@ export class LaunchDarklyClientProvider implements Provider { return wrongTypeResult(defaultValue); } + track(trackingEventName: string, _context: EvaluationContext, { value, ...details }: TrackingEventDetails): void { + // The LD Client already has the context form the identify method, so we can omit it here. + this.client.track(trackingEventName, details, value); + } + private translateContext(context: EvaluationContext) { return translateContext(this.logger, context); }