Skip to content

Bump @sentry/profiling-node from 9.15.0 to 9.16.1 - #4

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/sentry/profiling-node-9.16.1
Closed

dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/sentry/profiling-node-9.16.1

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github May 8, 2025 •

Copy link
Copy Markdown
Contributor

Bumps @sentry/profiling-node from 9.15.0 to 9.16.1.

Release notes

Sourced from @​sentry/profiling-node's releases.

9.16.1

  • fix(core): Make sure logs get flushed in server-runtime-client (#16222)
  • ref(node): Remove vercel flushing code that does nothing (#16217)

Bundle size 📦

Path Size
@​sentry/browser 23.35 KB
@​sentry/browser - with treeshaking flags 23.19 KB
@​sentry/browser (incl. Tracing) 37.25 KB
@​sentry/browser (incl. Tracing, Replay) 74.47 KB
@​sentry/browser (incl. Tracing, Replay) - with treeshaking flags 68.34 KB
@​sentry/browser (incl. Tracing, Replay with Canvas) 79.12 KB
@​sentry/browser (incl. Tracing, Replay, Feedback) 90.93 KB
@​sentry/browser (incl. Feedback) 39.75 KB
@​sentry/browser (incl. sendFeedback) 27.98 KB
@​sentry/browser (incl. FeedbackAsync) 32.74 KB
@​sentry/react 25.16 KB
@​sentry/react (incl. Tracing) 39.24 KB
@​sentry/vue 27.63 KB
@​sentry/vue (incl. Tracing) 39.01 KB
@​sentry/svelte 23.38 KB
CDN Bundle 24.55 KB
CDN Bundle (incl. Tracing) 37.29 KB
CDN Bundle (incl. Tracing, Replay) 72.33 KB
CDN Bundle (incl. Tracing, Replay, Feedback) 77.64 KB
CDN Bundle - uncompressed 71.62 KB
CDN Bundle (incl. Tracing) - uncompressed 110.34 KB
CDN Bundle (incl. Tracing, Replay) - uncompressed 221.63 KB
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 234.15 KB
@​sentry/nextjs (client) 40.84 KB
@​sentry/sveltekit (client) 37.73 KB
@​sentry/node 143.93 KB
@​sentry/node - without tracing 95.77 KB
@​sentry/aws-serverless 120.16 KB

9.16.0

Important changes

  • feat: Create a Vite plugin that injects sentryConfig into the global config (#16197)

Add a new plugin makeConfigInjectorPlugin within our existing vite plugin that updates the global vite config with sentry options

  • feat(browser): Add option to sample linked traces consistently (#16037)

This PR implements consistent sampling across traces as outlined in (#15754)

  • feat(cloudflare): Add support for durable objects (#16180)

... (truncated)

Changelog

Sourced from @​sentry/profiling-node's changelog.

9.16.1

  • fix(core): Make sure logs get flushed in server-runtime-client (#16222)
  • ref(node): Remove vercel flushing code that does nothing (#16217)

9.16.0

Important changes

  • feat: Create a Vite plugin that injects sentryConfig into the global config (#16197)

Add a new plugin makeConfigInjectorPlugin within our existing vite plugin that updates the global vite config with sentry options

  • feat(browser): Add option to sample linked traces consistently (#16037)

This PR implements consistent sampling across traces as outlined in (#15754)

  • feat(cloudflare): Add support for durable objects (#16180)

This PR introduces a new instrumentDurableObjectWithSentry method to the SDK, which instruments durable objects. We capture both traces and errors automatically.

  • feat(node): Add Prisma integration by default (#16073)

Prisma integration is enabled by default, it should work for both ESM and CJS.

  • feat(react-router): Add client-side router instrumentation (#16185)

Adds client-side instrumentation for react router's HydratedRouter. To enable it, simply replace browserTracingIntegration() with reactRouterTracingIntegration() in your client-side init call.

  • fix(node): Avoid double-wrapping http module (#16177)

When running your application in ESM mode, there have been scenarios that resulted in the http/https emitting duplicate spans for incoming requests. This was apparently caused by us double-wrapping the modules for incoming request isolation.

In order to solve this problem, the modules are no longer monkey patched by us for request isolation. Instead, we register diagnosticschannel hooks to handle request isolation now. While this is generally not expected to break anything, there is one tiny change that _may affect you if you have been relying on very specific functionality:

The ignoreOutgoingRequests option of httpIntegration receives the RequestOptions as second argument. This type is not changed, however due to how the wrapping now works, we no longer pass through the full RequestOptions, but re-construct this partially based on the generated request. For the vast majority of cases, this should be fine, but for the sake of completeness, these are the only fields that may be available there going forward - other fields that may have existed before may no longer be set:

ignoreOutgoingRequests(url: string, {
  method: string;
  protocol: string;
  host: string;
  hostname: string; // same as host
  path: string;
  headers: OutgoingHttpHeaders;
})

Other changes

... (truncated)

Commits
  • 1603866 release: 9.16.1
  • 30487a1 Merge pull request #16223 from getsentry/prepare-release/9.16.1
  • a1bdb3c meta(changelog): Update changelog for 9.16.1
  • 22a0e35 fix(core): Make sure logs get flushed in server-runtime-client (#16222)
  • edabe21 ref(node): Remove vercel flushing code that does nothing (#16217)
  • 7bad3c0 Merge pull request #16220 from getsentry/master
  • e5c0ca1 Merge branch 'release/9.16.0'
  • aaaa9ab release: 9.16.0
  • 681742c Merge pull request #16207 from getsentry/prepare-release/9.16.0
  • 2687d26 Update changelog to latest develop
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [@sentry/profiling-node](https://github.com/getsentry/sentry-javascript) from 9.15.0 to 9.16.1.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](getsentry/sentry-javascript@9.15.0...9.16.1)

---
updated-dependencies:
- dependency-name: "@sentry/profiling-node"
  dependency-version: 9.16.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels May 8, 2025
@netlify

netlify Bot commented May 8, 2025 •

Copy link
Copy Markdown

✅ Deploy Preview for regal-bunny-0c8efe ready!

Name Link
🔨 Latest commit 41df96a
🔍 Latest deploy log https://app.netlify.com/sites/regal-bunny-0c8efe/deploys/681c2710f37a6200097fa46d
😎 Deploy Preview https://deploy-preview-4--regal-bunny-0c8efe.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site configuration.

@dependabot @github

dependabot Bot commented on behalf of github May 8, 2025

Copy link
Copy Markdown
Contributor Author

Looks like @sentry/profiling-node is up-to-date now, so this is no longer needed.

@dependabot dependabot Bot closed this May 8, 2025
@dependabot
dependabot Bot deleted the dependabot/npm_and_yarn/sentry/profiling-node-9.16.1 branch May 8, 2025 03:42
LucasSantana-Dev pushed a commit that referenced this pull request Mar 26, 2026
Summary:
- Replaced the old AI/purple-gradient aesthetic with a clean neutral dark design
- New palette: #0f1117 canvas, #161b22 sidebar, #1c2129 panel, Discord blurple #5865f2 as the only accent
- Switched to Inter font exclusively (removed Sora/Manrope)
- Removed all glow/shimmer/pulse/float animations and glassmorphism effects

Key changes:
- index.css: Full @theme rewrite with all lucky-* color tokens, semantic brand/text/surface/border tokens
  properly defined so bg-lucky-brand, text-lucky-brand, etc. generate correct Tailwind v4 classes
- Login.tsx: Clean two-column layout, blurple CTA, no "Neo-editorial" badge/gradient text
- Sidebar.tsx, Layout.tsx, GuildSwitcher.tsx, DashboardSidebar.tsx: Flat active states with
  2px blurple left-accent bar, Check icon instead of Sparkles, no glow rings
- Button.tsx, Card.tsx, StatTile.tsx, ActionPanel.tsx, EmptyState.tsx, SectionHeader.tsx:
  Updated to use lucky-brand/text-white pattern, removed text-black on accent buttons
- DashboardOverview, TrackHistory, LastFm, NowPlaying: Fixed leftover lucky-accent and
  from-purple references
- DESIGN_SYSTEM.md, BRANDING_GUIDE.md: Updated to reflect new design language
- replit.md: Updated UI/design system section with Tailwind v4 token rules and new palette docs
LucasSantana-Dev pushed a commit that referenced this pull request Mar 26, 2026
Summary:
- Replaced the old AI/purple-gradient aesthetic with a clean neutral dark design
- New palette: #0f1117 canvas, #161b22 sidebar, #1c2129 panel, Discord blurple #5865f2 as the only accent
- Switched to Inter font exclusively (removed Sora/Manrope)
- Removed all glow/shimmer/pulse/float animations and glassmorphism effects

Key changes:
- index.css: Full @theme rewrite with all lucky-* color tokens, semantic brand/text/surface/border tokens
  properly defined so bg-lucky-brand, text-lucky-brand, etc. generate correct Tailwind v4 classes
- Login.tsx: Clean two-column layout, blurple CTA, no "Neo-editorial" badge/gradient text
- Sidebar.tsx, Layout.tsx, GuildSwitcher.tsx, DashboardSidebar.tsx: Flat active states with
  2px blurple left-accent bar, Check icon instead of Sparkles, no glow rings
- Button.tsx, Card.tsx, StatTile.tsx, ActionPanel.tsx, EmptyState.tsx, SectionHeader.tsx:
  Updated to use lucky-brand/text-white pattern, removed text-black on accent buttons
- DashboardOverview, TrackHistory, LastFm, NowPlaying: Fixed leftover lucky-accent and
  from-purple references
- DESIGN_SYSTEM.md, BRANDING_GUIDE.md: Updated to reflect new design language
- replit.md: Updated UI/design system section with Tailwind v4 token rules and new palette docs
LucasSantana-Dev pushed a commit that referenced this pull request Mar 26, 2026
Summary:
- Replaced the old AI/purple-gradient aesthetic with a clean neutral dark design
- New palette: #0f1117 canvas, #161b22 sidebar, #1c2129 panel, Discord blurple #5865f2 as the only accent
- Switched to Inter font exclusively (removed Sora/Manrope)
- Removed all glow/shimmer/pulse/float animations and glassmorphism effects

Key changes:
- index.css: Full @theme rewrite with all lucky-* color tokens, semantic brand/text/surface/border tokens
  properly defined so bg-lucky-brand, text-lucky-brand, etc. generate correct Tailwind v4 classes
- Login.tsx: Clean two-column layout, blurple CTA, no "Neo-editorial" badge/gradient text
- Sidebar.tsx, Layout.tsx, GuildSwitcher.tsx, DashboardSidebar.tsx: Flat active states with
  2px blurple left-accent bar, Check icon instead of Sparkles, no glow rings
- Button.tsx, Card.tsx, StatTile.tsx, ActionPanel.tsx, EmptyState.tsx, SectionHeader.tsx:
  Updated to use lucky-brand/text-white pattern, removed text-black on accent buttons
- DashboardOverview, TrackHistory, LastFm, NowPlaying: Fixed leftover lucky-accent and
  from-purple references
- DESIGN_SYSTEM.md, BRANDING_GUIDE.md: Updated to reflect new design language
- replit.md: Updated UI/design system section with Tailwind v4 token rules and new palette docs
LucasSantana-Dev pushed a commit that referenced this pull request Mar 26, 2026
Summary:
- Replaced the old AI/purple-gradient aesthetic with a clean neutral dark design
- New palette: #0f1117 canvas, #161b22 sidebar, #1c2129 panel, Discord blurple #5865f2 as the only accent
- Switched to Inter font exclusively (removed Sora/Manrope)
- Removed all glow/shimmer/pulse/float animations and glassmorphism effects

Key changes:
- index.css: Full @theme rewrite with all lucky-* color tokens, semantic brand/text/surface/border tokens
  properly defined so bg-lucky-brand, text-lucky-brand, etc. generate correct Tailwind v4 classes
- Login.tsx: Clean two-column layout, blurple CTA, no "Neo-editorial" badge/gradient text
- Sidebar.tsx, Layout.tsx, GuildSwitcher.tsx, DashboardSidebar.tsx: Flat active states with
  2px blurple left-accent bar, Check icon instead of Sparkles, no glow rings
- Button.tsx, Card.tsx, StatTile.tsx, ActionPanel.tsx, EmptyState.tsx, SectionHeader.tsx:
  Updated to use lucky-brand/text-white pattern, removed text-black on accent buttons
- DashboardOverview, TrackHistory, LastFm, NowPlaying: Fixed leftover lucky-accent and
  from-purple references
- DESIGN_SYSTEM.md, BRANDING_GUIDE.md: Updated to reflect new design language
- replit.md: Updated UI/design system section with Tailwind v4 token rules and new palette docs
LucasSantana-Dev pushed a commit that referenced this pull request May 13, 2026
Summary:
- Replaced the old AI/purple-gradient aesthetic with a clean neutral dark design
- New palette: #0f1117 canvas, #161b22 sidebar, #1c2129 panel, Discord blurple #5865f2 as the only accent
- Switched to Inter font exclusively (removed Sora/Manrope)
- Removed all glow/shimmer/pulse/float animations and glassmorphism effects

Key changes:
- index.css: Full @theme rewrite with all lucky-* color tokens, semantic brand/text/surface/border tokens
  properly defined so bg-lucky-brand, text-lucky-brand, etc. generate correct Tailwind v4 classes
- Login.tsx: Clean two-column layout, blurple CTA, no "Neo-editorial" badge/gradient text
- Sidebar.tsx, Layout.tsx, GuildSwitcher.tsx, DashboardSidebar.tsx: Flat active states with
  2px blurple left-accent bar, Check icon instead of Sparkles, no glow rings
- Button.tsx, Card.tsx, StatTile.tsx, ActionPanel.tsx, EmptyState.tsx, SectionHeader.tsx:
  Updated to use lucky-brand/text-white pattern, removed text-black on accent buttons
- DashboardOverview, TrackHistory, LastFm, NowPlaying: Fixed leftover lucky-accent and
  from-purple references
- DESIGN_SYSTEM.md, BRANDING_GUIDE.md: Updated to reflect new design language
- replit.md: Updated UI/design system section with Tailwind v4 token rules and new palette docs
LucasSantana-Dev pushed a commit that referenced this pull request May 13, 2026
Summary:
- Replaced the old AI/purple-gradient aesthetic with a clean neutral dark design
- New palette: #0f1117 canvas, #161b22 sidebar, #1c2129 panel, Discord blurple #5865f2 as the only accent
- Switched to Inter font exclusively (removed Sora/Manrope)
- Removed all glow/shimmer/pulse/float animations and glassmorphism effects

Key changes:
- index.css: Full @theme rewrite with all lucky-* color tokens, semantic brand/text/surface/border tokens
  properly defined so bg-lucky-brand, text-lucky-brand, etc. generate correct Tailwind v4 classes
- Login.tsx: Clean two-column layout, blurple CTA, no "Neo-editorial" badge/gradient text
- Sidebar.tsx, Layout.tsx, GuildSwitcher.tsx, DashboardSidebar.tsx: Flat active states with
  2px blurple left-accent bar, Check icon instead of Sparkles, no glow rings
- Button.tsx, Card.tsx, StatTile.tsx, ActionPanel.tsx, EmptyState.tsx, SectionHeader.tsx:
  Updated to use lucky-brand/text-white pattern, removed text-black on accent buttons
- DashboardOverview, TrackHistory, LastFm, NowPlaying: Fixed leftover lucky-accent and
  from-purple references
- DESIGN_SYSTEM.md, BRANDING_GUIDE.md: Updated to reflect new design language
- replit.md: Updated UI/design system section with Tailwind v4 token rules and new palette docs
LucasSantana-Dev pushed a commit that referenced this pull request May 13, 2026
Summary:
- Replaced the old AI/purple-gradient aesthetic with a clean neutral dark design
- New palette: #0f1117 canvas, #161b22 sidebar, #1c2129 panel, Discord blurple #5865f2 as the only accent
- Switched to Inter font exclusively (removed Sora/Manrope)
- Removed all glow/shimmer/pulse/float animations and glassmorphism effects

Key changes:
- index.css: Full @theme rewrite with all lucky-* color tokens, semantic brand/text/surface/border tokens
  properly defined so bg-lucky-brand, text-lucky-brand, etc. generate correct Tailwind v4 classes
- Login.tsx: Clean two-column layout, blurple CTA, no "Neo-editorial" badge/gradient text
- Sidebar.tsx, Layout.tsx, GuildSwitcher.tsx, DashboardSidebar.tsx: Flat active states with
  2px blurple left-accent bar, Check icon instead of Sparkles, no glow rings
- Button.tsx, Card.tsx, StatTile.tsx, ActionPanel.tsx, EmptyState.tsx, SectionHeader.tsx:
  Updated to use lucky-brand/text-white pattern, removed text-black on accent buttons
- DashboardOverview, TrackHistory, LastFm, NowPlaying: Fixed leftover lucky-accent and
  from-purple references
- DESIGN_SYSTEM.md, BRANDING_GUIDE.md: Updated to reflect new design language
- replit.md: Updated UI/design system section with Tailwind v4 token rules and new palette docs
LucasSantana-Dev pushed a commit that referenced this pull request May 13, 2026
Summary:
- Replaced the old AI/purple-gradient aesthetic with a clean neutral dark design
- New palette: #0f1117 canvas, #161b22 sidebar, #1c2129 panel, Discord blurple #5865f2 as the only accent
- Switched to Inter font exclusively (removed Sora/Manrope)
- Removed all glow/shimmer/pulse/float animations and glassmorphism effects

Key changes:
- index.css: Full @theme rewrite with all lucky-* color tokens, semantic brand/text/surface/border tokens
  properly defined so bg-lucky-brand, text-lucky-brand, etc. generate correct Tailwind v4 classes
- Login.tsx: Clean two-column layout, blurple CTA, no "Neo-editorial" badge/gradient text
- Sidebar.tsx, Layout.tsx, GuildSwitcher.tsx, DashboardSidebar.tsx: Flat active states with
  2px blurple left-accent bar, Check icon instead of Sparkles, no glow rings
- Button.tsx, Card.tsx, StatTile.tsx, ActionPanel.tsx, EmptyState.tsx, SectionHeader.tsx:
  Updated to use lucky-brand/text-white pattern, removed text-black on accent buttons
- DashboardOverview, TrackHistory, LastFm, NowPlaying: Fixed leftover lucky-accent and
  from-purple references
- DESIGN_SYSTEM.md, BRANDING_GUIDE.md: Updated to reflect new design language
- replit.md: Updated UI/design system section with Tailwind v4 token rules and new palette docs
LucasSantana-Dev added a commit that referenced this pull request May 15, 2026
Anchors: Stripe Dashboard (asymmetric KPI weight), Linear (dense command list).
Fixes named anti-patterns #4 (hero-metric template) and #5 (identical card grid).

- KPI row: lead hero card (Total Members, text-5xl) + stepped-down compact
  rows for Active/Total Cases and Auto-Mod Actions, replacing the 4-equal
  StatTile template.
- Quick Actions: single surface-panel with divide-y rows (icon + title +
  desc + hover-reveal chevron) replacing 7 identical ActionPanel cards.
- Drop em-dash placeholder in track playedBy; show 'Unknown' instead.
- Add CompactStat inline component (right-column metric rows).
LucasSantana-Dev added a commit that referenced this pull request May 21, 2026
Re-opens [#918](#918) —
closed because its head SHA desynced from the branch tip during the
base-branch creation dance. Same code, same branch
(`refactor/backend-zod4`).

## Summary

Closes the Zod 3/4 drift that's been blocking the brace-expansion CVE
patch (issue #907).

**3 changes / ~6 lines net:**

| File | Before (Zod 3) | After (Zod 4) |
|---|---|---|
| `packages/backend/src/middleware/validate.ts:4` | `z.ZodType<T,
z.ZodTypeDef, unknown>` | `z.ZodType<T, unknown>` |
| `packages/backend/src/schemas/autoMessages.ts:9` | `{ required_error:
'Type is required' }` | `{ error: () => 'Type is required' }` |
| `packages/backend/src/schemas/autoMessages.ts:37` | `{ required_error:
'Enabled is required' }` | `{ error: () => 'Enabled is required' }` |

Plus clean lockfile regen (Zod 4.4.3 now hoists at root; `npm audit` 0
vulns).

## Verified locally

- ✓ `npm run build:shared`
- ✓ `npm run type:check --workspace=packages/backend`
- ✓ `npm test --workspace=packages/backend` — 66 suites / 832 tests pass
- ✓ `npm audit` 0 vulnerabilities

## Decision record

`docs/decisions/2026-05-21-backend-zod-3-to-4-migration.md` (on `main`).

## Test plan

- [ ] CI Quality Gates + SonarCloud + full quality.yml suite green
- [ ] Confirm OSV-Scanner (from `.github` PR #4) reports clean
- [ ] After merge: open the CVE follow-up PR (`brace-expansion` + `ws`
overrides)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated core package dependencies for security and compatibility
improvements.
* Improved internal validation system compatibility with the latest
framework standards.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/LucasSantana-Dev/Lucky/pull/919?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
LucasSantana-Dev added a commit that referenced this pull request Jun 17, 2026
## Context
#1275 (re-opened): autoplay `rejected` telemetry reads **0 all-time**
(269 rows) despite a working `accepted` path. The issue body's original
"sub-5s dead zone" root cause is **stale** — #1276 (c282414) already
records `rejected` for any skip <30% (and finish ≤30%), and the existing
`trackHandlers.spec.ts` covers every classification band *plus* an
interleaving "#1275 probe". So **criterion #1 and #4 are already met**,
and a code race is largely ruled out.

What's left is empirical — **H1 (code)** vs **H2 (signal genuinely
rare)** — and it can't be settled from the current logs: `"Track
skipped"` only carries title/url, not the decision inputs.

## Change (observability + tests only — no behavior change)
- Emit a structured **`Autoplay outcome eval`** INFO log for every
**autoplay** terminal event on **both** `playerFinish` and `playerSkip`,
carrying `{ path, guildId, trackId, hasStartTime, durationMS,
playedRatio, recordedOutcome }`. It fires even when the start time is
missing (`hasStartTime: false`) — capturing the H1 race directly.
- `recordedOutcome` ∈ `rejected | accepted | ambiguous(dropped) |
none(no-timing)` so Loki queries are one-liners.
- 5 new tests asserting the diagnostic shape across bands + the
no-timing case + non-autoplay exclusion. Full suite: **25/25 green**,
type-check clean.

## Why not "fix" now
Per the re-open analysis, patching the suspected non-bug would just add
noise. This makes the prod distribution observable so the next read
**settles** H1 vs H2.

## After deploy — operator read (LogQL)
```
{container_name="lucky-bot"} |= `Autoplay outcome eval`
```
- Many `recordedOutcome=ambiguous(dropped)` or `accepted` on
`path=finish` for real skips → **H1** (skips route through finish /
threshold mis-tuned) → then adjust.
- Few autoplay terminal events at all, most picks never played → **H2**
(signal rare; instrument is correct) → close as working-as-intended +
revisit over-queueing.

Issue stays **open** pending that read; this PR does not close it.

Refs #1275

<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Add structured autoplay outcome diagnostics to investigate why
`rejected` reads as zero in prod (refs #1275). No behavior changes; logs
fire on both skip and finish with tests added.

- **New Features**
- Emit `Autoplay outcome eval` INFO logs for autoplay terminal events on
`playerFinish` and `playerSkip` (non-autoplay excluded).
- Fields: { path, guildId, trackId, hasStartTime, durationMS,
playedRatio,
recordedOutcome∈`rejected|accepted|ambiguous(dropped)|none(no-timing)`
}; logs even without a start time; `playedRatio` rounded to 3 decimals.
- Outcome rules: < threshold → `rejected`; finish ≥ threshold →
`accepted`; skip ≥ threshold → `ambiguous(dropped)`. Tests: 5 cases
cover skip/finish bands, no-timing, and non-autoplay exclusion.

<sup>Written for commit 7eb3f85.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/LucasSantana-Dev/Lucky/pull/1491?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->
LucasSantana-Dev added a commit that referenced this pull request Sep 27, 2026
#2401)

Closes #2392
Closes #2390

## What

Phase P2a of `decisions/2026-09-26-lucky-owned-observability-stack.md`
(sections 1, 4, 5). Code only, nothing deployed anywhere.

- `observability/` directory: Prometheus config (scrapes bot `:9091` and
  backend `/metrics`, 30d/5GB retention), the moved + fixed alert rules
(`lucky-alerts.rules.yml`), new `disk.rules.yml` (disk-free
warn/critical +
  the always-firing `Watchdog` rule), and full Grafana provisioning
(datasource, `Lucky ops` starter dashboard, alerting: `email-primary`
and
`watchdog-offbox` contact points, notification policy routing `Watchdog`
  to the off-box contact with a 1m repeat).
- `docker-compose.yml`: `prometheus`, `grafana`, `node-exporter`
services
under the `observability` profile, pinned images, explicit `mem_limit`s
  (512m/256m/64m), no host ports, named volumes, host root mounted
  read-only into node-exporter.
- Heartbeat (#2390) consolidated into one implementation
(`packages/shared/src/utils/monitoring/heartbeat.ts`), used by both bot
  and backend. The bot passes an `isReady` gate (client.isReady()); the
  backend has none and pings unconditionally. Env vars renamed to
  `HEARTBEAT_PING_URL` / `HEARTBEAT_PING_URL_EXTERNAL` /
  `HEARTBEAT_INTERVAL_MS`, same names on both services, declared in
`docker-compose.yml`. The bot's separate `HeartbeatService` is removed.
- `monitoring/README.md` trimmed: Layer 3 now points at
`observability/`;
Layers 1-2 stay as reference. `monitoring/prometheus/` removed (content
  moved via `git mv`).

## Alerting choice

Grafana-managed alerting, not a separate Alertmanager: fewer containers,
Grafana is already the single pane per the ADR, and vanilla OSS
Prometheus
has no ruler write API for Grafana to manage its native rule files
directly.
Prometheus still loads `observability/prometheus/rules/*.yml` (so
`promtool`/`/api/v1/rules` and a future Alertmanager/Mimir migration
still
work) but those evaluations are inert for delivery; the rules that
actually
notify are the Grafana-managed copies in
`observability/grafana/provisioning/alerting/rules.yaml`, querying the
same
PromQL by hand. Full writeup in `observability/README.md`.

## P2a friction log (gate: more than 3 means stop and revisit before
P2b)

1. Compose interpolates every service's env vars at parse time
regardless of
   active profile; a `:?` (required) on the new Grafana vars broke plain
`docker compose up` even without the `observability` profile. Fixed with
   `:-` defaults instead.
2. The `lucky-resource-pressure` rule group (moved from `monitoring/`)
needs
cAdvisor, which P2a does not deploy; those four rules stay defined but
   are dormant until cAdvisor is added.
3. Vanilla Prometheus has no ruler API, forcing the same alert logic to
be
hand-duplicated between Prometheus-native rules and Grafana-managed ones
   (see "Alerting choice" above).
4. Unverified assumption: Grafana's `${VAR}` provisioning-file env
expansion
for the two contact points. Not verified against a running container
this
   session (see #5); flagged for runtime verification.
5. Local-environment-only, not the platform's fault: this session's
colima
Docker install had a corrupted containerd store, blocking `docker run`
   for a `promtool` container check. Filed separately as #2400. Worked
   around with `promtool` from Homebrew; `promtool check config`/`check
   rules` both passed against the files directly.

4 of 5 are platform-relevant (#5 is local tooling only), which crosses
the
ADR's "more than 3" threshold. Flagging for the operator to weigh before
committing further to P2b; nothing here blocks the prototype itself
(config
and rule checks both pass).

## Verification

- `docker compose config -q` (no profile) and `docker compose --profile
observability config -q`: both pass, dummy env vars only, no `.env*`
read.
- `promtool check config` / `promtool check rules`: both pass (via
Homebrew
  `promtool`, since local Docker could not run containers, see #2400).
- All YAML/JSON files in `observability/` parse cleanly.
- `npx tsc -b` (shared), `npx tsc --noEmit` (bot, backend): clean.
- `eslint -c eslint.config.js` on changed non-test `.ts` files: no
issues.
- `packages/shared/src/utils/monitoring/heartbeat.spec.ts`: 6/6 pass
(added
  tests for the `isReady` gate and the never-throws contract).
- `packages/bot/src/bot/start/initializer.spec.ts`: 40/40 pass.
- Full `packages/shared` suite: 79 suites / 1523 tests pass.

## Not done / not in scope

- Nothing was deployed to the homelab or any remote host. No containers
were
  started outside local `docker compose config` validation.
- Grafana's env-var expansion for contact points is unverified at
runtime
  (friction #4).
- cAdvisor and the resource-pressure alerts it feeds are not part of
P2a.

<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Adds a file-provisioned Prometheus/Grafana stack as an opt-in Compose
profile and consolidates the heartbeat into one shared implementation.
Code only; nothing is deployed.

Closes #2392 and #2390.

**Observability stack**

- New `observability/` profile runs `prometheus`, `alertmanager`,
`grafana`, `node-exporter`, and `cadvisor` with pinned images, memory
limits, and no host ports.
- Alert rules live only in Prometheus
(`observability/prometheus/rules/*.yml`); Alertmanager owns routing and
delivery, so Grafana is dashboards-only with no alerting of its own.
- Adds the always-firing `Watchdog` rule routed to an off-box webhook
and new disk-free warn/critical rules; cAdvisor now feeds the moved
`lucky-resource-pressure` rules, which previously had no data source.
- Alertmanager's config is rendered by a one-shot `envsubst` service;
the SMTP password and Watchdog URL use Alertmanager `_file` options fed
by Compose secrets so no secret lands in plain text.
- Adds two pt-BR Grafana dashboards for a non-PromQL operator: a home
dashboard with a question→where-to-look table and a full system-health
dashboard whose thresholds match the alert rules.

**Heartbeat**

- Replaces the bot's `HeartbeatService` with the shared
`startHeartbeat`/`stopHeartbeat`, used by both bot and backend.
- Env vars renamed to `HEARTBEAT_PING_URL` /
`HEARTBEAT_PING_URL_EXTERNAL` / `HEARTBEAT_INTERVAL_MS`, with
per-service source vars (`_BOT` / `_BACKEND`) so a URL-keyed external
monitor can tell them apart; each resolves through per-service → shared
`HEARTBEAT_*` → legacy `HEALTHCHECK_*`, so an unconfigured var never
silently disables the heartbeat for un-migrated deployments.
- The bot passes an `isReady` gate so a disconnected gateway goes
silent; the backend pings unconditionally.

<sup>Written for commit 30c3e5d.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/LucasSantana-Dev/Lucky/pull/2401?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants