From 7fb1eec7777dd56ab3e097ae901768176aaf9dab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C4=8Dnica=20Mellifera?= Date: Mon, 21 Oct 2024 07:50:41 -0700 Subject: [PATCH 1/3] Pwt vcypress (#1096) * new learn content * add links, other small tweaks --------- Co-authored-by: dgiordano33 --- .../learn/playwright/playwright-vs-cypress.md | 209 ++++++++++++++++++ .../learn/playwright/playwright-vs-others.md | 8 +- 2 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 site/content/learn/playwright/playwright-vs-cypress.md diff --git a/site/content/learn/playwright/playwright-vs-cypress.md b/site/content/learn/playwright/playwright-vs-cypress.md new file mode 100644 index 000000000..48832c901 --- /dev/null +++ b/site/content/learn/playwright/playwright-vs-cypress.md @@ -0,0 +1,209 @@ +--- +title: Playwright vs Cypress - Detailed comparison +subTitle: Key features, and pros & cons of each framework +date: 2024-10-17 +author: Nocnica Mellifera +githubUser: serverless-mom +tags: + - basics +weight: 4 +displayTitle: Playwright vs Cypress +navTitle: Playwright vs Cypress +menu: + learn: + parent: "Getting started" +--- +Playwright and Cypress are two frameworks both closely associated with end-to-end testing of production websites. Both frameworks can do quite a bit more than 'making sure nothing on your site is broken' and their design philosophies, architectures, and use cases are different. + +Starting in mid-2024, according to [npmtrends.com](https://npmtrends.com/cypress-vs-playwright), Playwright surpassed Cypress in npm downloads, indicating that more projects are starting with Playwright as their preferred automation framework. Playwright is the framework supported by Checkly in our current runtimes. + +## Playwright overview +While Cypress is a testing tool, Playwright is an automation solution. + +This distinction is important when you compare these solutions to the present day realities of automation. + +Playwright is a tool focused on developer productivity with more robust built-in features, the ability to use async/await, built in parallelization, a much lighter weight in CI. Playwright is also less opinionated because it doesn’t have to be, you can use it however you want. Playwright can [monitor your APIs](https://www.checklyhq.com/blog/test-apis-with-playwright/) just as well as it can your frontend web pages. Scraping content for a LLM model? Check! Have a nested app in an iframe you want to test? Go wild! *Three different browser sessions in the same chat instance? Sounds cool! Re-use your tests to monitor production? Absolutely.* + +## Playwright Key Features +- Supports multiple languages: JavaScript, TypeScript, Python, Java, C# +- Create tests without writing any code with their test generator +- Cross-platform testing (Windows, macOS, Linux) +- Native support for multiple browsers (Chromium, Firefox, WebKit) +- API testing, visual regression, and component testing support +- Test parallelism and isolated browser contexts +- Headless and headed modes for fast execution +- Advanced debugging tools like Trace Viewer +- Network-level testing: intercepts requests and manipulates responses +- Integrates easily with CI/CD pipelines + +## Cypress overview + +With Cypress, E2E went from the painful world of hard-coded waits and heavy-handed POM approaches to built in actionability and visibility checks with a focus on community building and developer experience. What we’ve seen over the course of the last five years or so is a cultural shift in the testing world from a heavy reliance on Manual QA and non-developer owned testing responsibilities to testing as a more fully incorporated practice. We’ve shifted left. + +We’ve also seen testing become the battleground of where your developer velocity goes to die. + +Titles have changed, entire departments have been lost to restructures, responsibilities have adjusted and solutions that were groundbreaking less than a decade ago are now no longer cutting edge. + +The main areas where Cypress loses now used to be where they won; community trust, focus on developer productivity and rapid feature development. It’s not that those things don’t matter to Cypress any longer, but their attention has clearly shifted to solving enterprise problems. We can talk about [blocking npm packages](https://currents.dev/posts/v13-blocking), or [paywalling features](https://docs.cypress.io/guides/cloud/test-replay) that create parity with Playwright, but that would be a distraction. What really matters is velocity and practicality. A solution without parity to its top competitor, that requires the largest machines in CI and is still slower to run; is neither efficient nor practical unless you’re already using it. + +## Cypress Key Features +- JavaScript and TypeScript support (limited to web apps) +- Native test runner with interactive GUI +- Provides automatic waits, retry logic, and time travel debugging +- Rich network mocking and stubbing tools +- Custom dot-notation language for async +- Supports browser automation for Chromium-based browsers +- Focuses on frontend testing but supports API testing +- Strong documentation +- Direct access to browser internals, enabling state manipulation + +## **Playwright vs Cypress: Architectural Differences** + +### **Overview of Architectures** +The architectural differences between Playwright and Cypress reflect distinct design philosophies and impact how each tool interacts with browsers and testing workflows. Playwright leverages the **Chrome DevTools Protocol (CDP)** to automate browsers directly, while Cypress runs within the browser’s execution loop via a custom Electron-based app. These design choices affect browser support, performance, parallelization, and test writing practices. + +--- + +### **Playwright Architecture** +- **CDP-based**: Playwright interacts with browsers using the Chrome DevTools Protocol, which is natively supported by major browsers (Chromium, Firefox, WebKit). This allows it to control the browser externally without modifying the browser’s native execution loop. +- **Separate Node Process**: Since Playwright runs outside the browser’s execution loop, it requires an external process (Node.js) to orchestrate tests. This design is more similar to Selenium’s WebDriver model, although Selenium 4 now also supports CDP. +- **Language Flexibility**: Playwright’s architecture allows multi-language support, including JavaScript, TypeScript, Python, Java, and C#. It can also integrate with other frameworks like RobotFramework. +- **Parallel Testing**: Playwright offers built-in parallelism without additional configuration, enabling faster test execution out of the box. +- **Browser & Tab Support**: Playwright supports all major browsers and multiple tabs, giving it flexibility for complex test scenarios. It also has experimental support for mobile testing. +- **Standardized Integration**: Playwright integrates smoothly with high-level testing frameworks (e.g., CucumberJS, CodeceptJS) without custom runners, as the browser behaviors remain unmodified. + +--- + +### **Cypress Architecture** +- **Electron-based App**: Cypress runs as a native JavaScript app embedded within an Electron browser. This architecture means tests and Cypress’s custom library run **within the browser’s execution loop**, directly injecting code into the test browser. +- **Tight Browser Integration**: This direct integration allows Cypress to manipulate browser behavior (e.g., automatic waits and retries) but limits support to JavaScript and transpiled languages. It also complicates browser support—Safari, for instance, is not currently supported. +- **Single Process Control**: Cypress uses a combination of Node.js and its custom library for test execution, but the bulk of the test control happens in the browser, limiting flexibility compared to Playwright’s external Node process. +- **Component Testing Support**: Because Cypress runs directly within the browser, it enables component and unit testing as well as E2E tests in the same framework. However, this approach changes the browser’s behavior, creating potential differences from real-world user scenarios. +- **Limited Parallelism**: Parallelization is not available out of the box and requires a **SaaS subscription** to Cypress Cloud for optimal parallel test execution. +- **Limited Tab and iFrame Support**: Cypress does not support multiple tabs and has limited and sometimes inconsistent iFrame handling, making it less effective for complex web applications. + +--- + +### **Impact of Architectural Differences** + +1. **Browser and Platform Support** + - Playwright supports all modern browsers (Chromium, Firefox, WebKit) and can run on multiple operating systems with little configuration (sidenote: Checkly currently supports using Chromium or Chrome with Playwright Test and Playwright library, with Chromium being the default browser for all checks. [Read more about using Chrome](https://www.checklyhq.com/docs/browser-checks/#using-other-browsers)). + - Cypress, with its Electron-based architecture, requires adaptation for each browser and does not support Safari or tabs. + +2. **Testing Flexibility** + - Playwright’s language-agnostic design supports a wide range of frameworks and languages beyond JavaScript. Cypress is restricted to JavaScript and TypeScript. + - Playwright focuses on E2E and system testing, while Cypress can handle both component and E2E testing within the same framework, though it changes browser behavior in the process. + +3. **Parallelization and CI Integration** + - Playwright offers **free built-in parallel testing** and easily integrates with CI pipelines using only `npm install`. Cypress requires either SaaS subscriptions or workarounds for parallelism, increasing costs and complexity. + - For remote testing, Playwright integrates seamlessly with Selenium Grid and SaaS solutions (e.g., BrowserStack), while Cypress relies on its own cloud service. + +4. **Performance and Practicality** + - Playwright’s external control through CDP offers **more realistic testing**, reflecting real user behavior without modifying browser internals. + - Cypress’s tight browser integration provides fast feedback loops for developers but can lead to discrepancies between test environments and real-world scenarios. + +5. **Asynchronous Code Handling** + - Playwright uses standard **async/await** syntax, providing a clear, modern JavaScript interface. Cypress uses a custom dot notation that simplifies code but is not fully asynchronous, limiting flexibility. + +--- + +### **Which Architecture Fits Your Needs?** +- **Choose Playwright** if you need cross-browser support, parallelism, and multi-language flexibility. Its architecture is more scalable for complex, multi-layered applications that demand realistic, real-world testing. +- **Choose Cypress** if your focus is on quick feedback during frontend development, and you prefer a highly interactive testing experience embedded within the browser. Cypress is ideal for teams already working in a JavaScript/TypeScript environment with limited browser requirements. + +## Playwright vs Cypress: Key Differences Comparison + +| Feature | Playwright | Cypress | +|------------------------|--------------------------------------------|--------------------------------------| +| Language | JavaScript, TypeScript, Python, Java, C# | JavaScript, TypeScript | +| Test Runner | Works with Jest, Mocha, and others | Built-in test runner | +| Operating Systems | Windows, macOS, Linux | Windows, macOS, Linux | +| Open Source | Yes | Yes | +| Parallel Testing | Full parallelism, even within specs | Parallel at spec level only | +| Architecture | Uses browser contexts for isolation | Runs within the browser itself | +| Browsers Supported | Chromium, Firefox, WebKit | Chrome, Edge (Chromium-based) | +| Documentation | Strong Microsoft support, Discord channel | Strong community, Slack support | +| Real Devices Support | Limited | No | +| Plugins | Relies on custom setup | Ecosystem of plugins | + +--- + +## Playwright vs Cypress Examples +At the highest level, Playwright and Cypress tests look very similar when writing a basic tests. Differences only really become visible when you make two asynchronous requests with assertions. + +### Playwright Example +```javascript +const { test, expect } = require('@playwright/test'); + +test('Multiple API Requests Test', async ({ request }) => { + // First request and assertion + const todoResponse = await request.get('https://jsonplaceholder.typicode.com/todos/1'); + expect(todoResponse.status()).toBe(200); + + // Second request and assertion + const userResponse = await request.get('https://jsonplaceholder.typicode.com/users/1'); + expect(userResponse.status()).toBe(200); +}); + +``` + +Playwright uses the standard `await` syntax used in the rest of Node.js. + +### Cypress Example +```javascript +describe('Multiple API Requests Test', () => { + it('should return valid status codes for two API requests', () => { + // First request and assertion + cy.request('https://jsonplaceholder.typicode.com/todos/1') + .its('status') + .should('eq', 200); + + // Second request and assertion + cy.request('https://jsonplaceholder.typicode.com/users/1') + .its('status') + .should('eq', 200); + }); +}); + +``` +With Cypress, we're using their custom syntax, which is a bit more compact but still has it's own specialized field of knowledge. If you're pursuing a monitoring as code strategy and getting everyone involved in testing and monitoring, this domain-specific syntax may be a barrier to entry. + +Further, Cypress asynchrony may not act as expected if we're used to asynchrony from Node.js. In Cypress, each `cy.request()` runs asynchronously, but Cypress queues them sequentially. This ensures that the second request only executes after the first one completes, making this pattern simple and effective for making multiple assertions across async requests. + +--- + +## Playwright vs Cypress: Pros & Cons + +### Playwright Pros +- Supports more browsers, including Firefox and Safari/WebKit +- Suitable for complex web apps with API, UI, and visual testing combined +- Superior parallelism and scalability for larger test suites +- Works on multiple platforms + +### Playwright Cons +- More complex setup for beginners +- Larger learning curve compared to Cypress +- Requires deeper configuration to utilize full power + +### Cypress Pros +- User-friendly interface, easy for beginners +- GUI with real-time updates during tests +- Great for frontend testing + +### Cypress Cons +- Limited to Chromium-based browsers +- Struggles with large-scale parallelism +- No native support for multi-language tests + +--- + +## Playwright vs Cypress: Which Solution is Better for You? + +- Choose Playwright if you need to test across multiple browsers, require advanced parallelism, or need to include API and component testing in your workflow. It’s better suited for complex, large-scale projects with multiple stakeholders. +- Choose Cypress if your focus is frontend testing, or you are working on web apps that run primarily in Chrome/Edge. Cypress is more user-friendly for teams without extensive testing experience and offers quick startup time with fewer configurations. + +--- + +## Conclusion + +Both Playwright and Cypress are powerful tools, but each shines in different areas. Playwright’s versatility makes it the better choice for complex, multi-layered applications requiring scalability, while Cypress excels in simplicity and frontend testing. Your decision should align with your project’s needs, team experience, and browser requirements. \ No newline at end of file diff --git a/site/content/learn/playwright/playwright-vs-others.md b/site/content/learn/playwright/playwright-vs-others.md index f002233f9..601f0c9d9 100644 --- a/site/content/learn/playwright/playwright-vs-others.md +++ b/site/content/learn/playwright/playwright-vs-others.md @@ -14,7 +14,7 @@ menu: learn: parent: "Getting started" --- - +There are a number of options when for [frameworks for end-to-end testing](https://www.checklyhq.com/blog/cypress-vs-selenium-vs-playwright-vs-puppeteer-speed-comparison/). If you're thinking about using Checkly, you're likely aware of a few. ## Puppeteer vs Playwright @@ -31,3 +31,9 @@ In short, Playwright builds on the experience of Puppeteer to provide a way to: This is achieved in the form of a compact node library that exposes a high-level API to interact with web pages in a fast, secure, stable and simple way. As it is an open-source project, you can [contribute](https://github.com/microsoft/playwright/blob/master/CONTRIBUTING.md) to it yourself. +## Playwright vs Cypress +Long the dominant framework for (at the time) modern end-to-end testing, Cypress is still very widley used as a testing framework by front-end focused teams. + +Due to architectural differences, Playwright can support multiple languages for writing tests, and run more browsers for testing. Due to Playwright's status as a free and open source project, users don't have to deal with new features being paywalled, a significant issue for Cypress users since 2023. + +[Read more about Playwright vs. Cypress.](/learn/playwright/playwright-vs-cypress/) \ No newline at end of file From df3c26652645be471a70f65efd578be0a3d48357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C4=8Dnica=20Mellifera?= Date: Mon, 21 Oct 2024 07:58:30 -0700 Subject: [PATCH 2/3] =?UTF-8?q?redirects=E2=80=A6=20(#1095)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * redirects per https://www.notion.so/checkly/Add-Permanent-Redirects-122ec050b06e8007a82bebb2aeee4239 * JSON linting is for cowards --------- Co-authored-by: dgiordano33 --- vercel.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/vercel.json b/vercel.json index 062da7935..b6a4fdc13 100644 --- a/vercel.json +++ b/vercel.json @@ -87,6 +87,13 @@ { "source": "/guides/puppeteer-to-playwright(/)?", "destination": "/guides/moving-from-puppeteer-to-playwright/", "permanent": true }, { "source": "/guides/monitoring-as-code-cli(/)?", "destination": "/guides/monitoring-ecommerce-apps-using-playwright/", "permanent": true }, { "source": "/guides/setup-scripts(/)?", "destination": "/guides/setup-scripts-for-apis/", "permanent": true }, - { "source": "/guides/openapi-swagger(/)?", "destination": "/guides/monitoring-an-openapi-spec/", "permanent": true } + { "source": "/guides/openapi-swagger(/)?", "destination": "/guides/monitoring-an-openapi-spec/", "permanent": true }, + { "source": "/docs/private-locations/private-locations-getting-started(/)?", "destination": "/docs/private-locations/private-locations-getting-started/", "permanent": true }, + { "source": "/docs/private-locations/checkly-agent-guide(/)?", "destination": "/docs/private-locations/checkly-agent-configuration/", "permanent": true }, + { "source": "/docs/browser-checks/partials-code-snippets(/)?", "destination": "/docs/snippets/", "permanent": true }, + { "source": "/docs/integrations/terraform(/)?", "destination": "/docs/terraform-provider/", "permanent": true }, + { "source": "/docs/browser-checks/runner-specification(/)?", "destination": "/docs/runtimes/specs/", "permanent": true }, + { "source": "/docs/browser-checks/login-and-secrets(/)?", "destination": "/docs/browser-checks/login-scenarios/", "permanent": true }, + { "source": "/docs/integrations/prometheus-v1(/)?", "destination": "/docs/integrations/prometheus/", "permanent": true } ] } \ No newline at end of file From 40faccb8495f8cf5e9b984d35e12a5476614e49c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C4=8Dnica=20Mellifera?= Date: Mon, 21 Oct 2024 08:04:05 -0700 Subject: [PATCH 3/3] new article for Guides w00t. (#1094) * new article for Guides w00t. As a driveby I added an avatar for myself, which should be in use by the end of the week * colon in yaml front matter --- .../empowering-developers-with-checkly.md | 480 ++++++++++++++++++ .../static/images/avatars/daniel-giordano.png | Bin 0 -> 37620 bytes site/static/images/avatars/nica-mellifera.png | Bin 0 -> 27066 bytes 3 files changed, 480 insertions(+) create mode 100644 site/content/guides/empowering-developers-with-checkly.md create mode 100644 site/static/images/avatars/daniel-giordano.png create mode 100644 site/static/images/avatars/nica-mellifera.png diff --git a/site/content/guides/empowering-developers-with-checkly.md b/site/content/guides/empowering-developers-with-checkly.md new file mode 100644 index 000000000..ed0c34553 --- /dev/null +++ b/site/content/guides/empowering-developers-with-checkly.md @@ -0,0 +1,480 @@ +--- +title: Streamlining Complex Monitoring with Checkly - Empowering Developers and Platform Teams +displayTitle: Streamline Monitoring, Empower Developers and Platform Teams +description: >- + Discover how Checkly empowers developers and platform teams to streamline complex monitoring through a code-first approach. Learn how collaboration, automation, and integrated alerts improve reliability and reduce bottlenecks in modern software delivery workflows. +author: Daniel Giordano +avatar: 'images/avatars/daniel-giordano.png' +--- +## An overview of end-to-end monitoring + +End-to-end monitoring is a comprehensive strategy designed to assess the overall health and performance of a service by examining the entire lifecycle of requests to an application. By simulating a user request, including the browser rendering and user experience, an operations or development professional tests all parts of an application at once; hence the name ‘end-to-end.’ End-to-end monitoring is an outgrowth of end-to-end testing, where rather than sending test request once, with monitoring tests are run on a cadence, and the results automatically compiled. + +By aligning monitoring insights with the user experience, end-to-end monitoring ensures that any anomalies, edge cases, or potential failures impacting users are quickly identified and addressed. + +This inclusive monitoring strategy often involves multiple teams, including developers, network engineers, and non-technical stakeholders, fostering a collaborative effort to maintain optimal system performance and enhance the digital experience for users. + +## End-to-end monitoring vs traditional monitoring approaches + +Unlike traditional testing, which focuses on isolated components and only tests occasionally, end-to-end monitoring provides a holistic view of a product or service. + +Methods like unit testing look at individual aspects like servers or databases, sending specific requests to the services and verifying the response. This kind of testing doesn’t allow for edge cases like display issues, unusual accounts with different settings, or other problems that real users experience after unit testing. + +Running tests only occasional, the traditional approach of end-to-end testing only reveals predictable failures, e.g. when major code changes break the service. By running tests on a cadence, more unexpected failures are revealed by end-to-end monitoring. + + +## Headless browser testing + +Over the course of the last decade, especially thanks to tools such as {{< newtabref href="https://www.selenium.dev/" title="Selenium" >}} and (more recently) {{< newtabref href="https://www.cypress.io/" title="Cypress" >}}, **automated End-to-End testing (E2E testing) has become widespread across industries**. + +Broadly speaking, **E2E testing entails running fully automated test suites with the goal of catching bugs before they hit production** and, therefore, negatively affect the user experience. These test suites need to be carefully scripted using dedicated tools, as well as to be made stable and fast enough to test the most important end-user flows on every build, PR or commit, depending on the application under test and the organisation's automation maturity. + +The industry has learned to struggle with the challenges this approach presents: + +1. Long-running suites. +2. Test flakiness. +3. Expensive test infrastructure. + +**All of the above lead to higher costs and slower delivery.** + +The appearance of mature **headless browser automation tools, such as {{< newtabref href="https://playwright.dev" title="Playwright" >}}, offer a response** to many of the above issues by allowing testing in the browser without its GUI, which yields higher speed and stability coupled with lower resource consumption. + +## E2E monitoring examples + +While this nimbler, more reliable kind of test is already a big improvement for pre-production testing, it enables a completely new approach in production monitoring: we can now **continuously run E2E tests against our production systems**. This enables us to have real-time feedback on the status of our website's key user flows from a user's perspective. This is E2E monitoring, also known as *synthetic monitoring* or *active monitoring*. + +This comes with a significant, often underestimated advantage: it allows us to **catch all those things that might break in production that can't be caught during pre-production testing**. We are now running directly against the system that the end-user is actually interacting with, and will be able to monitor its behaviour in real time. + +What could this look like in practice? Let's look at an e-commerce example. + +## Monitoring a web shop + +A few key flows for an e-commerce websites could be: +1. Logging in +2. Finding a product through search +3. Adding products to the basket and checking out + +Let's see how to set them up - for this example, we will do that on our {{< newtabref href="https://danube-web.shop/" title="demo web shop" >}}. + +{{< figure src="/guides/images/guides-danube.png" alt="demo website screenshot" title="Our demo website" >}} + +### Playwright E2E tests + +Using Playwright, we can script our three E2E scenarios as follows: + +{{< tabs "Web shop example" >}} +{{< tab "Login" >}} +```js +import { test, expect } from '@playwright/test'; + +test('web shop login', async ({ page }) => { + //navigate to our web page + await page.goto('https://danube-web.shop/'); + + await page.getByRole('button', { name: 'Log in' }).click(); + + //for your own application, you may want to encode login details in a config file + await page.getByPlaceholder('Email').click(); + await page.getByPlaceholder('Email').fill('user@email.com'); + await page.getByPlaceholder('Password').click(); + await page.getByPlaceholder('Password').fill('supersecure1'); + + await page.getByRole('button', { name: 'Sign In' }).click(); + + //check for a confirmation message on the page + await expect(page.getByText('Welcome back, user@email.com')).toBeVisible(); +}); +``` +{{< /tab >}} +{{< tab "Search" >}} + ```js +import { test, expect } from '@playwright/test'; + +[ + { title: 'The Foreigner', author: 'Camuso' }, + { title: 'Does the Sun Also Rise?', author: 'Doubtingway' }, + { title: 'The Transformation', author: 'Fafka' }, +].forEach(({ title, author }) => { + // You can also do it with test.describe() or with multiple tests as long the test name is unique. + test(`Searching For ${title}`, async ({ page }) => { + await page.goto('https://danube-web.shop/'); + await page.getByRole('textbox').click(); + await page.getByRole('textbox').fill(title); + await page.getByRole('button', { name: 'Search' }).click(); + await expect(page.locator('#app-content')).toContainText(author); + }); +}); +``` +{{< /tab >}} +{{< tab "Checkout" >}} +```js +import { test, expect } from '@playwright/test'; + +test('test', async ({ page }) => { + //navigate to page + await page.goto('https://danube-web.shop/'); + //select item + await page.getByText('Haben oder haben').click(); + await page.getByRole('button', { name: 'Add to cart' }).click(); + await page.getByRole('button', { name: 'Checkout' }).click(); + + //fill out checkout info + await page.getByPlaceholder('Name', { exact: true }).fill('nocnica'); + await page.getByPlaceholder('Surname').click(); + await page.getByPlaceholder('Surname').fill('mellifera'); + await page.getByPlaceholder('Address').click(); + await page.getByPlaceholder('Address').fill('123 fake street'); + await page.getByPlaceholder('Zipcode').click(); + await page.getByPlaceholder('Zipcode').fill('02183'); + await page.getByPlaceholder('City').click(); + await page.getByPlaceholder('City').fill('Springfield'); + await page.getByPlaceholder('Company (optional)').click(); + await page.getByPlaceholder('Company (optional)').fill('checkly'); + + //click buy + await page.getByRole('button', { name: 'Buy' }).click(); + await page.getByLabel('as soon as possible').check(); + await expect(page.getByText('All good, order is on the way')).toBeVisible(); +}); + ``` +{{< /tab >}} +{{< /tabs >}} + +These can be run on our own machine without issues with {{< newtabref href="https://playwright.dev/docs/intro" title="very little preparation" >}} with a simple `node script.js`. + +## Monitoring application performance + +A web application's performance plays a primary role in the user experience it delivers. From the user's perspective, a fully functional application that is not performant quickly becomes indistinguishable from a broken one. + +Using Playwright together with browser APIs or additional performance libraries, our end-to-end monitoring setup can be easily extended to include application performance. + +## End to end application monitoring + +Unlike headful tools, headless ones tend to not be very resource-hungry, which makes it easier to move our scripts to the cloud. Checkly runs on top of AWS Lambda, and enables us to quickly copy-paste our script and set it up to run on a schedule from locations around the world. + +{{< figure src="/guides/images/guides-checkly-check.png" alt="checkly check creation screenshot" title="Check creation on Checkly" >}} + +We can move our scripts to separate checks to keep them [independent](/learn/headless/valuable-tests/#keep-tests-independent) - we want to optimise for parallelisation and clarity of feedback. + +{{< figure src="/guides/images/guides-checkly-dashboard.png" alt="checkly dashboard screenshot" title="Checkly's dashboard" >}} + +As soon as a check runs red, we are alerted in real time and can **intervene before the issue impacts our users**. Alerting can be set up with all the industry-standard channels like Pagerduty, Opsgenie, Slack, email, SMS and more. + +{{< figure src="/guides/images/guides-checkly-alerting.png" alt="checkly alerting screenshot" title="Alert channels on Checkly" >}} + +### On-demand checking + +**Active monitoring and event-triggered testing do not exclude one another.** You might want to have checks kicked off every time you deploy to production, or on every merge, PR or commit, or you might also want to run against your staging or development server. The choice has to be made based on your workflow and on your automation strategy. + +## CI/CD + +Tests can be kicked off of CI pipelines. You might want to use different hooks (for e.g. smoke vs regression testing) in different stages and against different targets. [Checkly supports all major CI servers](https://www.checklyhq.com/docs/cicd/). + +## Develop-preview-test + +If you are using provider like Vercel, you can automatically trigger your checks to run on deployed PRs, too, to reap the benefits of the {{< newtabref href="https://rauchg.com/2020/develop-preview-test" title="develop-preview-test approach" >}}. + +## Benefits of implementing end-to-end monitoring +Now, let’s see what benefits you will experience if you decide to implement end-to-end monitoring. +### Improved user experience +End-to-end monitoring identifies issues before they impact users, ensuring smooth and reliable interactions. This proactive detection boosts customer satisfaction and loyalty. Enhanced user experience directly translates to increased engagement and retention rates. +### Better operational efficiency +By offering a complete system view, end-to-end monitoring quickly pinpoints and resolves bottlenecks. This reduces downtime and enhances productivity. Operational efficiency improvements lead to cost savings and better resource allocation. +### Faster issue resolution +End-to-end monitoring means continuous monitoring, which enables rapid identification of root causes, reducing the time needed to address problems. This leads to quicker resolutions and minimizes disruptions. Faster issue resolution ensures continuous service availability and reliability. +### Actionable data +With data from various sources, end-to-end monitoring provides a holistic understanding of system performance. This broad perspective helps in making informed decisions and optimizing resources. Comprehensive insight allows for better planning and strategic improvements. +### Collaboration across teams +End-to-end monitoring fosters collaboration among developers, network engineers, and non-technical staff. This unified approach ensures all stakeholders work together to maintain system health and improve performance. Collaborative efforts lead to more innovative solutions and streamlined processes. + +## Tools for end-to-end monitoring +There are countless tools out there that perform some type of end-to-end monitoring. Here, we’re covering some of them: +### Application Performance Monitoring (APM) Tools +*Tools:* New Relic, Dynatrace, AppDynamics + +APM focuses on tracking the performance and availability of software applications. It monitors key metrics such as response times, transaction throughput, error rates, and user satisfaction. APM helps identify performance bottlenecks and ensures applications run smoothly, providing a better user experience. +### Infrastructure Monitoring Tools +*Tools:* Zabbix, Datadog, Prometheus + +Infrastructure monitoring involves overseeing the physical and virtual components of an IT environment, such as servers, storage systems, and virtualization platforms. It checks the status, performance, and resource utilization of these components to ensure optimal operation and prevent downtime. +### Real User Monitoring (RUM) +*Tools:* New Relic Browser, Dynatrace RUM + +RUM tracks the actual interactions of users with a website or application in real-time. It captures data on load times, errors, and user behavior to provide insights into the real-world performance of digital assets. RUM helps identify areas for improvement based on actual user experiences. Since RUM is capturing data on every user every time, the infrastructure cost is nontrivial and there's always the risk of impacting performance for users +### Synthetic Monitoring Tools +*Tools:* Checkly, Pingdom, Datadog + +Synthetic monitoring uses scripted tests to simulate user interactions with applications and services. It helps identify performance issues and availability problems before they impact real users. This proactive approach ensures continuous service reliability and performance. +## 4 Best practices for effective end-to-end monitoring +### Establishing clear objectives and KPIs +Define specific goals and key performance indicators (KPIs) to measure the success of your monitoring strategy. This ensures that monitoring efforts are aligned with business objectives and provides a clear framework for evaluating performance. +### Collaborative approach: developers, security, operations, and business teams +Foster collaboration among developers, security, operations, and business teams to ensure comprehensive monitoring coverage. This multidisciplinary approach helps identify and address issues from multiple perspectives, improving overall system health. +### Continuous monitoring and regular performance reviews +Implement continuous monitoring to detect and address issues in real time. Regularly review performance data to identify trends, optimize resources, and make informed decisions for future improvements. +### Integrating end-to-end monitoring into DevOps and agile workflows +Embed end-to-end monitoring into DevOps and agile workflows to ensure seamless integration and real-time feedback. This approach promotes a proactive monitoring culture and accelerates the identification and resolution of issues. + +The best way to do this is to adopt Monitoring as Code (MaC), and implement your monitors directly in your CI/CD, from pre-prod to prod. Checkly’s CLI enables you to build and maintain your monitors from your existing code base, integrating with cutting-edge testing and monitoring tools like Playwright, Grafana, Prometheus, Coralogix, and others. + + +## End-to-end Monitoring Pitfalls + +We learned things the hard way so you do not have to. When starting out, keep an eye out for the following pitfalls: + +* Non-independent tests: tests that rely on one another in any way (e.g. order of execution, test data) are hard to parallelise, resulting in longer execution times and potentially higher flakiness. [Keep your tests independent](/learn/headless/valuable-tests/#keep-tests-independent). + +* Long, unfocused tests: checking too much in a single test will make failures harder to debug. [Break it up instead](/learn/headless/valuable-tests/#keep-tests-focused), and enjoy the added parallelisation. + +* Messing up your own metrics, KPIs: remember, if you are not running against production, you want to make sure your E2E monitoring checks or tests are filtered out of your analytics. This is [rather easy to do](/docs/monitoring/allowlisting/), with most headless browser tools normally identifying themselves as such from the start. + +## How to deploy end-to-end monitoring with Checkly + +Now, let’s put the stuff we talked about in action. Deploying end-to-end monitoring with Checkly is super simple: +Step 1: Setting Up a Checkly Account +Ensure you have an active Checkly account. If not, sign up. The default free Team trial lasts for 14 days. To access advanced features beyond the trial, subscribe to a pricing plan based on your needs. +Step 2: Setting Up Checkly in Repository +After completing the installation steps, open a terminal in the directory of your project and run the following command: +`npm create checkly` +This command will bootstrap your repository with the basics needed to start using Checkly MaC in your project. + +{{< figure src="/guides/images/guides-checkly-install.png" alt="Checkly CLI project setup screenshot" title="Creating a project in the Checkly CLI" >}} + +In your project directory, you will find a folder named “__checks__” containing the following check templates: +``` +|__checks__ + |- api.check.ts + |- heartbeat.check.ts + |- homepage.spec.ts +``` +Once this setup is complete, log in to your Checkly account via the CLI using the following command: +`npx checkly login` +You can choose to log in from the browser or in your terminal. After logging in, you'll be able to update Checkly Checks from your local machine as long as you're connected to the internet. +Step 3: Writing Your Monitoring Scripts +In your development environment, write JavaScript/TypeScript tests for your code updates, similar to unit tests. We typically use the Playwright testing framework in the `.spec.ts` or `.check.ts` file. +Consider a scenario where you want to monitor the title of the Checkly documentation and take a screenshot of the page. To do this, replace the code in the `homepage.spec.ts` with the following: + +```javascript +import { test, expect } from '@playwright/test'; + +test('Checkly Docs', async ({ page }) => { + const response = await page.goto('https://www.checklyhq.com/docs/browser-checks/'); + + // Ensure the page is loaded successfully + expect(response?.status()).toBeLessThan(400); + + // Check if the page title is as expected + const pageTitle = await page.title(); + const expectedTitle = 'Introduction to Checkly | Checkly'; + expect(pageTitle).toBe(expectedTitle); + + // Optionally, you can take a screenshot if needed + await page.screenshot({ path: 'homepage.jpg' }); +}); +``` +This test uses the `page.goto` method to navigate to the specified URL (‘https://www.checklyhq.com/docs/browser-checks/’). The method returns a response object, which is stored in the response variable. +Then we use the `expect` function to assert that the HTTP status code of the response is less than 400. This is a way to ensure that the page is loaded successfully without any HTTP errors. +`page.title()` retrieves the title of the page and compares it with the expected title ('Introduction to Checkly | Checkly') using the `expect` function. This ensures that the page title matches the expected value. +Finally, we take a screenshot of the page and save it as 'homepage.jpg'. +Step 4: Running Test Sessions +Now that we have our test scripts ready, let’s execute them. We can use the Check CLI command to execute our monitoring pipeline in our staging environment, recording the results for inspection if something fails. Run the following command in the terminal of your project repository to execute the test: +`npx checkly test --record` +The `--record` flag is optional, you can use it if you want to record a test session with git info, full logging, videos and traces. `--record` sessions can be reviewed within the Checkly web interface. +Here is the result of the test we just executed: + +{{< figure src="/guides/images/guides-checkly-cli-check-run.jpg" alt="Running tests from the CLI" title="Running tests from the CLI" >}} + +There are also links to the detailed summary of the test at the end of the result in the terminal. Here is an example of the test summary: + +{{< figure src="/guides/images/guides-checkly-test-summary.jpg" alt="A test summary in the Checkly web interface" title="A test summary in the Checkly web interface" >}} + +As seen in the result, the test failed because if you browse the URL (https://www.checklyhq.com/docs/browser-checks/) the title of the site is “Getting started | Checkly” and not “Introduction to Checkly | Checkly” as expected in the test case. +If we update the test case to expect “Getting started | Checkly” we will have a passed test. Here is the result of the test after updating the correct title: +{{< figure src="/guides/images/guides-checkly-cli-passed-test.jpg" alt="A passing test" title="A passing test" >}} + +If you check the detailed summary, we should have a passed test too: + +{{< figure src="/guides/images/guides-checkly-ui-passed-test.jpg" alt="A passing test" title="A passing test" >}} + +Step 5: Deploying Checks +Now that you've reviewed and updated your tests, you can proceed to deploy your MaC workflow and related resources, such as alerts and dashboards. Run the following command in your project terminal to deploy the tests to your Checkly account: +`npx checkly deploy` +Once the deployment is complete, you'll see a success message in your terminal, indicating that the project has been deployed to your Checkly account. + +To verify this, navigate to the home section on the left side of the Checkly UI, and you'll find the project with the name of the test script from your local repository. +{{< figure src="/guides/images/guides-checkly-dashboard-passed-test.jpg" alt="A passing test" title="A passing test" >}} + + + +Step 6: Setting up Alerts +Checkly offers alert services to notify you whenever a check fails. Various alert channels are available, including Slack, SMS, webhook, phone call, email, Opsgenie, PagerDuty, etc. +To set up alerts for your check, go to the specific project, in this case, "homepage.spec.ts." At the top right corner of the code editor, click the "Settings" button. In the revealed side panel, access "Alert Settings" under "Retries & alerting." + +{{< figure src="/guides/images/guides-checkly-alert-settings.jpg" alt="A passing test" title="A passing test" >}} + +Here, configure monitoring parameters according to your needs, including check frequency, locations, retries and alerting. You can also set up your preferred alert channel using the Checkly CLI. Learn more about the alert channels from the official documentation. + +With the appropriate alert channels set up, there is no need for customers to regularly visit the dashboard. Instead, they will be promptly notified, allowing them to react immediately upon receiving alerts. + +## Conclusion + +Implementing end-to-end monitoring is crucial for maintaining system health, enhancing user experience, and improving operational efficiency. By establishing clear objectives, fostering collaboration across teams, continuously monitoring performance, and integrating monitoring into DevOps workflows, businesses can proactively identify and resolve issues, ensuring optimal performance and customer satisfaction. + + + +## Read More + +
+{{< doc-card class="three-column-card" title="Monitoring as code" description="Why should the way we manage monitoring be any different?" link="/guides/monitoring-as-code/" >}} + +{{< doc-card class="three-column-card" title="Checkly CLI" description="Understand monitoring as code (MaC) via our Checkly CLI." link="/guides/monitoring-as-code-cli/" >}} + +{{< doc-card class="three-column-card" title="Setup scripts for API monitoring" description="Setup scripts are a fundamental tool to tailor API checks to your own target endpoints." link="/guides/setup-scripts/" >}} + +Streamlining Complex Monitoring with Checkly: Empowering Developers and Platform Teams + +In today’s fast-paced development environment, engineers are under pressure to ensure that their applications not only function but also perform reliably under a wide variety of circumstances and conditions. Effective monitoring is key to staying on top of potential issues and keeping systems running smoothly with minimal downtime. However, in many organizations, the process of setting up and managing monitors falls to specialized platform or operations teams, which can create bottlenecks. + +Checkly solves this problem by providing a solution that bridges the gap between application developers and platform teams. By leveraging Checkly’s codified MaC approach, both groups can collaborate efficiently to create, configure, and manage monitors in a seamless way that fits within existing workflows. + +Empowering Developers with Code-First Monitoring +With the rise of shift-left and the age of empowering engineers, more teams are using code to configure tests, infrastructure, and deployment models. They are finding benefits like increased collaboration, auditability, and automation in these new paradigms that are revolutionizing the way they ship software. + +Checkly fits neatly into this trend, offering software teams a codified approach to building and configuring their monitors and alerts. This means that monitors can be: + +Created faster within the software delivery lifecycle +Tested and reviewed in CI/CD pipelines +Automated across services and teams + +No more throwing monitoring over the proverbial wall. Rather than relying on a separate platform or operations team to set up monitors, engineers can take full control of what gets monitored, when, and how. This can save time, reduce errors, and make the entire process more efficient. + + +For example, here’s a simple API check defined in Checkly’s CLI: + +```bash +curl --request POST \ + --url 'https://api.checklyhq.com/v1/checks/api?autoAssignAlerts=true' \ + --header 'Authorization: [your-key]' \ + --header 'accept: application/json' \ + --header 'content-type: application/json' \ + --data ' +{ + "activated": true, + "muted": false, + "doubleCheck": true, + "shouldFail": false, + "alertSettings": { + "escalationType": "RUN_BASED", + "reminders": { + "amount": 0, + "interval": 5 + }, + "runBasedEscalation": { + "failedRunThreshold": 1 + }, + "parallelRunFailureThreshold": { + "enabled": false, + "percentage": 10 + } + }, + "useGlobalAlertSettings": true, + "groupId": null, + "groupOrder": null, + "runtimeId": null, + "retryStrategy": { + "type": "FIXED", + "baseBackoffSeconds": 60, + "maxRetries": 2, + "maxDurationSeconds": 600, + "sameRegion": true + }, + "runParallel": false, + "request": { + "method": "GET", + "url": "https://api.checklyhq.com", + "skipSSL": false, + "ipFamily": "IPv4", + "bodyType": "NONE" + }, + "frequency": 1, + "tearDownSnippetId": null, + "setupSnippetId": null, + "localSetupScript": null, + "localTearDownScript": null, + "degradedResponseTime": 10000, + "maxResponseTime": 20000, + "name": "webshop-api", + "locations": [ + "us-east-1", + "ap-east-1" + ] +} +' +``` +As seen here, engineers can quickly configure an API check that runs every minute to ensure that the status code is 200. If there’s a failure, Checkly will immediately notify the team, allowing them to address the issue promptly. + +Collaboration Between Dev and Platform Teams +While a code-first approach to monitoring empowers application engineers, many teams include both developers and platform engineers who work together to build and operate complex systems. This is where Checkly’s flexibility and extensibility truly shines. + +Platform teams often handle the configuration of complex alerts, thresholds, and scheduling across multiple environments. By codifying these aspects, platform engineers can provide a consistent monitoring “wrapper” around the application teams’ checks. This allows developers to focus on building and shipping code and adding simple checks without worrying about the operational intricacies of monitoring. + +For example, here’s a more complex Checkly configuration, where the platform team might define specific response time thresholds and alerting rules: + +```bash +resource "checkly_check" "example_check_2" { + name = "Example API check 2" + type = "API" + activated = true + should_fail = true + frequency = 1 + degraded_response_time = 5000 + max_response_time = 10000 + locations = [ + "us-west-1", + "ap-northeast-1", + "ap-south-1", + ] + alert_settings { + escalation_type = "RUN_BASED" + run_based_escalation { + failed_run_threshold = 1 + } + reminders { + amount = 1 + } + } + retry_strategy { + type = "FIXED" + base_backoff_seconds = 60 + max_duration_seconds = 600 + max_retries = 3 + same_region = false + } +} +``` +In this example, the platform team has set up detailed monitoring parameters, including response time thresholds and a retry strategy in case of failure. By wrapping these details into reusable configurations, the platform team allows application engineers to create new monitors that are consistent with the organization’s standards—without having to worry about the operational details. + +Codified Alerts and Notifications +Checkly also integrates alert channels into the code, allowing teams to manage alerts for different monitors via a code-first approach. You can specify email alerts, Slack notifications, or other channels to ensure that the right team members are notified when something goes wrong. + +For instance, here’s how to set up email alerts for a check: + +```bash +resource "checkly_alert_channel" "email_ac1" { + email { + address = "info1@example.com" + } +} +resource "checkly_check" "example_check" { + name = "Example check" + alert_channel_subscription { + channel_id = checkly_alert_channel.email_ac1.id + activated = true + } +} +``` +By codifying alert configurations, platform engineers can ensure that the organization’s monitoring rules and notification protocols are followed consistently, even as application teams create new monitors. +Conclusion +Checkly’s approach to monitoring via code gives engineering and operations teams the tools they need to keep applications running smoothly. Application engineers can take ownership of their monitors, ensuring that they’re set up efficiently and integrated into their workflows. Meanwhile, platform teams can manage and maintain a higher-level view, providing the necessary configurations and support for more complex systems. + +Whether your team is fully developer-led, or you have a more traditional split between development and platform engineering, Checkly’s code-first monitoring solution ensures that everyone can collaborate smoothly and efficiently. As modern applications continue to grow in complexity, tools like Checkly are becoming essential to manage the intricacies of monitoring in a fast-moving development environment. \ No newline at end of file diff --git a/site/static/images/avatars/daniel-giordano.png b/site/static/images/avatars/daniel-giordano.png new file mode 100644 index 0000000000000000000000000000000000000000..b8bebd6a73dd639807a238bb3cbbb76a98144144 GIT binary patch literal 37620 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 literal 0 HcmV?d00001 diff --git a/site/static/images/avatars/nica-mellifera.png b/site/static/images/avatars/nica-mellifera.png new file mode 100644 index 0000000000000000000000000000000000000000..3674c1d8aa0c307f8e16a1954a1e4ce26219f805 GIT binary patch literal 27066 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 Ay#N3J literal 0 HcmV?d00001