Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chore/sentry #476

Merged
merged 17 commits into from
Jan 22, 2024
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"dependencies": {
"@clavinjune/codemirror-metricsql": "^0.0.1-dev.1010230001",
"@lezer/highlight": "^1.1.6",
"@sentry/react": "^7.81.1",
"@skbkontur/react-icons": "^5.2.9",
"@skbkontur/react-stack-layout": "1.0.3",
"@skbkontur/react-ui": "^4.16.0",
Expand Down
14 changes: 11 additions & 3 deletions src/Containers/ErrorContainer.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
import React, { ReactElement } from "react";
import { Layout, LayoutContent, LayoutTitle } from "../Components/Layout/Layout";

export default function ErrorContainer(): ReactElement {
interface IErrorContainerProps {
message: string;
title: string;
}

export default function ErrorContainer({
message = "Page not found",
title = "404",
}: IErrorContainerProps): ReactElement {
return (
<Layout>
<LayoutContent>
<LayoutTitle>404</LayoutTitle>
<p>Page not found</p>
<LayoutTitle>{title}</LayoutTitle>
<p>{message}</p>
</LayoutContent>
</Layout>
);
Expand Down
1 change: 1 addition & 0 deletions src/Domain/Config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ export interface Config {
isPlottingAvailable: boolean;
isSubscriptionToAllTagsAvailable: boolean;
};
sentry?: { dsn: string };
}
21 changes: 16 additions & 5 deletions src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,32 @@ import { LocaleContext } from "@skbkontur/react-ui/lib/locale/LocaleContext";
import MoiraApi from "./Api/MoiraApi";
import { ApiProvider } from "./Api/MoiraApiInjection";
import checkMobile from "./helpers/check-mobile";
import * as Sentry from "@sentry/react";
import ErrorContainer from "./Containers/ErrorContainer";
import { initSentry } from "./helpers/initSentry";

import "./style.less";

const root = document.getElementById("root");

const moiraApi = new MoiraApi("/api");

initSentry(moiraApi);

const root = document.getElementById("root");

const render = (Component: ComponentType) => {
if (root !== null) {
ReactDOM.render(
<BrowserRouter>
<LocaleContext.Provider value={{ langCode: LangCodes.en_GB }}>
<ApiProvider value={moiraApi}>
<Component />
</ApiProvider>
<Sentry.ErrorBoundary
fallback={({ error, componentStack }) => (
<ErrorContainer title={error.toString()} message={componentStack} />
)}
>
<ApiProvider value={moiraApi}>
<Component />
</ApiProvider>
</Sentry.ErrorBoundary>
</LocaleContext.Provider>
</BrowserRouter>,
root
Expand Down
18 changes: 18 additions & 0 deletions src/helpers/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,21 @@ export const clearInput = (input: string | Array<string>): string => {

return cleared;
};

export enum Platform {
LOCAL = "local",
DEV = "dev",
STAGING = "staging",
PROD = "prod",
}

const isPlatform = (platform: Platform): boolean => {
return window.location.hostname.includes(platform);
};
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hostname.includes() не очень безопасно.

В идеале фронт не должен знать где он запускается, и такие настройки получать либо зашитыми при билде, либо запросом в бэк.

Но эт сложна, так что предлагаю тут себя обезопасить:

  1. вместо includes использовать startsWith
  2. в enum Platform прописать полные hostname'ы

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тому есть причина: опенсорсность, 1. мы не знаем как у себя будут разворачивать мойру люди извне(с какими хост именами), а .includes дает хоть какой-то универсальности 2. тут просто нельзя добавить список наших хостов)

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так как в сентри вы настроили белый список доменов, и там только контуровские,
то значит от развёрнутых извне мойр вы не хотите получать ошибки.

Поэтому:

  1. мы не знаем как у себя будут разворачивать мойру люди извне(с какими хост именами)

Вообще плевать на другие мойры

  1. тут просто нельзя добавить список наших хостов)

Не вижу причин почему нельзя.

А ещё определение платформы ты затащил чисто под сентри который мы используем чисто под контуровскую мойру.

Поэтому предлагаю такие изменения:

  1. сменить нейминг platform - > sentryKonturPlatform или konturPlatform

  2. Оставить комментарий, что сентри работает только для контуровских доменов и не влияет на самостоятельно развёрнутые мойры

  3. Всё таки в енам запихнуть полные хостнеймы и вместо includes() использовать startsWith() или даже ===
    (можно ещё оставить коммент с ссылкой на настройки мойры, где эти домены прописаны, но это необязательно)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

на правах крокодила и прочитавшего по диагонали: если что можно утащить в конфиги ж

Copy link
Member Author

@EduardZaydler EduardZaydler Jan 17, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вообще плевать на другие мойры

не соглашусь.
а по поводу окружения, пока предлагаю оставить так и завести задачу на добавить к возвращаемому dsn еще и площадку, что бы можно было и сконфигурировать это дело и не хранить инфу о площадке на фронте

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

так мб сразу?
нам одну строчку у себя добавить как я поняла надо на бэке

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если данные о платформе утащите на бэк, будет прям огонь

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

будем Даню ждать или кто-нибудь из ребят сделает?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

заведи сначала тасочку с пожелахами и че куда как делать, а там разберемся)


export const getPlatform = (): Platform => {
if (isPlatform(Platform.PROD)) return Platform.PROD;
if (isPlatform(Platform.DEV)) return Platform.DEV;
if (isPlatform(Platform.STAGING)) return Platform.STAGING;
return Platform.LOCAL;
};
25 changes: 25 additions & 0 deletions src/helpers/initSentry.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import MoiraApi from "../Api/MoiraApi";
import { getPlatform, Platform } from "./common";
import * as Sentry from "@sentry/react";

const getDSN = async (api: MoiraApi) => {
try {
const { sentry } = await api.getConfig();
return sentry?.dsn;
} catch (error) {
return Promise.reject("Error getting DSN");
}
};

const isLocalPlatform = getPlatform() === Platform.LOCAL;

export const initSentry = async (api: MoiraApi) => {
const key = await getDSN(api);
Sentry.init({
dsn: key,
debug: isLocalPlatform,
environment: getPlatform(),
enabled: !isLocalPlatform,
tracesSampleRate: 1.0,
});
};
Loading