B2B-88: add starter kit structure and elements
This commit is contained in:
17
packages/monitoring/sentry/src/components/provider.tsx
Normal file
17
packages/monitoring/sentry/src/components/provider.tsx
Normal file
@@ -0,0 +1,17 @@
|
||||
import { MonitoringContext } from '@kit/monitoring-core';
|
||||
|
||||
import { SentryMonitoringService } from '../services/sentry-monitoring.service';
|
||||
|
||||
const sentry = new SentryMonitoringService();
|
||||
|
||||
export function SentryProvider({ children }: React.PropsWithChildren) {
|
||||
return <MonitoringProvider>{children}</MonitoringProvider>;
|
||||
}
|
||||
|
||||
function MonitoringProvider(props: React.PropsWithChildren) {
|
||||
return (
|
||||
<MonitoringContext.Provider value={sentry}>
|
||||
{props.children}
|
||||
</MonitoringContext.Provider>
|
||||
);
|
||||
}
|
||||
1
packages/monitoring/sentry/src/index.ts
Normal file
1
packages/monitoring/sentry/src/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from './services/sentry-monitoring.service';
|
||||
42
packages/monitoring/sentry/src/sentry.client.config.ts
Normal file
42
packages/monitoring/sentry/src/sentry.client.config.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { init } from '@sentry/nextjs';
|
||||
|
||||
type Parameters<T extends (args: never) => unknown> = T extends (
|
||||
...args: infer P
|
||||
) => unknown
|
||||
? P
|
||||
: never;
|
||||
|
||||
/**
|
||||
* @name initializeSentryBrowserClient
|
||||
* @description Initialize the Sentry client
|
||||
* @param props
|
||||
*/
|
||||
export function initializeSentryBrowserClient(
|
||||
props: Parameters<typeof init>[0] = {},
|
||||
) {
|
||||
return init({
|
||||
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
|
||||
// Replay may only be enabled for the client-side
|
||||
integrations: [
|
||||
// add your desired integrations here
|
||||
// https://docs.sentry.io/platforms/javascript/configuration/integrations/
|
||||
],
|
||||
|
||||
// Set tracesSampleRate to 1.0 to capture 100%
|
||||
// of transactions for performance monitoring.
|
||||
// We recommend adjusting this value in production
|
||||
tracesSampleRate: props?.tracesSampleRate ?? 1.0,
|
||||
|
||||
// Capture Replay for 10% of all sessions,
|
||||
// plus for 100% of sessions with an error
|
||||
replaysSessionSampleRate: 0.1,
|
||||
replaysOnErrorSampleRate: 1.0,
|
||||
|
||||
// ...
|
||||
|
||||
// Note: if you want to override the automatic release value, do not set a
|
||||
// `release` value here - use the environment variable `SENTRY_RELEASE`, so
|
||||
// that it will also get attached to your source maps,
|
||||
...props,
|
||||
});
|
||||
}
|
||||
27
packages/monitoring/sentry/src/sentry.server.config.ts
Normal file
27
packages/monitoring/sentry/src/sentry.server.config.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import { init } from '@sentry/nextjs';
|
||||
|
||||
type Parameters<T extends (args: never) => unknown> = T extends (
|
||||
...args: infer P
|
||||
) => unknown
|
||||
? P
|
||||
: never;
|
||||
|
||||
/**
|
||||
* @name initializeSentryServerClient
|
||||
* @description Initialize the Sentry client in the server
|
||||
* @param props
|
||||
*/
|
||||
export function initializeSentryServerClient(
|
||||
props: Parameters<typeof init>[0] = {},
|
||||
) {
|
||||
return init({
|
||||
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
|
||||
|
||||
// ...
|
||||
|
||||
// Note: if you want to override the automatic release value, do not set a
|
||||
// `release` value here - use the environment variable `SENTRY_RELEASE`, so
|
||||
// that it will also get attached to your source maps,
|
||||
...props,
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
import {
|
||||
Event as SentryEvent,
|
||||
User as SentryUser,
|
||||
captureEvent,
|
||||
captureException,
|
||||
setUser,
|
||||
} from '@sentry/nextjs';
|
||||
|
||||
import { MonitoringService } from '@kit/monitoring-core';
|
||||
|
||||
/**
|
||||
* @class
|
||||
* @implements {MonitoringService}
|
||||
* ServerSentryMonitoringService is responsible for capturing exceptions and identifying users using the Sentry monitoring service.
|
||||
*/
|
||||
export class SentryMonitoringService implements MonitoringService {
|
||||
private readonly readyPromise: Promise<unknown>;
|
||||
private readyResolver?: (value?: unknown) => void;
|
||||
|
||||
constructor() {
|
||||
this.readyPromise = new Promise(
|
||||
(resolve) => (this.readyResolver = resolve),
|
||||
);
|
||||
|
||||
void this.initialize();
|
||||
}
|
||||
|
||||
async ready() {
|
||||
return this.readyPromise;
|
||||
}
|
||||
|
||||
captureException(error: Error | null) {
|
||||
return captureException(error);
|
||||
}
|
||||
|
||||
captureEvent<Extra extends SentryEvent>(event: string, extra?: Extra) {
|
||||
return captureEvent({
|
||||
message: event,
|
||||
...(extra ?? {}),
|
||||
});
|
||||
}
|
||||
|
||||
identifyUser(user: SentryUser) {
|
||||
setUser(user);
|
||||
}
|
||||
|
||||
private async initialize() {
|
||||
const environment =
|
||||
process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT ?? process.env.VERCEL_ENV;
|
||||
|
||||
if (typeof document !== 'undefined') {
|
||||
const { initializeSentryBrowserClient } = await import(
|
||||
'../sentry.client.config'
|
||||
);
|
||||
|
||||
initializeSentryBrowserClient({
|
||||
environment,
|
||||
});
|
||||
} else {
|
||||
const { initializeSentryServerClient } = await import(
|
||||
'../sentry.server.config'
|
||||
);
|
||||
|
||||
initializeSentryServerClient({
|
||||
environment,
|
||||
});
|
||||
}
|
||||
|
||||
this.readyResolver?.();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user