mirror of
				https://github.com/strapi/strapi.git
				synced 2025-10-31 09:56:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const Sentry = require('@sentry/node');
 | |
| const defaultSettings = require('../config/settings.json');
 | |
| 
 | |
| const createSentryService = () => {
 | |
|   let isReady = false;
 | |
|   let instance = null;
 | |
|   let settings = {};
 | |
| 
 | |
|   return {
 | |
|     /**
 | |
|      * Initialize Sentry service
 | |
|      */
 | |
|     init() {
 | |
|       // Make sure there isn't a Sentry instance already running
 | |
|       if (instance != null) {
 | |
|         return this;
 | |
|       }
 | |
| 
 | |
|       // Retrieve user settings and merge them with the default ones
 | |
|       settings = {
 | |
|         ...defaultSettings,
 | |
|         ...strapi.plugins.sentry.config,
 | |
|       };
 | |
| 
 | |
|       try {
 | |
|         // Don't init Sentry if no DSN was provided
 | |
|         if (settings.dsn) {
 | |
|           Sentry.init({
 | |
|             dsn: settings.dsn,
 | |
|             environment: strapi.config.environment,
 | |
|             ...settings.init,
 | |
|           });
 | |
|           // Store the successfully initialized Sentry instance
 | |
|           instance = Sentry;
 | |
|           isReady = true;
 | |
|         } else {
 | |
|           strapi.log.info('@strapi/plugin-sentry is disabled because no Sentry DSN was provided');
 | |
|         }
 | |
|       } catch (error) {
 | |
|         strapi.log.warn('Could not set up Sentry, make sure you entered a valid DSN');
 | |
|       }
 | |
| 
 | |
|       return this;
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Expose Sentry instance through a getter
 | |
|      * @returns {Sentry}
 | |
|      */
 | |
|     getInstance() {
 | |
|       return instance;
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Callback to [configure an instance of Sentry's scope]{@link https://docs.sentry.io/platforms/node/enriching-events/scopes/#configuring-the-scope}
 | |
|      * @callback configureScope
 | |
|      * @param {Sentry.scope} scope
 | |
|      * @param {Sentry=} instance An initialized Sentry instance
 | |
|      */
 | |
| 
 | |
|     /**
 | |
|      * Higher level method to send exception events to Sentry
 | |
|      * @param {Error} error An error object
 | |
|      * @param {configureScope=} configureScope
 | |
|      */
 | |
|     sendError(error, configureScope) {
 | |
|       // Make sure Sentry is ready
 | |
|       if (!isReady) {
 | |
|         strapi.log.warn("Sentry wasn't properly initialized, cannot send event");
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       instance.withScope(scope => {
 | |
|         // Configure the Sentry scope using the provided callback
 | |
|         if (configureScope && settings.sendMetadata) {
 | |
|           configureScope(scope, instance);
 | |
|         }
 | |
|         // Actually send the Error to Sentry
 | |
|         instance.captureException(error);
 | |
|       });
 | |
|     },
 | |
|   };
 | |
| };
 | |
| 
 | |
| module.exports = createSentryService();
 | 
