Przejdź do głównej zawartości

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.

  • Regułę projektu, która ustala nazwy pól, zestawy etykiet i poziomy logów, zanim agent napisze jakikolwiek kod.
  • Logger pino z kontekstem żądania, maskowaniem sekretów i trace_id w każdej linii.
  • Metryki prom-client z 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 traceparent mię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.

  1. Zapisz konwencje jako regułę projektu. Bez niej agent wybiera nazwy pól osobno w każdym pliku: requestId w middleware, req_id w serwisie zamówień, request_id w testach. Reguła ujednolica każdy kolejny prompt. Gdzie reguły leżą i jak się ładują, opisuje strona o regułach projektu w Cursorze.

  2. 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.

  3. 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.

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:

Okno terminala
docker run --rm -v "$PWD/monitoring:/m" --entrypoint promtool \
prom/prometheus check rules /m/alerts/api.yml /m/alerts/business.yml
docker run --rm -v "$PWD/monitoring:/m" --entrypoint promtool \
prom/prometheus test rules /m/alerts/tests/api_test.yml

Bramka: 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.

WarstwaCo może się zepsuć po cichuSprawdzenie, które to łapie
LogiSekrety w logach; request_id przecieka między żądaniamiTesty maskowania sekretów i współbieżności na przechwyconym wyjściu
MetrykiEtykiety bez limitu wartości; zła etykieta trasyTest liczby serii i test dozwolonych kluczy etykiet na metrykach aplikacji
Trace’ySDK ładuje się za późno; brak propagacjiTest dymny z traceparent i eksporterem w pamięci
AlertyReguła nigdy się nie odpala albo reaguje na szumpromtool test rules z przypadkami pozytywnymi i negatywnymi
DashboardyPanele 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.

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.