75 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import * as Sentry from "@sentry/browser";
 | |
| import { Integrations } from "@sentry/tracing";
 | |
| import { VERSION } from "../constants";
 | |
| import { SentryIgnoredError } from "../common/errors";
 | |
| import { me } from "./Users";
 | |
| import { config } from "./Config";
 | |
| import { Config } from "@goauthentik/api";
 | |
| 
 | |
| export const TAG_SENTRY_COMPONENT = "authentik.component";
 | |
| export const TAG_SENTRY_CAPABILITIES = "authentik.capabilities";
 | |
| 
 | |
| export function configureSentry(canDoPpi: boolean = false): Promise<Config> {
 | |
|     return config().then((config) => {
 | |
|         if (config.errorReporting.enabled) {
 | |
|             Sentry.init({
 | |
|                 dsn: "https://a579bb09306d4f8b8d8847c052d3a1d3@sentry.beryju.org/8",
 | |
|                 ignoreErrors: [
 | |
|                     /network/ig,
 | |
|                     /fetch/ig,
 | |
|                     // Error on edge on ios,
 | |
|                     // https://stackoverflow.com/questions/69261499/what-is-instantsearchsdkjsbridgeclearhighlight
 | |
|                     /instantSearchSDKJSBridgeClearHighlight/ig,
 | |
|                     // Seems to be an issue in Safari and Firefox
 | |
|                     /MutationObserver.observe/ig,
 | |
|                 ],
 | |
|                 release: `authentik@${VERSION}`,
 | |
|                 tunnel: "/api/v3/sentry/",
 | |
|                 integrations: [
 | |
|                     new Integrations.BrowserTracing({
 | |
|                         tracingOrigins: [window.location.host, "localhost"],
 | |
|                     }),
 | |
|                 ],
 | |
|                 tracesSampleRate: config.errorReporting.tracesSampleRate,
 | |
|                 environment: config.errorReporting.environment,
 | |
|                 beforeSend: async (event: Sentry.Event, hint: Sentry.EventHint | undefined): Promise<Sentry.Event | null> => {
 | |
|                     if (!hint) {
 | |
|                         return event;
 | |
|                     }
 | |
|                     if (hint.originalException instanceof SentryIgnoredError) {
 | |
|                         return null;
 | |
|                     }
 | |
|                     if (hint.originalException instanceof Response || hint.originalException instanceof DOMException) {
 | |
|                         return null;
 | |
|                     }
 | |
|                     return event;
 | |
|                 },
 | |
|             });
 | |
|             Sentry.setTag(TAG_SENTRY_CAPABILITIES, config.capabilities.join(","));
 | |
|             if (window.location.pathname.includes("if/")) {
 | |
|                 Sentry.setTag(TAG_SENTRY_COMPONENT, `web/${currentInterface()}`);
 | |
|                 Sentry.configureScope((scope) => scope.setTransactionName(`authentik.web.if.${currentInterface()}`));
 | |
|             }
 | |
|             if (config.errorReporting.sendPii && canDoPpi) {
 | |
|                 me().then(user => {
 | |
|                     Sentry.setUser({ email: user.user.email });
 | |
|                     console.debug("authentik/config: Sentry with PII enabled.");
 | |
|                 });
 | |
|             } else {
 | |
|                 console.debug("authentik/config: Sentry enabled.");
 | |
|             }
 | |
|         }
 | |
|         return config;
 | |
|     });
 | |
| }
 | |
| 
 | |
| // Get the interface name from URL
 | |
| export function currentInterface(): string {
 | |
|     const pathMatches = window.location.pathname.match(/.+if\/(\w+)\//);
 | |
|     let currentInterface = "unknown";
 | |
|     if (pathMatches && pathMatches.length >= 2) {
 | |
|         currentInterface = pathMatches[1];
 | |
|     }
 | |
|     return currentInterface;
 | |
| }
 | 
