ember.tsx 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. import {Fragment} from 'react';
  2. import {buildSdkConfig} from 'sentry/components/onboarding/gettingStartedDoc/buildSdkConfig';
  3. import crashReportCallout from 'sentry/components/onboarding/gettingStartedDoc/feedback/crashReportCallout';
  4. import widgetCallout from 'sentry/components/onboarding/gettingStartedDoc/feedback/widgetCallout';
  5. import TracePropagationMessage from 'sentry/components/onboarding/gettingStartedDoc/replay/tracePropagationMessage';
  6. import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step';
  7. import type {
  8. Docs,
  9. DocsParams,
  10. OnboardingConfig,
  11. } from 'sentry/components/onboarding/gettingStartedDoc/types';
  12. import {getUploadSourceMapsStep} from 'sentry/components/onboarding/gettingStartedDoc/utils';
  13. import {
  14. getCrashReportJavaScriptInstallStep,
  15. getCrashReportModalConfigDescription,
  16. getCrashReportModalIntroduction,
  17. getFeedbackConfigOptions,
  18. getFeedbackConfigureDescription,
  19. } from 'sentry/components/onboarding/gettingStartedDoc/utils/feedbackOnboarding';
  20. import {
  21. getProfilingDocumentHeaderConfigurationStep,
  22. MaybeBrowserProfilingBetaWarning,
  23. } from 'sentry/components/onboarding/gettingStartedDoc/utils/profilingOnboarding';
  24. import {
  25. getReplayConfigOptions,
  26. getReplayConfigureDescription,
  27. getReplayVerifyStep,
  28. } from 'sentry/components/onboarding/gettingStartedDoc/utils/replayOnboarding';
  29. import {featureFlagOnboarding} from 'sentry/gettingStartedDocs/javascript/javascript';
  30. import {t, tct} from 'sentry/locale';
  31. type Params = DocsParams;
  32. const getIntegrations = (params: Params): string[] => {
  33. const integrations = [];
  34. if (params.isProfilingSelected) {
  35. integrations.push(`Sentry.browserProfilingIntegration()`);
  36. }
  37. if (params.isReplaySelected) {
  38. integrations.push(
  39. `Sentry.replayIntegration(${getReplayConfigOptions(params.replayOptions)})`
  40. );
  41. }
  42. if (params.isFeedbackSelected) {
  43. integrations.push(`
  44. Sentry.feedbackIntegration({
  45. colorScheme: "system",
  46. ${getFeedbackConfigOptions(params.feedbackOptions)}
  47. }),`);
  48. }
  49. return integrations;
  50. };
  51. const getDynamicParts = (params: Params): string[] => {
  52. const dynamicParts: string[] = [];
  53. if (params.isPerformanceSelected) {
  54. dynamicParts.push(`
  55. // Tracing
  56. tracesSampleRate: 1.0, // Capture 100% of the transactions
  57. // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled
  58. tracePropagationTargets: ["localhost", /^https:\\/\\/yourserver\\.io\\/api/]`);
  59. }
  60. if (params.isReplaySelected) {
  61. dynamicParts.push(`
  62. // Session Replay
  63. replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production.
  64. replaysOnErrorSampleRate: 1.0 // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur.`);
  65. }
  66. if (params.isProfilingSelected) {
  67. dynamicParts.push(`
  68. // Set profilesSampleRate to 1.0 to profile every transaction.
  69. // Since profilesSampleRate is relative to tracesSampleRate,
  70. // the final profiling rate can be computed as tracesSampleRate * profilesSampleRate
  71. // For example, a tracesSampleRate of 0.5 and profilesSampleRate of 0.5 would
  72. // results in 25% of transactions being profiled (0.5*0.5=0.25)
  73. profilesSampleRate: 1.0`);
  74. }
  75. return dynamicParts;
  76. };
  77. const getSdkSetupSnippet = (params: Params) => {
  78. const config = buildSdkConfig({
  79. params,
  80. staticParts: [`dsn: "${params.dsn.public}"`],
  81. getIntegrations,
  82. getDynamicParts,
  83. });
  84. return `
  85. import Application from "@ember/application";
  86. import Resolver from "ember-resolver";
  87. import loadInitializers from "ember-load-initializers";
  88. import config from "./config/environment";
  89. import * as Sentry from "@sentry/ember";
  90. Sentry.init({
  91. ${config}
  92. });
  93. export default class App extends Application {
  94. modulePrefix = config.modulePrefix;
  95. podModulePrefix = config.podModulePrefix;
  96. Resolver = Resolver;
  97. }
  98. `;
  99. };
  100. const getInstallConfig = () => [
  101. {
  102. language: 'bash',
  103. code: `
  104. # Using ember-cli
  105. ember install @sentry/ember
  106. `,
  107. },
  108. ];
  109. const getVerifyEmberSnippet = () => `
  110. myUndefinedFunction();`;
  111. const onboarding: OnboardingConfig = {
  112. introduction: params => (
  113. <Fragment>
  114. <MaybeBrowserProfilingBetaWarning {...params} />
  115. <p>
  116. {tct('In this quick guide you’ll use [strong:npm] or [strong:yarn] to set up:', {
  117. strong: <strong />,
  118. })}
  119. </p>
  120. </Fragment>
  121. ),
  122. install: () => [
  123. {
  124. type: StepType.INSTALL,
  125. description: t(
  126. 'Sentry captures data by using an SDK within your application’s runtime.'
  127. ),
  128. configurations: getInstallConfig(),
  129. },
  130. ],
  131. configure: (params: Params) => [
  132. {
  133. type: StepType.CONFIGURE,
  134. description: tct(
  135. 'You should [code:init] the Sentry SDK as soon as possible during your application load up in [code:app.js], before initializing Ember:',
  136. {
  137. code: <code />,
  138. }
  139. ),
  140. configurations: [
  141. {
  142. code: [
  143. {
  144. label: 'JavaScript',
  145. value: 'javascript',
  146. language: 'javascript',
  147. code: getSdkSetupSnippet(params),
  148. },
  149. ],
  150. },
  151. ...(params.isProfilingSelected
  152. ? [getProfilingDocumentHeaderConfigurationStep()]
  153. : []),
  154. ],
  155. },
  156. getUploadSourceMapsStep({
  157. guideLink: 'https://docs.sentry.io/platforms/javascript/guides/ember/sourcemaps/',
  158. ...params,
  159. }),
  160. ],
  161. verify: () => [
  162. {
  163. type: StepType.VERIFY,
  164. description: t(
  165. "This snippet contains an intentional error and can be used as a test to make sure that everything's working as expected."
  166. ),
  167. configurations: [
  168. {
  169. code: [
  170. {
  171. label: 'JavaScript',
  172. value: 'javascript',
  173. language: 'javascript',
  174. code: getVerifyEmberSnippet(),
  175. },
  176. ],
  177. },
  178. ],
  179. },
  180. ],
  181. nextSteps: () => [],
  182. };
  183. const replayOnboarding: OnboardingConfig = {
  184. install: () => [
  185. {
  186. type: StepType.INSTALL,
  187. description: tct(
  188. 'You need a minimum version 7.27.0 of [code:@sentry/ember] in order to use Session Replay. You do not need to install any additional packages.',
  189. {
  190. code: <code />,
  191. }
  192. ),
  193. configurations: getInstallConfig(),
  194. },
  195. ],
  196. configure: (params: Params) => [
  197. {
  198. type: StepType.CONFIGURE,
  199. description: getReplayConfigureDescription({
  200. link: 'https://docs.sentry.io/platforms/javascript/guides/ember/session-replay/',
  201. }),
  202. configurations: [
  203. {
  204. code: [
  205. {
  206. label: 'JavaScript',
  207. value: 'javascript',
  208. language: 'javascript',
  209. code: getSdkSetupSnippet(params),
  210. },
  211. ],
  212. },
  213. ],
  214. additionalInfo: <TracePropagationMessage />,
  215. },
  216. ],
  217. verify: getReplayVerifyStep(),
  218. nextSteps: () => [],
  219. };
  220. const feedbackOnboarding: OnboardingConfig = {
  221. install: () => [
  222. {
  223. type: StepType.INSTALL,
  224. description: tct(
  225. 'For the User Feedback integration to work, you must have the Sentry browser SDK package, or an equivalent framework SDK (e.g. [code:@sentry/ember]) installed, minimum version 7.85.0.',
  226. {
  227. code: <code />,
  228. }
  229. ),
  230. configurations: getInstallConfig(),
  231. },
  232. ],
  233. configure: (params: Params) => [
  234. {
  235. type: StepType.CONFIGURE,
  236. description: getFeedbackConfigureDescription({
  237. linkConfig:
  238. 'https://docs.sentry.io/platforms/javascript/guides/ember/user-feedback/configuration/',
  239. linkButton:
  240. 'https://docs.sentry.io/platforms/javascript/guides/ember/user-feedback/configuration/#bring-your-own-button',
  241. }),
  242. configurations: [
  243. {
  244. code: [
  245. {
  246. label: 'JavaScript',
  247. value: 'javascript',
  248. language: 'javascript',
  249. code: getSdkSetupSnippet(params),
  250. },
  251. ],
  252. },
  253. ],
  254. additionalInfo: crashReportCallout({
  255. link: 'https://docs.sentry.io/platforms/javascript/guides/ember/user-feedback/#crash-report-modal',
  256. }),
  257. },
  258. ],
  259. verify: () => [],
  260. nextSteps: () => [],
  261. };
  262. const crashReportOnboarding: OnboardingConfig = {
  263. introduction: () => getCrashReportModalIntroduction(),
  264. install: (params: Params) => getCrashReportJavaScriptInstallStep(params),
  265. configure: () => [
  266. {
  267. type: StepType.CONFIGURE,
  268. description: getCrashReportModalConfigDescription({
  269. link: 'https://docs.sentry.io/platforms/javascript/guides/ember/user-feedback/configuration/#crash-report-modal',
  270. }),
  271. additionalInfo: widgetCallout({
  272. link: 'https://docs.sentry.io/platforms/javascript/guides/ember/user-feedback/#user-feedback-widget',
  273. }),
  274. },
  275. ],
  276. verify: () => [],
  277. nextSteps: () => [],
  278. };
  279. const profilingOnboarding: OnboardingConfig = {
  280. ...onboarding,
  281. introduction: params => <MaybeBrowserProfilingBetaWarning {...params} />,
  282. };
  283. const docs: Docs = {
  284. onboarding,
  285. feedbackOnboardingNpm: feedbackOnboarding,
  286. replayOnboarding,
  287. crashReportOnboarding,
  288. profilingOnboarding,
  289. featureFlagOnboarding,
  290. };
  291. export default docs;