Commit Graph

3508 Commits

Author SHA1 Message Date
Chris Raible
829a0fc7e9
Added email analytics throughput metrics (#21694)
ref
https://linear.app/ghost/issue/ENG-1508/add-custom-metrics-for-email-analytics-jobs

- With the experimental job queue, we're using email analytics as our
initial validation test case. We're hoping to see an improvement in
Ghost's throughput for ingesting email events. However, we don't
currently collect this data point, so it's kind of impossible to tell
right now if the job queue is making things better or not.
- This PR fixes that by adding two new prometheus metrics:
- `email_analytics_events_processed` — a counter incremented each time
an event is processed. Sometimes the event has already been processed in
the past, so this doens't always result in a new event being stored in
the DB.
- `email_analytics_events_stored` — a counter incremented each time an
event is stored in the DB. For example, if an email is opened 3 times by
the same recipient, this counter will only be incremented once.
- The metrics also have a label for the event type, so we can split out
opened events from delivered events. We can use the `rate()` function in
grafana to then get an `events ingested per second` metric, and compare
sites with/without the job queue enabled.
2024-11-21 17:30:43 -08:00
Ronald Langeveld
49c0e60053
Fixed admin replies pagination to always sort old to new (#21679)
ref PLG-227

- added the correct order params for admin replies to ensure they are
sorted oldest to newest.
- hardcoded since we want to ensure it remains that way.
2024-11-21 11:38:47 +00:00
Sodbileg Gansukh
9493fbefcc
Moved the custom fonts feature to public beta (#21664)
ref DES-985
2024-11-21 19:06:40 +08:00
Ronald Langeveld
cf6884d098
Wired up Admin Comment Endpoints to UI (#21661)
ref PLG-227

- Updated logic that allows Admin Users on comments to interact with
some endpoints from a specific admin-only route.
- It pulls 2 admin specific routes:
- 1. an admin specific 'browse' route that includes hidden comments that
would otherwise be hidden from regular users and members.
- 2. A specific replies route, that would also include hidden comments
- This was needed in order to get accurate pagination.

- Additionally, it wires up the routes via `message-handler` that deal
with the potential cors issues.
- Includes style updates

---------

Co-authored-by: Sanne de Vries <sannedv@protonmail.com>
Co-authored-by: Kevin Ansfield <kevin@lookingsideways.co.uk>
2024-11-21 10:52:36 +00:00
Ghost CI
703ed9dfbc Merged v5.101.3 into main 2024-11-21 09:19:10 +00:00
Ghost CI
a238960726 v5.101.3 2024-11-21 09:19:08 +00:00
Fabien O'Carroll
3265e257b7 Fixed webhooks not firing for internal integrations
ref https://linear.app/ghost/issue/AP-598

We want to make sure that webhooks for internal integrations are fired even
when the custom integrations limit has been hit. In order to test this we've
had to update the fixtureManager to allow passing the integration type when
inserting fixture webhooks into the db.
2024-11-21 16:01:33 +07:00
Fabien O'Carroll
263c493e2b Refactored webhook restriction to WebhookTrigger
ref https://linear.app/ghost/issue/AP-598

This is not a change in functionality.

The ActivityPub integration is an `internal` integration, because we want it to
be available regardless of the plan a Ghost(Pro) site is on. However the
webhooks service is not able to differentiate between webhooks for a custom
integration and an internal one.

Rather than disable webhooks entirely when the custom integrations limit
active, we want to allow webhooks for internal integrations to work. The first
step towards that is keeping the listener for the model events and have the
limiting happen in the WebhookTrigger which allows us to be more specific as to
which webhooks should be triggered or not.
2024-11-21 16:01:30 +07:00
Ronald Langeveld
d800587225
Added new endpoint for loading replies as Admin (#21676)
ref PLG-227

- Wired up a new endpoint that would be able to paginate replies as an
admin user.
- The difference compared to the members-api endpoint is that this
includes hidden comments and includes the html string which is normally
hidden from non-admin users
2024-11-21 14:55:59 +08:00
Ronald Langeveld
f0dab9dc9a
Include hidden comments for admins in pagination count (#21675)
ref PLG-227

- Ensure hidden comments are included in the replies count for admin
users to ensure pagination works as expected.
2024-11-21 12:53:37 +08:00
Ronald Langeveld
68d8262fab
Fixed member comments replies pagination (#21674)
ref PLG-227

- Changed replies count to exclude hidden and deleted replies to ensure
the accuracy of pagination data for members.
2024-11-21 03:53:26 +00:00
Fabien O'Carroll
19ab98f836 Fixed webhooks not firing for internal integrations
ref https://linear.app/ghost/issue/AP-598

We want to make sure that webhooks for internal integrations are fired even
when the custom integrations limit has been hit. In order to test this we've
had to update the fixtureManager to allow passing the integration type when
inserting fixture webhooks into the db.
2024-11-21 03:38:43 +00:00
Fabien O'Carroll
0919ae0d05 Refactored webhook restriction to WebhookTrigger
ref https://linear.app/ghost/issue/AP-598

This is not a change in functionality.

The ActivityPub integration is an `internal` integration, because we want it to
be available regardless of the plan a Ghost(Pro) site is on. However the
webhooks service is not able to differentiate between webhooks for a custom
integration and an internal one.

Rather than disable webhooks entirely when the custom integrations limit
active, we want to allow webhooks for internal integrations to work. The first
step towards that is keeping the listener for the model events and have the
limiting happen in the WebhookTrigger which allows us to be more specific as to
which webhooks should be triggered or not.
2024-11-21 03:38:43 +00:00
Kevin Ansfield
46bdbaa3b8 Shipped comments-ui@0.22.0
no issue

- includes updates behind `commentImprovements` flag
- bumped to 0.22 to avoid changes going live before next Ghost release
2024-11-20 12:33:53 +00:00
Princi Vershwal
d17f52df9d
🐛 Fixed words breaking to new line in emails on mobile (#21652)
fixes https://linear.app/ghost/issue/DES-977/word-breaks-to-new-line-on-mobile-for-new-member-sign-up-email

- word-break is not required in the text "You can also copy & paste this URL into your browser:", so removed it
- word-break should be used in case of urls. No change in this
- Observed this patter across multiple email templates. Fixed all.
2024-11-19 10:43:32 +00:00
Kevin Ansfield
2163fd5db3 Fixed missing in_reply_to_snippet for replies
ref https://linear.app/ghost/issue/PLG-230

- the `inReplyTo` relationship was not being loaded for replies which meant the mapper never hit the code which adds `in_reply_to_snippet`
- moved all `in_reply_to` code behind the `commentImprovements` labs flag
- updated tests to correctly disable/enable the flag
- added test for browsing comments with replies-to-replies so `in_reply_to_snippet` is captured in the snapshot
2024-11-18 21:35:40 +00:00
Princi Vershwal
527fb05a29
Fixed staff member login when 2FA is ON (#21647)
Fixes
https://linear.app/ghost/issue/ENG-1775/staff-users-are-not-able-to-verify-session-if-2fa-flag-is-on
2024-11-18 18:43:23 +00:00
Ghost CI
6eae395b24 Merged v5.101.2 into main 2024-11-18 18:14:43 +00:00
Ghost CI
d41ccdde8d v5.101.2 2024-11-18 18:14:42 +00:00
Steve Larson
34d267decc Reverted custom fonts flag (#21645)
ref https://ghost.slack.com/archives/C025584CA/p1731950126867179

- moved custom fonts functionality back to a labs flag
- reverted gscan version to 4.45 which doesn't include the custom fonts
checks/warnings
2024-11-18 11:53:29 -06:00
Steve Larson
2447f37a14
Reverted custom fonts flag (#21645)
ref https://ghost.slack.com/archives/C025584CA/p1731950126867179

- moved custom fonts functionality back to a labs flag
- reverted gscan version to 4.45 which doesn't include the custom fonts
checks/warnings
2024-11-18 17:45:03 +00:00
Princi Vershwal
f2444b08f3
Added e2e test for sending invite to a staff member and user signing up using the invite link (#21637)
Fixes
https://linear.app/ghost/issue/ENG-1702/add-e2e-browser-test-for-staff-invite-and-accept-flow
2024-11-18 15:30:03 +00:00
Ghost CI
254acb3b86 v5.101.1 2024-11-15 19:32:06 +00:00
Steve Larson
842adcdc80 Added metrics for job queue and email analytics (#21626)
no ref

Added Prometheus metrics for the job queue throughput and email analytics throughput. We'll likely keep these around as good metrics to keep an eye on, though for the moment their primary function is to establish a baseline for users w/o the job queue enabled so we can observe the full impact once switching it on.
2024-11-15 13:17:42 -06:00
Ghost CI
0f64ec9dad v5.101.0 2024-11-15 15:05:41 +00:00
Ghost CI
12b0cd269f 🎨 Updated Source to v1.4.0 2024-11-15 15:05:41 +00:00
Ghost CI
e77e2190bf 🎨 Updated Casper to v5.8.0 2024-11-15 15:05:41 +00:00
Chris Raible
431719080e
Added prometheus metric for time to acquire connection (#21628)
ref
https://linear.app/ghost/issue/ENG-1769/improve-pool-utilization-metric

- Currently the connection pool metrics are all point in time metrics,
and with a scrape interval of 15s this doesn't tell us a whole lot about
what's happening in the pool.
- This commit adds a Summary metric to track the elapsed time each
transaction has to wait to acquire a connection from the pool, which
should be a good indication of contention in the pool.
- Also moved the call to `prometheusClient.instrumentKnex` to after `initCore` in the boot process, because the metric depends on event listeners on `knex.client.pool`, and the pool gets destroyed and recreated in `initCore`, which removes the listeners
2024-11-14 21:14:40 -08:00
Chris Raible
015b881bc1
Removed the metrics server from Ghost (#21629)
no issue

- Since we decided to use the pushgateway instead of running a metrics
server, this removes the metrics server and its e2e tests
- We may reintroduce it later, but for now this is a simpler setup
2024-11-15 03:39:12 +00:00
renovate[bot]
0aae3bb1fc
Update dependency gscan to v4.46.0 (#21617) 2024-11-14 20:10:03 +08:00
Sodbileg Gansukh
462fe9c12b
Updated the valid theme fixture (#21619)
no issues

- with gscan v4.46.0, we introduced a new rule for the custom fonts
feature
- this updates the valid theme zip file to make the theme tests work
with the new rules
2024-11-14 19:43:27 +08:00
Chris Raible
5a3b1d6cf8
Ensured prometheusClient is not initialized unless enabled via config (#21615)
no issue

- Currently the prometheus client is only initialized on boot if enabled
via config, but if it's required in other files (i.e. to create a custom
metric) it will be initialized then
- This commit explicitly checks if the prometheus client is enabled via
config before initializing it, thus preventing it from being initialized
when disabled
2024-11-13 18:34:36 -08:00
Steve Larson
9da4aa3bce
Updated donations tests to try to handle Stripe changes (#21607)
no ref

Stripe made changes (again) that causes our donation tests to fail. This
round we use an if statement to try to make it more inclusive of cases,
as I've seen them use an accordion button, card button, and no button
all in the past 12h.
2024-11-13 13:26:47 +00:00
renovate[bot]
ead408ed20
Updated Koenig packages (#21606)
ref https://linear.app/ghost/issue/ENG-1751

- changelog: 9ed048c5ff
2024-11-13 15:09:35 +08:00
Ronald Langeveld
06f6483aa7
Fixed broken Stripe donations browser tests (#21605)
no issue

Stripe recently updated their checkout page to use React with Framer
Motion for animations, causing our Playwright tests to intermittently
fail when attempting to click the “Card” payment button. The standard
Playwright `.click()` method was unable to interact with the button
reliably due to animation-related delays, where the button was present
in the DOM but not fully interactable according to Playwright’s strict
visibility checks.

Switching to `dispatchEvent('click')` directly fires the click event on
the button, bypassing Playwright’s visibility and interactability
checks. This ensures the test can proceed without waiting for animations
to fully complete, resolving the issue with the Stripe checkout flow.
2024-11-13 06:20:21 +00:00
Steve Larson
38f6bdaa72
Fixed flaky batch sending tests (#21604)
ref https://linear.app/ghost/issue/ENG-1749

Batch sending tests were failing with MySQL fairly regularly. It appears
to be a race condition where the listener for the batch sending job
having completed is returning too early, causing the subsequent
Bookshelf data model refresh to happen too soon.

This is a fundamental flaw in the JobManager awaitCompletion handler
(and how the batch sending system interacts with it) as there's no way
to identify one batch from another - they all use the same name, and we
don't pass along any metadata.
2024-11-12 16:15:43 -06:00
Kevin Ansfield
a25e79f041 Updated email golden-post snapshot to match modified bookmark rendering
ref https://github.com/TryGhost/Koenig/pull/1388

- includes new truncation of bookmark card content
2024-11-12 13:26:04 +00:00
renovate[bot]
a7a4b96aff Update Koenig packages 2024-11-12 13:26:04 +00:00
Sam Lord
07afa6500d
Changed SSO adapter to automatically verify sessions (#21388)
ref ENG-1680

SSO is a different flow that wouldn't need the extra email verification
flow
2024-11-11 22:26:40 +00:00
Sodbileg Gansukh
177e604501
Added custom fonts (#21564)
ref DES-949

This adds custom fonts feature allowing users to select heading and body fonts for their themes from a curated list. This allows publishers to have more control over their brand, and allows themes to have a wider range of styles to appeal to different audiences. 

Without custom fonts support, themes will continue to work as normal, but users won't be able to customize their typography. As for the official themes, all of them will support custom fonts.

---------

Co-authored-by: Aileen Booker <AileenCGN@gmail.com>
2024-11-11 18:38:02 +08:00
Ronald Langeveld
c349b9bf26
Added new hidden comments API implementation (#21444)
ref PLG-227

- Behind flags
- Changed Comments API for members and guests to not return hidden or
removed comments - with the only exception being if a hidden or removed
comment have published replies, in which case it will be greyed out as
per the previous version on the UI.
- Wired up a new admin API endpoint for comment to receive all comments.
It's on par with the members / guests endpoint, with the difference
being that it it shows hidden comment's content, where previously the
html property was nullified.
2024-11-11 15:00:59 +08:00
Chris Raible
85408d10b7
Added connection pool metrics to prometheus client (#21576)
ref
https://linear.app/ghost/issue/ENG-1592/start-monitoring-connection-pool-utilization-in-ghost

- This commit adds prometheus metrics to the connection pool so we can
start to track connection pool utilization, number of pending acquires,
and also adds some basic SQL query summary metrics like queries per
minute and query duration percentiles.
- The connection pool has now been theorized to be a main constraint of
Ghost for some time, but it's been challenging to get actual visibility
into the state of the connection pool. With this change, we should be
able to directly observe, monitor and alert on the connection pool.
- Updated grafana version to fix a bug in the query editor that was
fixed in 8.3, even though this is a couple versions ahead of production
2024-11-07 23:01:34 -08:00
Ghost CI
08fe08a0a2 Merged v5.100.1 into main 2024-11-07 23:24:07 +00:00
Ghost CI
d3625537e0 v5.100.1 2024-11-07 23:24:04 +00:00
Chris Raible
2eb1fdf7cd
Removed nodemon in favor of node --watch (#21572)
no issue

- We had reintroduced nodemon in
af0f26c75f (diff-bf18f8caf848e17b35e266db04bcaeaad05a3e5d069846615d2b1260482396e1)
for the docker setup, but it has since caused some issues with the `yarn
dev` script.
- In particular, it was causing a restart while migrations were running
in development, which left a migration lock on and prevented Ghost from
starting.
- This commit removes nodemon and replaces it with node --watch, which
we had been using in the past without issues.
2024-11-07 12:25:22 -08:00
Ghost CI
87b0c04e26 v5.100.0 2024-11-07 15:02:46 +00:00
Fabien 'egg' O'Carroll
d6cedaae06
Initialised ActivityPub integration on boot (#21558)
refs https://linear.app/ghost/issue/AP-500

We've got a new @tryghost/activitypub package, which is gonna handle all
of the wiring between Ghost and ActivityPub. Currently that is just the
configuration of webhooks for the internal ActivityPub integration.

All this logic is run on the boot of Ghost, though notably in a
non-blocking manner, it's initialised as part of the background services
so it should not have an effect on the time to serving requests. having
said that - it needs to be defensive against errors, which is why the
entire network request is in a try/catch, as well as lookups for the
integration able to handle missing data.

Unit tests use an in-memory sqlite instance, which means we're testing a
full flow, ideally there would be a way to get the schema from Ghost for
this, but for now this is acceptable IMO.
2024-11-07 13:55:51 +00:00
Fabien 'egg' O'Carroll
8f9dbcd0ea
Added Ghost ActivityPub internal integration (#21540)
refs https://linear.app/ghost/issue/AP-500

Rather than having to manually create an integration for communication
with the ActivityPub service, we are going to have an internal
integration which will then be used to handle webhooks between Ghost &
ActivityPub

The 'internal' type has been used to keep it out of the UI/API but
available for all Pro customers, which is necessary during the private
beta.

---------

Co-authored-by: Michael Barrett <mike@ghost.org>
2024-11-07 13:55:11 +00:00
Hannah Wolfe
bb9a69edfe
Added i18n for portal, newsletters, search, comments, etc (#21547)
ref https://ghost.org/changelog/internationalization/ closes:
https://linear.app/ghost/issue/ENG-1038/make-month-and-year-translatable

- This takes our automatic translations feature out of beta
- Translations are available in ~60 languages, although many are not yet complete
- Translations cover portal, comments, search, newsletter emails and member transactional emails
- If you find a missing translation, you can contribute it in the Ghost repo, by editing the files here: https://github.com/TryGhost/Ghost/tree/main/ghost/i18n/locales
- This feature was created 100% by the Ghost community

Co-authored-by: Cathy Sarisky <42299862+cathysarisky@users.noreply.github.com>
2024-11-07 13:04:45 +00:00
Cathy Sarisky
274f2aa8d3
🐛 Fixed translations not being picked up in newsletters without reboot (#21549)
ref https://ghost.org/changelog/internationalization/

- this fixes an error in which changing the language (or sliding the i18n
toggle) didn't correctly update email-service.

---------

Co-authored-by: Sag <guptazy@gmail.com>
2024-11-07 17:55:21 +08:00