diff --git a/app/Exceptions/Trackers/Bugsnag.php b/app/Exceptions/Trackers/Bugsnag.php index 818c39ec2..9e5f943bd 100644 --- a/app/Exceptions/Trackers/Bugsnag.php +++ b/app/Exceptions/Trackers/Bugsnag.php @@ -2,28 +2,23 @@ namespace App\Exceptions\Trackers; +use App\Traits\Trackers as Base; use Throwable; class Bugsnag { + use Base; + public static function beforeSend(Throwable $e): void { app('bugsnag')->setAppVersion(version('short')); - app('bugsnag')->registerCallback(function ($report) { + $tags = $this->getTrackerTags(); + + app('bugsnag')->registerCallback(function ($report) use($tags) { $report->setMetaData([ - 'akaunting' => [ - 'company_id' => (string) company_id(), - 'locale' => (string) app()->getLocale(), - 'timezone' => (string) config('app.timezone'), - 'route_name' => (string) static::getRouteName(), - ] + 'akaunting' => $tags ]); }); } - - public static function getRouteName(): ?string - { - return request()->route()?->getName(); - } } diff --git a/app/Exceptions/Trackers/Sentry.php b/app/Exceptions/Trackers/Sentry.php index 8bad77c3b..1258c2c20 100644 --- a/app/Exceptions/Trackers/Sentry.php +++ b/app/Exceptions/Trackers/Sentry.php @@ -2,6 +2,7 @@ namespace App\Exceptions\Trackers; +use App\Traits\Trackers as Base; use Illuminate\Support\Str; use Sentry\Event; use Sentry\EventHint; @@ -9,17 +10,15 @@ use Sentry\Tracing\SamplingContext; class Sentry { + use Base; + public static function beforeSend(Event $event, ?EventHint $hint): ?Event { $event->setRelease(version('short')); - $event->setTags([ - 'company_id' => (string) company_id(), - 'locale' => (string) app()->getLocale(), - 'timezone' => (string) config('app.timezone'), - 'app_type' => (string) static::getAppType(), - 'route_name' => (string) static::getRouteName(), - ]); + $tags = $this->getTrackerTags(); + + $event->setTags($tags); return $event; } @@ -49,28 +48,4 @@ class Sentry return false; } - - public static function getAppType(): string - { - $hostname = gethostname(); - - if (Str::contains($hostname, '-queue-')) { - $app_type = 'queue'; - } elseif (Str::contains($hostname, '-cron-')) { - $app_type = 'cron'; - } elseif (request()->isApi()) { - $app_type = 'api'; - } elseif (app()->runningInConsole()) { - $app_type = 'console'; - } else { - $app_type = 'ui'; - } - - return $app_type; - } - - public static function getRouteName(): ?string - { - return request()->route()?->getName(); - } } diff --git a/app/Traits/Trackers.php b/app/Traits/Trackers.php new file mode 100644 index 000000000..bbe5d85ae --- /dev/null +++ b/app/Traits/Trackers.php @@ -0,0 +1,43 @@ + (string) company_id(), + 'locale' => (string) app()->getLocale(), + 'timezone' => (string) config('app.timezone'), + 'app_type' => (string) static::getAppType(), + 'route_name' => (string) static::getRouteName(), + ]; + } + + public static function getAppType(): string + { + $hostname = gethostname(); + + if (Str::contains($hostname, '-queue-')) { + $app_type = 'queue'; + } elseif (Str::contains($hostname, '-cron-')) { + $app_type = 'cron'; + } elseif (request()->isApi()) { + $app_type = 'api'; + } elseif (app()->runningInConsole()) { + $app_type = 'console'; + } else { + $app_type = 'ui'; + } + + return $app_type; + } + + public static function getRouteName(): ?string + { + return request()->route()?->getName(); + } +} diff --git a/app/View/Components/Script/Exceptions/Trackers.php b/app/View/Components/Script/Exceptions/Trackers.php new file mode 100644 index 000000000..6a11b40db --- /dev/null +++ b/app/View/Components/Script/Exceptions/Trackers.php @@ -0,0 +1,132 @@ +channel = $this->getChannel($channel); + $this->action = $this->getAction($action); + $this->ip = $this->getIp($ip); + $this->tags = $this->getTags($tags); + $this->params = $this->getParams($params); + } + /** + * Get the view / contents that represent the component. + * + * @return \Illuminate\Contracts\View\View|string + */ + public function render() + { + return view('components.script.exceptions.trackers'); + } + + public function getChannel($channel) + { + if (! empty($channel)) { + return $channel; + } + + return config('logging.default'); + } + + public function getAction($action) + { + if (! empty($action)) { + return $action; + } + + switch ($this->channel) { + case 'bugsnag': + $action = config('bugsnag.api_key'); + break; + case 'sentry': + $action = config('sentry.dsn'); + break; + } + + return $action; + } + + public function getIp($ip) + { + if (! empty($ip)) { + return $ip; + } + + return Info::ip(); + } + + public function getTags($tags) + { + if (! empty($tags)) { + return $tags; + } + + return $this->getTrackerTags(); + } + + public function getParams($params) + { + if (! empty($params)) { + return $params; + } + + switch ($this->channel) { + case 'bugsnag': + $params = [ + 'app_version' => version('short'), + ]; + break; + case 'sentry': + $params = [ + 'release' => version('short'), + 'traces_sample_rate' => $this->sentryTracesSampleRate(), + ]; + break; + } + + return $params; + } + + public static function sentryTracesSampleRate() + { + $user_agent = request()->userAgent(); + + $filter_agents = explode(',', env('SENTRY_TRACES_FILTER_AGENTS')); + + foreach ($filter_agents as $filter_agent) { + if (! Str::contains($user_agent, $filter_agent)) { + continue; + } + + return 0.0; + } + + return (float) config('sentry.traces_sample_rate', 1.0); + } +} diff --git a/resources/assets/js/exceptions/trackers/bugsnag.js b/resources/assets/js/exceptions/trackers/bugsnag.js new file mode 100644 index 000000000..7e9e193ae --- /dev/null +++ b/resources/assets/js/exceptions/trackers/bugsnag.js @@ -0,0 +1 @@ +// Will added as soon as possible \ No newline at end of file diff --git a/resources/assets/js/exceptions/trackers/sentry.js b/resources/assets/js/exceptions/trackers/sentry.js new file mode 100644 index 000000000..c5ce338d1 --- /dev/null +++ b/resources/assets/js/exceptions/trackers/sentry.js @@ -0,0 +1,34 @@ +import * as Sentry from "@sentry/vue"; +import { BrowserTracing } from "@sentry/tracing"; + +export default { + install(Vue) { + alert(exception_tracker.params.traces_sample_rate); + + Sentry.init({ + Vue, + dsn: exception_tracker.action, + logErrors: true, + integrations: [ + new BrowserTracing({ + tracingOrigins: [], + }), + ], + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + tracesSampleRate: exception_tracker.params.traces_sample_rate, + }); + + Sentry.setUser({ + id: exception_tracker.user.id, + username: exception_tracker.user.name, + email: exception_tracker.user.email, + ip_address: exception_tracker.ip, + }); + + for (const [key, value] of Object.entries(exception_tracker.tags)) { + Sentry.setTag(key, value); + } + } +} diff --git a/resources/assets/js/mixins/global.js b/resources/assets/js/mixins/global.js index cf9e2cc00..d99630bae 100644 --- a/resources/assets/js/mixins/global.js +++ b/resources/assets/js/mixins/global.js @@ -38,30 +38,20 @@ import GLightbox from 'glightbox'; Swiper.use([Navigation, Pagination]); -//sentry integration -import * as Sentry from "@sentry/vue"; -import { BrowserTracing } from "@sentry/tracing"; +import Bugsnag from './../exceptions/trackers/bugsnag'; +import Sentry from './../exceptions/trackers/sentry'; -if (sentry_dsn && sentry_dsn != '' && sentry_dsn != undefined) { - Sentry.init({ - Vue, - dsn: sentry_dsn, - logErrors: true, - integrations: [ - new BrowserTracing({ - tracingOrigins: [], - }), - ], - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for performance monitoring. - // We recommend adjusting this value in production - tracesSampleRate: 1.0, - }); - - Sentry.setUser(sentry_user[0]); - Sentry.setTag("sentry_tag", "here"); +// Exception Tracket start here!!s +if (typeof exception_tracker != 'undefined') { + switch (exception_tracker.channel) { + case 'bugsnag': + Vue.use(Bugsnag); + break; + case 'sentry': + Vue.use(Sentry); + break; + } } -//sentry integration export default { components: { diff --git a/resources/views/components/layouts/admin/head.blade.php b/resources/views/components/layouts/admin/head.blade.php index e3c9017b3..79a7f3831 100644 --- a/resources/views/components/layouts/admin/head.blade.php +++ b/resources/views/components/layouts/admin/head.blade.php @@ -41,17 +41,10 @@ var url = '{{ url("/" . company_id()) }}'; var app_url = '{{ config("app.url") }}'; var aka_currency = {!! !empty($currency) ? $currency : 'false' !!}; - var sentry_dsn = "https://9ffc5a5f104d4087911f60714e8bdbe9@o4503982427078656.ingest.sentry.io/4503999793594368"; - var sentry_user = [ - { - id: 34, - email: "burak@akaunting.com", - username: "brkcvn", - ip_address: "http://akaunting_v5.test/1" - } - ] //--> + + @stack('js') + + @stack('js') + + @stack('js') + + @stack('js') + + @stack('js') + + @stack('js') +@endif