fix(rollbar): odsiej z frontendu obce skrypty i zgłoszenia bez stack trace'u#680
fix(rollbar): odsiej z frontendu obce skrypty i zgłoszenia bez stack trace'u#680mpasternak wants to merge 2 commits into
Conversation
…trace'u Trzy aktywne itemy browser-js okazały się nie-naszymi błędami: - #1477 "Invalid regular expression: invalid group specifier name" — plik to cdn.userway.org/widgetapp/.../widget_app_base.js, czyli bundle widgetu dostępności UserWay. Lookbehind w regexie, nieobsługiwany przez Safari < 16.4 (zgłoszenia z Safari 15.6.1). Ich kod, ich wydanie. - #444 "(unknown): {}" — original_arg_types to ["string","htmllinkelement", "undefined"], a w telemetrii tuż przed tym fetch do api.userway.org. To zdarzenie error na elemencie <link> (nieudane ładowanie arkusza), które Rollbar serializuje do bezużytecznego "{}". - #502 "Unexpected token =" — Chrome 64 na Androidzie 8 (luty 2018). Brak filename i lineno; stack to sam komunikat. Pola klas w ciele `class` weszły w Chrome 72. Żadnego z nich nie da się naprawić w kodzie BPP ani nawet zdiagnozować. checkIgnore odsiewa więc: (a) błędy, których WSZYSTKIE ramki pochodzą z obcego origin, (b) zgłoszenia bez użytecznej ścieżki w żadnej ramce. Predykat siedzi w osobnym pliku statycznym, nie w szablonie, żeby dało się go przetestować (11 testów vitest). Jest zwykłym skryptem, nie modułem — rollbar.html ładuje go wcześnie w <head>, a type="module" odroczyłby wykonanie i część błędów z czasu ładowania strony uciekłaby. Filtr jest fail-open: brak skryptu albo wyjątek w samym filtrze → raportuj. Filtr, który przez własną awarię chowa prawdziwe błędy, jest gorszy niż brak filtra. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
Self-review wykrył dwie realne dziury w regule "brak użytecznej ścieżki →
wycisz", zmierzone na prawdziwych payloadach rollbar.js 3.1.0:
1. Ręczny `Rollbar.error("...")` buduje `body.message` BEZ `trace` i bez
ramek — czyli był wyciszany zawsze. Dziś w BPP nie ma takiego wywołania,
więc to nie regresja, tylko mina pod pierwsze użycie. Przy okazji ginął
komunikat samego Rollbara o przekroczeniu rate-limitu, czyli sygnał
"gubię itemy". Teraz: brak trace/trace_chain → NIGDY nie wyciszamy.
2. Item #502 (SyntaxError "Unexpected token =", Chrome 64) zaklasyfikowałem
jako nieszkodliwy szum. Błędnie. Przeglądarka ujawnia treść błędu
parsowania wyłącznie dla skryptów same-origin — obce bez CORS dostają
gołe "Script error.". Konkretny komunikat oznacza więc, że któryś z
NASZYCH statyków nie parsuje się na tej przeglądarce, czyli realną
regresję kompatybilności. Wyciszenie tego skasowałoby jedyny ślad.
Nowa reguła jest węższa: wyciszamy zgłoszenie bez lokalizacji tylko wtedy,
gdy nie ma też treści (klasa "(unknown)" i komunikat "{}" — dokładnie item
#444). Sam brak lokalizacji nie wystarcza; klasa i komunikat wystarczą, żeby
zacząć szukać. Odrzucone obietnice z reason innym niż Error (ramka
"(unknown)") też przestają być zjadane.
#1477 (UserWay) nadal wyciszony — łapie go reguła obcego hosta, niezależna
od klasy wyjątku.
Dwa testy z poprzedniego commita kodowały starą, za szeroką regułę i
zostały poprawione razem z nią.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
Poprawki po self-review — filtr zjadał NASZE błędyReview zmierzył prawdziwe payloady rollbar.js 3.1.0 (zamiast wierzyć moim 1. Ręczny
|
Problem
Trzy aktywne itemy
browser-jsokazały się nie naszymi błędami:Invalid regular expression: invalid group specifier namecdn.userway.org/widgetapp/…/widget_app_base.js— bundle widgetu dostępności UserWay. Lookbehind w regexie, nieobsługiwany przez Safari < 16.4 (zgłoszenia z Safari 15.6.1).(unknown): {}original_arg_types: ["string","htmllinkelement","undefined"], a w telemetrii tuż przed — fetch doapi.userway.org. To zdarzenieerrorna elemencie<link>(nieudane ładowanie arkusza), serializowane przez Rollbara do bezużytecznego{}.Unexpected token =filenameilineno— stack to sam komunikat. Pola klas w cieleclassweszły w Chrome 72.Żadnego nie da się naprawić w kodzie BPP ani nawet zdiagnozować — w dwóch
przypadkach nie wiadomo nawet, którego pliku dotyczą.
Rozwiązanie
checkIgnoreodsiewa dwie klasy zgłoszeń:"(unknown)"albo
filenamebędący komunikatem błędu. Bez pliku i linii nie ma czegoszukać.
Wystarczy jedna ramka z naszego origin, żeby raport przeszedł — mieszany
stos (nasz kod wywołany z obcego skryptu) nadal jest raportowany.
Predykat siedzi w osobnym pliku statycznym, nie w szablonie, żeby dało się
go przetestować. Jest zwykłym skryptem, nie modułem —
rollbar.htmlładujego wcześnie w
<head>, atype="module"odroczyłby wykonanie i część błędówz czasu ładowania strony uciekłaby przed inicjalizacją Rollbara.
Filtr jest fail-open: brak skryptu albo wyjątek w samym filtrze → raportuj.
Filtr, który przez własną awarię chowa prawdziwe błędy, jest gorszy niż brak
filtra. Testy to sprawdzają (
payloadnull/undefined/bezbody→false).Testy
tests/js/rollbar-filters.test.js— 11 testów vitest, napisane przedimplementacją (RED:
Failed to load url … rollbar-filters.js). Pokrywająwszystkie trzy produkcyjne przypadki plus
trace_chain(wyjątki łańcuchowe)i zachowanie fail-open.
npx vitest run— 57 passed (6 plików)src/django_bpp/tests— 108 passed (w tymtest_brak_zewnetrznych_assetow)Czego to NIE robi
Nie dodaje komunikatu „nieobsługiwana przeglądarka". Zebrane dane tego nie
uzasadniają: Safari 15.6.1 z #1477 jest w pełni sprawne — to bundle UserWaya
jest zbyt nowy, a Firefox 153 z #444 jest całkiem aktualny. Jedyna realnie
przestarzała przeglądarka to Chrome 64 z #502 (jedna sesja). Baner „twoja
przeglądarka jest nieobsługiwana" na wszystkich instalacjach to decyzja
produktowa, nie sprzątanie monitoringu — jeśli ma powstać, to osobno
i świadomie.
🤖 Generated with Claude Code
https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH