diff --git a/.env b/.env index 74ae9122e9..7722d701b1 100644 --- a/.env +++ b/.env @@ -67,6 +67,7 @@ LOCUST_HOST=http://${FRONTEND_PROXY_ADDR} LOCUST_WEB_HOST=loadgenerator LOCUST_AUTOSTART=true LOCUST_HEADLESS=false +LOCUST_BROWSER_TRAFFIC_ENABLED=false # Payment Service PAYMENT_SERVICE_PORT=50051 diff --git a/CHANGELOG.md b/CHANGELOG.md index e0995b1b82..c024a49838 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ release. ([#1239](https://github.com/open-telemetry/opentelemetry-demo/pull/1239)) * update PHP quoteservice to use 1.0.0 ([#1236](https://github.com/open-telemetry/opentelemetry-demo/pull/1236)) +* enable browser traffic in loadgenerator using playwright ([#1266](https://github.com/open-telemetry/opentelemetry-demo/pull/1266)) ## 1.6.0 diff --git a/docker-compose.yml b/docker-compose.yml index 084852716e..d224dad9a4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -369,7 +369,7 @@ services: deploy: resources: limits: - memory: 120M + memory: 1G restart: unless-stopped ports: - "${LOCUST_WEB_PORT}" @@ -379,6 +379,7 @@ services: - LOCUST_HOST - LOCUST_HEADLESS - LOCUST_AUTOSTART + - LOCUST_BROWSER_TRAFFIC_ENABLED - OTEL_EXPORTER_OTLP_ENDPOINT - OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE - OTEL_RESOURCE_ATTRIBUTES diff --git a/kubernetes/opentelemetry-demo.yaml b/kubernetes/opentelemetry-demo.yaml index dcc93781c5..130594cf2c 100644 --- a/kubernetes/opentelemetry-demo.yaml +++ b/kubernetes/opentelemetry-demo.yaml @@ -9818,6 +9818,8 @@ spec: value: "false" - name: LOCUST_AUTOSTART value: "true" + - name: LOCUST_BROWSER_TRAFFIC_ENABLED + value: "false" - name: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION value: python - name: OTEL_EXPORTER_OTLP_ENDPOINT @@ -9826,7 +9828,7 @@ spec: value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo resources: limits: - memory: 120Mi + memory: 1Gi --- # Source: opentelemetry-demo/templates/component.yaml apiVersion: apps/v1 diff --git a/src/loadgenerator/Dockerfile b/src/loadgenerator/Dockerfile index 473bf73772..2c14005aea 100644 --- a/src/loadgenerator/Dockerfile +++ b/src/loadgenerator/Dockerfile @@ -17,4 +17,6 @@ WORKDIR /usr/src/app/ COPY --from=builder /reqs /usr/local COPY ./src/loadgenerator/locustfile.py . COPY ./src/loadgenerator/people.json . +ENV LOCUST_PLAYWRIGHT=1 +RUN playwright install --with-deps chromium ENTRYPOINT locust diff --git a/src/loadgenerator/locustfile.py b/src/loadgenerator/locustfile.py index ea40f0614d..c5aac08b2b 100644 --- a/src/loadgenerator/locustfile.py +++ b/src/loadgenerator/locustfile.py @@ -5,9 +5,11 @@ import json +import os import random import uuid from locust import HttpUser, task, between +from locust_plugins.users.playwright import PlaywrightUser, pw, PageWithRetry, event from opentelemetry import context, baggage, trace from opentelemetry.metrics import set_meter_provider @@ -129,3 +131,34 @@ def on_start(self): ctx = baggage.set_baggage("synthetic_request", "true") context.attach(ctx) self.index() + + +browser_traffic_enabled = os.environ.get('LOCUST_BROWSER_TRAFFIC_ENABLED', False) + +if browser_traffic_enabled: + class WebsiteBrowserUser(PlaywrightUser): + headless = True # to use a headless browser, without a GUI + multiplier = 1 # run concurrent playwright sessions/browsers for each Locust user + wait_time = between(1, 10) + + @task + @pw + async def open_cart_browser_page(self, page: PageWithRetry): + try: + async with event(self, "Load up Cart Page"): + await page.goto("/cart") + except: + pass + + @task + @pw + async def open_home_browser_page(self, page: PageWithRetry): + try: + async with event(self, "Load up Astronomy Shop home page"): + await page.goto("/") + async with event(self, "Click on Go Shopping button"): + async with page.expect_navigation(wait_until="domcontentloaded"): + await page.click('button:has-text("Go Shopping")') + except: + pass + diff --git a/src/loadgenerator/requirements.txt b/src/loadgenerator/requirements.txt index 0f7bb7552e..f0e72bd6e4 100644 --- a/src/loadgenerator/requirements.txt +++ b/src/loadgenerator/requirements.txt @@ -11,10 +11,11 @@ flask-cors==4.0.0 gevent==23.9.1 geventhttpclient==2.0.11 googleapis-common-protos==1.61.0 -greenlet==3.0.1 +greenlet==3.0.0 idna==3.4 itsdangerous==2.1.2 jinja2==3.1.2 +locust_plugins==3.4.0 locust==2.18.2 markupsafe==2.1.3 msgpack==1.0.7