-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Celery Queue for subscribe send email workflow
- Setups a celery queue backed by redis - Updates the subscribe feature in nextjs to do the following depending on error_boundary=true/false -- Send a enqueue request to flask -- Showcase error boundary - Adds enqueue endpoint - Update run.sh to start celery with the flask server
- Loading branch information
Showing
11 changed files
with
150 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -29,7 +29,7 @@ Query params to be added to the demo app. These query parameters can be stacked | |
- `[email protected]` - lets you [pass in a specific user email](https://github.com/sentry-demos/empower/blob/fce289530f72ce47fe2c7482cdbd9aa8bcc13b6e/react/src/index.js#L218-L219) | ||
- `?frontendSlowdown=true` - used in the [frontend-only demo flow](https://github.com/sentry-demos/empower/blob/fce289530f72ce47fe2c7482cdbd9aa8bcc13b6e/react/src/index.js#L200-L207), which showcases a frontend slowdown via profiling. | ||
- `?rageclick=true` - causes the checkout button to stop working, so you can rageclick it. This will prevent the checkout error from happening. If you want to still demo the checkout error AND a rageclick, you can rageclick manually on the 'Contact Us' button that shows on the page after the Checkout Error occurs. | ||
|
||
- `?error_boundary=true` - enables the error boundary functionality in subscribe instead of putting a message on the queue (NextJS only, react will always use error boundary) | ||
``` | ||
# example | ||
https://localhost:5000/?se=chris&backend=flask&frontendSlowdown=true | ||
|
@@ -183,6 +183,6 @@ gcloud config list, to display current account | |
|
||
1. Add your OPENAI_API_KEY= to local.env | ||
2. Run next and flask (./deploy.sh --env=local next flask) | ||
3. Get suggestion button should show automatically | ||
3. Get suggestion button should show automatically | ||
|
||
On main page load, next will check with flask if it has the OPEN_API_KEY and conditionally show the get suggestion input. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,3 +15,4 @@ Werkzeug==3.0.3 | |
flask_caching==2.3.0 | ||
openai==1.52.2 | ||
tiktoken==0.8.0 | ||
celery==5.4.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
from celery import Celery, signals | ||
import sentry_sdk, os, dotenv | ||
import os | ||
|
||
dotenv.load_dotenv() | ||
|
||
redis_host = os.environ.get("REDISHOST", "localhost") | ||
redis_port = int(os.environ.get("REDISPORT")) | ||
|
||
redis_url = f"redis://{redis_host}:{redis_port}/1" | ||
|
||
app = Celery('subscribe', | ||
broker=redis_url, | ||
backend=redis_url, | ||
include=['src.queues.tasks']) | ||
|
||
# Initialize Sentry SDK on Celery startup | ||
@signals.celeryd_init.connect | ||
def init_sentry(**_kwargs): | ||
dotenv.load_dotenv() | ||
RELEASE = os.environ["RELEASE"] | ||
DSN = os.environ["FLASK_APP_DSN"] | ||
ENVIRONMENT = os.environ["FLASK_ENV"] | ||
sentry_sdk.init( | ||
dsn=DSN, | ||
release=RELEASE, | ||
environment=ENVIRONMENT, | ||
traces_sample_rate=1.0, | ||
profiles_sample_rate=1.0, | ||
) | ||
|
||
if __name__ == '__main__': | ||
app.start() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import sentry_sdk | ||
from .celery import app | ||
import time, random | ||
|
||
|
||
@app.task | ||
def sendEmail(email): | ||
try: | ||
time.sleep(random.randrange(5)) # Simulate a delay | ||
if random.randrange(5) % 2 == 0: # Check if the random number is even | ||
raise Exception("sending email error") | ||
else: | ||
print("Sending email to: " + email) | ||
except Exception as e: | ||
# Log the exception to Sentry | ||
sentry_sdk.capture_exception(e) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
import { NextResponse } from "next/server"; | ||
import { | ||
determineBackendUrl, | ||
} from '@/src/utils/backendrouter'; | ||
|
||
export async function POST(request) { | ||
try { | ||
console.log("Here in POST"); | ||
|
||
|
||
const { email } = await request.json(); | ||
if (!email) { | ||
return NextResponse.json({ error: 'Email is required' }, { status: 400 }); | ||
} | ||
|
||
const backendUrl = determineBackendUrl('flask'); | ||
const resp = await fetch(`${backendUrl}/enqueue`, { | ||
method: 'POST', | ||
headers: { 'Content-Type': 'application/json' }, | ||
body: JSON.stringify({ email }), | ||
}); | ||
|
||
if (!resp.ok) { | ||
const errorText = await resp.text(); | ||
console.error('Backend error:', errorText); | ||
return NextResponse.json({ error: 'Failed to enqueue email' }, { status: resp.status }); | ||
} | ||
|
||
const data = await resp.json(); | ||
|
||
return NextResponse.json({ response: data }, { status: 200 }); | ||
} catch (err) { | ||
console.error('Error handling POST request:', err); | ||
return NextResponse.json({ error: 'Internal server error' }, { status: 500 }); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters