Skip to content

Commit b63991c

Browse files
committed
Add locust example using playwright. The header synthetic_request is set to true to identify them in the frontend
1 parent 50b06b7 commit b63991c

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/loadgenerator/locustfile.py

+42
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55

66

77
import json
8+
import os
89
import random
910
import uuid
1011
from locust import HttpUser, task, between
12+
from locust_plugins.users.playwright import PlaywrightUser, pw, PageWithRetry, event
1113

1214
from opentelemetry import context, baggage, trace
1315
from opentelemetry.metrics import set_meter_provider
@@ -21,6 +23,7 @@
2123
from opentelemetry.instrumentation.requests import RequestsInstrumentor
2224
from opentelemetry.instrumentation.system_metrics import SystemMetricsInstrumentor
2325
from opentelemetry.instrumentation.urllib3 import URLLib3Instrumentor
26+
from playwright.async_api import Route, Request
2427

2528
exporter = OTLPMetricExporter(insecure=True)
2629
set_meter_provider(MeterProvider([PeriodicExportingMetricReader(exporter)]))
@@ -130,3 +133,42 @@ def on_start(self):
130133
context.attach(ctx)
131134
self.index()
132135

136+
137+
browser_traffic_enabled = os.environ.get('LOCUST_BROWSER_TRAFFIC_ENABLED', False)
138+
139+
if browser_traffic_enabled:
140+
class WebsiteBrowserUser(PlaywrightUser):
141+
headless = True # to use a headless browser, without a GUI
142+
143+
@task
144+
@pw
145+
async def open_cart_page_and_change_currency(self, page: PageWithRetry):
146+
try:
147+
page.on("console", lambda msg: print(msg.text))
148+
await page.route('**/*', add_baggage_header)
149+
await page.goto("/cart", wait_until="domcontentloaded")
150+
await page.select_option('[name="currency_code"]', 'CHF')
151+
await page.wait_for_timeout(2000) # giving the browser time to export the traces
152+
except:
153+
pass
154+
155+
@task
156+
@pw
157+
async def add_product_to_cart(self, page: PageWithRetry):
158+
try:
159+
page.on("console", lambda msg: print(msg.text))
160+
await page.route('**/*', add_baggage_header)
161+
await page.goto("/", wait_until="domcontentloaded")
162+
await page.click('p:has-text("Roof Binoculars")', wait_until="domcontentloaded")
163+
await page.click('button:has-text("Add To Cart")', wait_until="domcontentloaded")
164+
await page.wait_for_timeout(2000) # giving the browser time to export the traces
165+
except:
166+
pass
167+
168+
169+
async def add_baggage_header(route: Route, request: Request):
170+
headers = {
171+
**request.headers,
172+
'baggage': 'synthetic_request=true'
173+
}
174+
await route.continue_(headers=headers)

0 commit comments

Comments
 (0)