Konfiguracja logowania i monitoringu w Cursorze
Konfiguracja logowania i monitoringu w Cursorze polega na tym, że agent Cursora generuje dla serwisu cztery warstwy obserwowalności oraz dashboardy: ustrukturyzowane logi JSON, metryki Prometheusa, trace’y OpenTelemetry i reguły alertów. Agent pisze każdą warstwę szybko, bo konwencje są dobrze udokumentowane; zaufaj warstwie dopiero wtedy, gdy dowiedzie tego test, promtool lub test dymny trace’ów.
Ta strona jest dla programistów, którzy utrzymują serwis w Node.js lub TypeScripcie, i dla tech leadów, którzy ustalają konwencje obserwowalności w zespole. O 2:00 w nocy dzwoni pager: „wysoki odsetek błędów w API zamówień”. W logach jest tylko Internal Server Error, bez ID żądania, bez trasy i bez użytkownika, a skoku na dashboardzie nie da się powiązać z żadną linią kodu. Rozwiązaniem nie jest więcej logów. Są nim logi, metryki i trace’y, które dzielą identyfikatory, oraz alerty reagujące na objawy odczuwalne przez użytkownika.
Co daje stos obserwowalności zbudowany przez agenta
Dział zatytułowany „Co daje stos obserwowalności zbudowany przez agenta”- Regułę projektu, która ustala nazwy pól, zestawy etykiet i poziomy logów, zanim agent napisze jakikolwiek kod.
- Logger
pinoz kontekstem żądania, maskowaniem sekretów itrace_idw każdej linii. - Metryki
prom-clientz ograniczonym zestawem etykiet oraz test, który nie przechodzi, gdy ktoś doda etykietę o nieograniczonej liczbie wartości. - Tracing OpenTelemetry ładowany przed aplikacją, który propaguje nagłówek W3C
traceparentmiędzy serwisami. - Reguły alertów Prometheusa z testami jednostkowymi w
promtool, więc wiesz, że każdy alert działa, zanim sprawdzi go produkcja. - Cursora podłączonego przez MCP do Sentry lub Grafany, dzięki czemu agent czyta prawdziwą telemetrię podczas debugowania.
Przykłady używają Expressa na Node.js. Prompty działają też z Fastify, NestJS czy route handlerami Next.js, gdy zmienisz nazwę frameworka i sposób odczytu wzorca trasy (na przykład routeOptions.url w Fastify).
W jakiej kolejności agent powinien budować obserwowalność?
Dział zatytułowany „W jakiej kolejności agent powinien budować obserwowalność?”Buduj warstwy w kolejności zależności: konwencje, potem logi, metryki, trace’y, alerty, a dashboardy na końcu. Alerty odpytują nazwy metryk, a dashboardy jedno i drugie, więc wygenerowane jako pierwsze wskazywałyby serie, które nie istnieją. Każdy krok poniżej kończy się bramką. Nie zaczynaj kolejnego, dopóki bramka nie jest zielona.
-
Zapisz konwencje jako regułę projektu. Bez niej agent wybiera nazwy pól osobno w każdym pliku:
requestIdw middleware,req_idw serwisie zamówień,request_idw testach. Reguła ujednolica każdy kolejny prompt. Gdzie reguły leżą i jak się ładują, opisuje strona o regułach projektu w Cursorze. -
Poproś o plan przed kodem. Przełącz agenta w Plan Mode i każ mu zinwentaryzować to, co już istnieje. Plan Mode „tworzy szczegółowe plany implementacji przed napisaniem jakiegokolwiek kodu” (dokumentacja Cursora, sprawdzone 2026-08-28), więc agent nie dokręci drugiego loggera do serwisu, który już jeden ma.
-
Generuj jedną warstwę na rozmowę. Nowa rozmowa dla każdej warstwy utrzymuje mały kontekst i diff, który da się przejrzeć. Commituj po każdej zielonej bramce, żeby wadliwą warstwę dało się czysto wycofać przez
git revert.
Wygeneruj ustrukturyzowane logowanie z kontekstem żądania
Dział zatytułowany „Wygeneruj ustrukturyzowane logowanie z kontekstem żądania”Logi są pierwszą warstwą, bo wszystkie pozostałe odwołują się do ich identyfikatorów. Prompt poniżej prosi w jednym przebiegu o logger, middleware żądań i test, który dowodzi, że oba działają.
Bramka: trzy testy przechodzą, a przykładowa linia zawiera request_id i żadnego sekretu. Najważniejszy jest test współbieżności: przeciek AsyncLocalStorage między żądaniami jest niewidoczny przy ręcznym sprawdzeniu jednego żądania.
Kontekst biznesowy dodawaj później przez logger potomny dla jednostki pracy, a nie nowe pola w każdym wywołaniu: „W src/services/orders.ts utwórz na początku processOrder child logger z order_id i customer_id i używaj go w każdej linii logu tej funkcji”. Identyfikatory biznesowe należą do logów, gdzie każda linia to jedno zdarzenie, i nigdy do etykiet metryk.
Dodaj metryki Prometheusa bez eksplozji kardynalności
Dział zatytułowany „Dodaj metryki Prometheusa bez eksplozji kardynalności”Metryki odpowiadają zbiorczo na pytania „jak często” i „jak wolno”. Prawdziwą decyzją projektową jest zestaw etykiet. Każda odrębna kombinacja wartości etykiet tworzy nową serię czasową, więc jedna etykieta user_id zamienia licznik w osobną serię na każdego użytkownika.
Bramka: test liczby serii przechodzi. Przypadek unmatched łapie najczęstszy błąd w wygenerowanym kodzie: req.path albo req.originalUrl jako etykietę, co działa w demo, a pod ruchem skanera tworzy osobną serię na każdy URL.
Podłącz tracing OpenTelemetry między serwisami
Dział zatytułowany „Podłącz tracing OpenTelemetry między serwisami”Tracing łączy jedno żądanie użytkownika w wielu serwisach i przez trace_id wiąże je z liniami logów. SDK dla Node.js ma jedną twardą zasadę, którą agent często pomija: musi się załadować przed importem express, http i klientów baz danych. Inaczej automatyczna instrumentacja niczego nie łata, a ty dostajesz puste trace’y bez żadnego błędu.
Bramka: test dymny przechodzi. Dowodzi trzech rzeczy, które inaczej sprawdzałbyś ręcznie w trzech narzędziach: SDK załadowało się na czas, logger czyta aktywny span, a propagacja działa w wywołaniach wychodzących. Nazwy pakietów powyżej są aktualne w npm na 2026-09-26 (@opentelemetry/sdk-node 0.222.0, @opentelemetry/auto-instrumentations-node 0.80.0).
Wygeneruj reguły alertów i udowodnij, że się odpalają
Dział zatytułowany „Wygeneruj reguły alertów i udowodnij, że się odpalają”Alertuj na objawy odczuwalne przez użytkownika, takie jak odsetek błędów i opóźnienie, a nie na przyczyny w rodzaju CPU. Agent dobrze pisze składnię reguł Prometheusa. Luką są progi, których nikt nigdy nie przećwiczył. Zamyka ją promtool test rules: podaje regułom syntetyczne serie i sprawdza, które alerty odpalają się w której minucie.
Uruchom bramkę w terminalu. Obraz prom/prometheus zawiera promtool, więc nie potrzebujesz lokalnej instalacji Prometheusa:
docker run --rm -v "$PWD/monitoring:/m" --entrypoint promtool \ prom/prometheus check rules /m/alerts/api.yml /m/alerts/business.ymldocker run --rm -v "$PWD/monitoring:/m" --entrypoint promtool \ prom/prometheus test rules /m/alerts/tests/api_test.ymlBramka: obie komendy kończą się kodem 0. Dodaj je do CI obok testów jednostkowych, żeby późniejsza zmiana nazwy metryki psuła build, a nie budziła dyżurnego. Gdzie umieścić ten job, pokazuje strona CI/CD z Cursorem.
Dashboardy są na końcu i niosą najmniejsze ryzyko: błędny panel wprowadza człowieka w błąd, a błędny alert go budzi. Poproś o JSON dashboardu Grafany ze zmiennymi szablonu environment i service oraz po jednym wierszu na ruch, błędy, opóźnienie i nasycenie. Każ agentowi używać wyłącznie nazw metryk z src/lib/metrics.ts. Zaimportuj dashboard do stagingowej Grafany i sprawdź, czy każdy panel zwraca dane.
Pozwól Cursorowi czytać telemetrię z produkcji przez MCP
Dział zatytułowany „Pozwól Cursorowi czytać telemetrię z produkcji przez MCP”Wygenerowana instrumentacja to połowa pętli. Druga połowa to agent, który czyta, co ta instrumentacja raportuje, gdy coś się psuje. Cursor wczytuje serwery MCP z .cursor/mcp.json w projekcie albo globalnie z ~/.cursor/mcp.json. Oficjalny zdalny serwer Sentry używa OAuth, więc konfiguracja nie zawiera żadnego sekretu:
{ "mcpServers": { "sentry": { "url": "https://mcp.sentry.dev/mcp" } }}Dzięki temu prompt debugujący może zaczynać się od prawdziwych danych, a nie od wklejonego stack trace’a:
Dla metryk i logów Grafana Labs publikuje oficjalny serwer (uvx mcp-grafana, PyPI 1.6.0 na 2026-09-26), który odpytuje Prometheusa i Lokiego. Uruchamiaj go z --disable-write, żeby agent mógł czytać dashboardy, ale nie mógł ich zmieniać. Token konta serwisowego trzymaj w zmiennych środowiskowych, nigdy w commitowanym mcp.json. Konfigurację obu serwerów w różnych narzędziach opisują strony konfiguracja MCP w Cursorze i serwery MCP do obserwowalności.
Automations w Cursorze potrafią też uruchomić Cloud Agenta na zdarzenie z Sentry lub PagerDuty (dokumentacja Cursora, sprawdzone 2026-08-28). To przydaje się do wstępnej diagnozy w pull requeście, ale poprawka i tak przechodzi przez twoje zwykłe testy i review. Zanim podepniesz alert pod agenta, przeczytaj stronę o Cloud Agents i Automations.
Jak zweryfikować wygenerowany kod obserwowalności bez czytania go w całości?
Dział zatytułowany „Jak zweryfikować wygenerowany kod obserwowalności bez czytania go w całości?”Każda warstwa ma sprawdzenie behawioralne, które trwa kilka sekund. Razem zastępują przegląd linia po linii kilkuset linii instrumentacji.
| Warstwa | Co może się zepsuć po cichu | Sprawdzenie, które to łapie |
|---|---|---|
| Logi | Sekrety w logach; request_id przecieka między żądaniami | Testy maskowania sekretów i współbieżności na przechwyconym wyjściu |
| Metryki | Etykiety bez limitu wartości; zła etykieta trasy | Test liczby serii i test dozwolonych kluczy etykiet na metrykach aplikacji |
| Trace’y | SDK ładuje się za późno; brak propagacji | Test dymny z traceparent i eksporterem w pamięci |
| Alerty | Reguła nigdy się nie odpala albo reaguje na szum | promtool test rules z przypadkami pozytywnymi i negatywnymi |
| Dashboardy | Panele odpytują metryki, które nie istnieją | Import do stagingowej Grafany; każdy panel pokazuje dane |
Za testy odpowiada programista, który otwiera pull request. Tech lead odpowiada za regułę projektu i zatwierdza progi i priorytety alertów, bo to one decydują, kogo obudzi pager. Wzrokiem czytasz już niewiele: plik reguły, listę etykiet i progi alertów.
Kiedy wygenerowany kod obserwowalności zawodzi
Dział zatytułowany „Kiedy wygenerowany kod obserwowalności zawodzi”Trace’y są puste i nic nie zgłasza błędu. SDK OpenTelemetry zostało zaimportowane po express lub http, więc niczego nie załatało. Druga przyczyna, przy buildzie ESM: SDK ładuje się pierwsze, ale brakuje hooka loadera, więc importy ESM nie zostają załatane. Naprawa: przenieś ładowanie do --import lub --require w komendzie startowej, dla aplikacji ESM dodaj --experimental-loader=@opentelemetry/instrumentation/hook.mjs, jak w prompcie o tracingu, i uruchom ponownie test dymny.
Po wdrożeniu rosną rachunki za przechowywanie metryk. Jakaś etykieta niesie surowy URL, identyfikator albo komunikat błędu. Naprawa: odpytaj Prometheusa o liczbę serii na metrykę (count by (__name__)({__name__=~"http_.*"})), znajdź winną etykietę i dopisz ją do listy zakazanych w regule projektu, żeby kolejne generowanie jej nie powtórzyło. Test kluczy etykiet pilnuje tego później.
Agent dopisał własne middleware tworzące spany obok automatycznej instrumentacji. Każde żądanie daje dwa zagnieżdżone spany serwerowe o tej samej nazwie. Naprawa: usuń własne middleware, a withSpan zostaw tylko dla kroków biznesowych. Prompt o tracingu mówi to od razu, bo agent domyślnie dodaje takie middleware.
Nazwy atrybutów nie pasują do zapytań w twoim backendzie. Wygenerowany kod często używa przestarzałych atrybutów http.method i http.status_code. Naprawa: zapisz aktualne konwencje w regule projektu, jak w prompcie o konwencjach, i poproś agenta o migrację istniejących spanów w jednym przebiegu.
Alerty odpalają się codziennie i ktoś je wycisza. Progi wybrano bez danych. Naprawa: przez pierwsze dwa tygodnie ustaw nowym alertom severity: ticket, porównaj historię ich odpaleń z prawdziwymi incydentami i dopiero te, które się pokryły, podnieś do page. Dla każdego zmienionego progu dodaj przypadek w promtool.
Logi produkcyjne są zbyt gadatliwe. Agent logował na poziomie info wewnątrz pętli. Naprawa: wyszukaj wywołania loggera w ciałach for i map, przenieś je na debug i potwierdź, że LOG_LEVEL bez ustawionej wartości przyjmuje domyślnie info, żeby produkcja nigdy nie logowała na poziomie debug, chyba że ktoś ustawi go celowo.