# What is Ddosify?

Test, Observe and Detect in a Single Platform

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FoGHobCfkVh7YBz07oSnW%2F03_Ddosify_Kubernetes_Service_Map.png?alt=media&amp;token=fdccc145-9f37-485d-a857-6120c2ab081e" alt=""><figcaption><p>Ddosify automatically generates Service Map of your K8s cluster</p></figcaption></figure>

## What is Ddosify?

Ddosify is an [open-source](https://github.com/ddosify/ddosify) **Kubernetes Monitoring** and **Performance Testing** platfor&#x6D;**.**

### **🔎 Kubernetes Monitoring:**

* **Automatic Service Map Creation:** Ddosify automatically creates a **service map** of your cluster without code instrumentation or sidecars. So you can easily find the bottlenecks in your system.
* **Performance Insights:** It helps you spot issues like services taking too long to respond or slow SQL queries.
* **Real-Time Metrics:** The platform tracks and displays live data on your cluster instances CPU, memory, disk, and network usage.
* **Ease of Use:** You don't need to change any code, restart services, or add extra components (like sidecars) to get these insights, thanks to the eBPF technology.
* **Alerts for Anomalies:** If something unusual, like a sudden increase in CPU usage, happens in your Kubernetes (K8s) cluster, Ddosify immediately sends alerts to your Slack.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FqfVMZAxG5b6RrqJO3o3l%2F02_Ddosify_Kubernetes_Metrics.png?alt=media&amp;token=94663fff-7ccc-4fce-9520-48a61845632c" alt=""><figcaption><p>Ddosify tracks and displays live data on your cluster instances CPU, memory, disk, and network usage.</p></figcaption></figure>

### **🔨 Performance Testing:**

* **Multi-Location Based:** Generate load/performance tests from over 25 countries worldwide.
* **Easy Scenario Builder:** Create test scenarios easily without writing any code.
* **Seamless Integration with Kubernetes Monitoring:** Performance testing is natively integrated with Kubernetes monitoring for a unified experience.
* **Postman Integration:** Import tests directly from Postman, making it convenient for those already using Postman for API development and testing.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F1vwT3porbqon8RW2S2Na%2F08_Ddosify_Performance_Testing.png?alt=media&amp;token=0bd987f8-2ab0-493a-ae7c-bb227c944cae" alt=""><figcaption><p>Ddosify generates load from worldwide with no-code scenario builder</p></figcaption></figure>

## Ddosify Stack

Ddosify Stack consists of 4 parts:

* [Ddosify Engine](#ddosify-engine)
* [Ddosify eBPF Agent (Alaz)](#ddosify-ebpf-agent-alaz)
* [Ddosify Self-Hosted](#ddosify-self-hosted)
* [Ddosify Cloud](#ddosify-cloud)

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FYJyIGPLAqKJUFGU3maaF%2Fdd_stack.png?alt=media&amp;token=1541369f-238e-4fb1-86c8-b5eadd2be4f3" alt=""><figcaption><p>Ddosify Stack </p></figcaption></figure>

### 🚀 Ddosify Engine

[Ddosify Engine](https://github.com/ddosify/ddosify) is the load engine, written in Golang. It's a CLI load-testing tool. Ddosify Self-Hosted and Ddosify Cloud use it under the hood for load generation. It is fully open-source and can be used on the CLI as a standalone tool. It has **\~8K** Github Stars. Ddosify Engine is available via [Docker](https://hub.docker.com/r/ddosify/ddosify), [Docker Extension](https://hub.docker.com/extensions/ddosify/ddosify-docker-extension), [Homebrew Tap](https://github.com/ddosify/ddosify#homebrew-tap-macos-and-linux), and downloadable pre-compiled binaries from the [releases page](https://github.com/ddosify/ddosify/releases/latest) for macOS, Linux, and Windows.

Check out our [GitHub Page](https://github.com/ddosify/ddosify) for more information and usage.

### 🐝 Ddosify eBPF Agent (Alaz)

[Alaz](https://github.com/ddosify/alaz) is an open-source Ddosify eBPF agent that can inspect and collect Kubernetes (K8s) service traffic without needing code instrumentation, sidecars, or service restarts. Alaz is deployed as a DaemonSet on your Kubernetes cluster. It collects metrics and service traffic and then sends them to Ddosify Cloud or Ddosify Self-Hosted. It is also Prometheus compatible, so that you can use it as a standalone tool.

Check out the [Alaz](https://github.com/ddosify/alaz) repository for more information and usage.

### 🏠 Ddosify Self-Hosted

[Ddosify Self-Hosted](https://github.com/ddosify/ddosify/tree/master/selfhosted) features a web-based user interface, **Performance Testing**, and **Kubernetes Monitoring** capabilities. You can add your servers as Load Engines to the platform for distributed performance testing. While it shares many of the same functionalities as Ddosify Cloud, the Self-Hosted version is designed to be deployed within your infrastructure for enhanced control and customization.&#x20;

It has two versions: Community Edition (CE) and Enterprise Edition (EE). You can see the differences in the below [comparison table](#comparison-of-ddosify-cloud-self-hosted-ee-self-hosted-ce).

Check out our [Github Page](https://github.com/ddosify/ddosify/tree/master/selfhosted) for more information and usage.

### ☁️ Ddosify Cloud

[Ddosify Cloud](https://app.ddosify.com/) features a SaaS, web-based user interface, multi-location-based **Performance Testing**, and **Kubernetes Monitoring**. Anyone can test the performance of backend endpoints, monitor Kubernetes Clusters, and find the bottlenecks in the system. It has a simple/no code UI, insightful charts, service maps, and more features.&#x20;

With Ddosify Cloud, you can generate traffic to your endpoints from 25+ countries without code or scripting.&#x20;

Check out [Ddosify Cloud](https://app.ddosify.com/) to find the performance issues on your system instantly.

## Comparison of Ddosify Cloud, Self-Hosted EE, Self-Hosted CE

<table data-full-width="false"><thead><tr><th width="255">Ddosify Cloud</th><th width="280">Ddosify Self-Hosted (EE)</th><th width="329">Ddosify Self-Hosted (CE)</th></tr></thead><tbody><tr><td>✅ Kubernetes Monitoring</td><td>✅ Kubernetes Monitoring</td><td>✅ Kubernetes Monitoring</td></tr><tr><td>✅ Alerts</td><td>✅ Alerts</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span> Alerts</td></tr><tr><td>✅ Distributed Load Testing</td><td>✅ Distributed Load Testing</td><td><p>✅ Distributed Load </p><p>Testing</p></td></tr><tr><td>✅ Assertion, Correlation, Test Data, Debugging</td><td>✅ Assertion, Correlation, Test Data, Debugging</td><td>✅ Assertion, Correlation, Test Data, Debugging</td></tr><tr><td>✅ Insightful Test Reports</td><td>✅ Insightful Test Reports</td><td>✅ Insightful Test Reports</td></tr><tr><td>✅ Postman Import</td><td>✅ Postman Import</td><td>✅ Postman Import</td></tr><tr><td>✅ Team Plan</td><td>✅ Team Plan </td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span> Team Plan</td></tr><tr><td>✅ SSO</td><td>✅ SSO</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span> SSO</td></tr><tr><td>✅ API Integration</td><td>✅ API Integration</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span> API Integration</td></tr><tr><td>✅ Global Load Zones</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span> Load zones deployed by you</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span> Load zones deployed by you</td></tr></tbody></table>

{% hint style="info" %}
**CE:** Community Edition

**EE:** Enterprise Edition
{% endhint %}


# Getting Started

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FrUPmeuElmdDPrDF6gPze%2F04_Ddosify_Kubernetes_Service_Map_Show_Slow.png?alt=media&amp;token=dfcdf7cb-0636-4710-ab69-bf3f4dfc5b88" alt=""><figcaption><p>Ddosify detects high latency service calls on your K8s cluster</p></figcaption></figure>

### Ddosify Features

:white\_check\_mark: **Kubernetes Monitoring**

&#x20;    Effortlessly visualize Kubernetes clusters as Service Map. Inspect HTTP latencies, find idle services, and get actionable insights.

:white\_check\_mark: **No-code Performance Testing,**

&#x20;   You can create complex and realistic user flows on Ddosify's No-code UI. Here are the list of key concepts on Ddosify's No-code UI.

* [Parametrization](/ddosify/performance-testing/parametrization)
* [Test Data Import](/ddosify/performance-testing/test-data-import)
* [Environment Variables](/ddosify/performance-testing/environment-variables)
* [Correlation](/ddosify/performance-testing/correlation)
* [Assertion](/ddosify/performance-testing/assertion)
* [Debugging](/ddosify/performance-testing/debugging)
* [Postman Import](/ddosify/performance-testing/postman-import)

:white\_check\_mark: **Detailed Reporting**

&#x20;     Insightful reports and charts to improve your observations. Analyze the failed requests on UI.

### **How to start**

➡️ Follow the [Kubernetes Monitoring](/ddosify/kubernetes-monitoring) section to learn about effortless Kubernetes Monitoring using eBPF.

➡️ To understand how to set up no-code Performance/Load Testing using Ddosify Cloud or Ddosify Self-hosted, check [Performance Testing](/ddosify/performance-testing).


# Dashboard

The first page that welcomes you after logging in is the dashboard. Here, you can think of this page as a summary of your account. Through the dashboard, you can view your observability summary, latest load/latency tests, subscription status etc.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FZ7NflYDOApTODQl0T2iZ%2Fimage.png?alt=media&amp;token=865fe1e6-61d1-45c5-aa2e-f6df8ce92097" alt=""><figcaption><p>Dashboard</p></figcaption></figure>

There are 7 sections in the dashboard:

* Available Credits
* Observability Stats
* Load Test Stats
* Latency Test Stats
* Latest Load Test Runs
* Latest Latency Test Runs
* Usage Report

### Available Credits

<figure><img src="https://lh7-us.googleusercontent.com/seA8ItCCD4O2wfZDr0TTFt3H-zHh_lxUwJQYRZa_ai_JXEc2i1ABSWkj5eWL4-a7nwbh20JKlIm-eYS6mIRW0SCLbA2B-Xi6mBT4TjL7dHAtl0yxSEXRVX6lSQkaSmkDYUq1-V_OCSJmgdgzR5LP3c4" alt=""><figcaption><p>Available Credits</p></figcaption></figure>

Here, information about your plan and subscription status is written. Your Cloud and Self-Hosted plans differ and thus they are represented separately. You can also use the button below to change your subscription plan.

### Observability Stats

<figure><img src="https://lh7-us.googleusercontent.com/UxfgG9F8fboH0rjww1igVg7XNIhHvP4Rpb12REAm5ZEV2S0UAdcWuQP0Wo2-uCW9-oMVdDU3YDCKmKxdL4Gep4Zo2TGeo5bo8Raa9xcL2JSq8zB1Fd0HAdkvaCC8aEMDd_SoDphKAg56JpouDAMY-iQ" alt="" width="375"><figcaption><p>Observability Stats</p></figcaption></figure>

Here, you can view the number of clusters you’ve created and the latest data collected from any of them. You can also use the button below to create a new cluster.

### Load Test Stats

<figure><img src="https://lh7-us.googleusercontent.com/ylLhsTYE6InijwSc_BAgxTSdklDAiozIfgIAv9lXfnq1UDQhmEx85xsT_DKUhepmpXHLZJAqhLGdmYf3_syAsvH9KBHgdQYn--GM_Q58vpXNXxYhpvodl06sPep3jJ33GXe_2UFmjJqzzYB0Yda5gjI" alt="" width="563"><figcaption><p>Load Test Stats</p></figcaption></figure>

Here, you can view the total number of load test results and the number of test plans you have. You can also use the button below to create a new load test.

### Latency Test Stats

<figure><img src="https://lh7-us.googleusercontent.com/bgXNSFnK9ERuA5yMxkpdDX1sdo4sexxYycQEkh7Ork2tC-X3I_ccMUkmtAgDsfyECRW-zUqMShPL_34NSgZexV-TCQlnEJTJQEfva9Yw_0FExaaWpBkaTmHZT57I5CqN4reQVeFZqivzbsSlo_SgmwU" alt="" width="563"><figcaption><p>Latency Test Stats</p></figcaption></figure>

Here, you can view the total number of latency test plans and the number of schedulers you have. Schedulers are based on these test plans and they are designed to run regularly. You can also use the button below to create a new latency test.

### Latest Load Test Runs

<figure><img src="https://lh7-us.googleusercontent.com/yEkov9BigAyQD-fbe8CrU7ph3Fy1f6NKDTONK_9Rb-Z5mEdM1F8F0rc5wtgI6KO8KuGC7YUjvYtVd73mgq2QrJST8LVvXrHm-0VikNPT9bDfNkzXGBX8M6p76Bsc3Z82yIl3VI1QJeX3K0OwqrdDlVQ" alt="" width="563"><figcaption><p>Latency Load Test Runs</p></figcaption></figure>

Here, you can view your latest 5 load tests and their status. You can also click on the “List All” button to view all of your load test results.

### Latest Latency Test Runs

<figure><img src="https://lh7-us.googleusercontent.com/L7iI4B32cdllVTkrkoWVTI6i0-1O_zoAImuFQy2EjxVhmDMNgI8TOhOqI7WTWAI8hXYWtsHs4_UdiJcYFONRz6tFEhD8WmUf9y9Vc2VSR-zumOdSiBuz_F2_ICvl8PhoZ4cFvpiVWRMiq3mV8eNy31M" alt="" width="563"><figcaption><p>Latest Latency Test Runs</p></figcaption></figure>

Here, you can view your latest 5 latency tests and their run counts along with the last run timestamp. You can also click on the “List All” button to view all of your latency test schedulers.

### Usage Report

<figure><img src="https://lh7-us.googleusercontent.com/e2_OQ-LTTOcGSAhNMHbwCjj6NuyqvlyGUPL9nv3kJMi9bABsRYeHtvaBB-PfEc1Up5Pzr6pL332yD18Y_lWgzY0N5iMqh0es4xGt9tNuY39AfZ4yq6wbDTxlVVBu8FHMJFgiB2OZQEnJ7EVTWib63JA" alt=""><figcaption><p>Usage Report</p></figcaption></figure>

Here, you can view your request count and duration usage summary for the last 30 days. You can see more details if you hover on the data:

<figure><img src="https://lh7-us.googleusercontent.com/XEXzIUIDMzwkl8S7liRLlA2n8sdxhejsb4tSdbdjOrKg5HSbDt-L0nqDZHusfvD5SXgI9E_FsLi2h2Q7RAxMuVPoKvps31Cgzam4sMoA8zUwNEMZdZyPyAoQZPZlyAc3qBpQfaHk-vhoraJpf6S-mY0" alt=""><figcaption><p>Hovering on the usage report</p></figcaption></figure>


# Pricing

In Ddosify, you can choose from different subscription plans depending on your needs as upgrading your plan allows you to do more. You can compare different plans, evaluate what they offer depending on your requirements and pick the best option for you. Here’s how you can do that:

<figure><img src="https://lh7-us.googleusercontent.com/biJMCkAnusISXGeM8-2xWFX54qvupkp6DI7ALmSP_7WEkpVld5hfkC2J-O4rRGrABPgMKmooz7lDegBOS-56d9I5sVvNKsB2P3uEpsw58vbkz9mKQLc6gDd5C7snSQFaLb5lijYTjf2eqvIGWj_lQfQ" alt=""><figcaption><p>Cloud pricing page</p></figcaption></figure>

In the pricing page (that you can reach through the “Pricing” button that appears when you click on your user on the upper right corner), there are two tabs: Cloud and Self-Hosted. You can pick whichever one that suits your needs.

<figure><img src="https://lh7-us.googleusercontent.com/ZWuXFbguTlQ3koy2pfUon6Bx75PRYNYT0vW6QiZtxEotLFZ_wi6NYTJ8yHjr-fI0NSj7mslKak2fuk5GpT9Ufcm61i6Tin693ngoTerRLGeQCSGwZ1QI4xXPplT151RzqeRf0vr1870qpBp3RxGOWtc" alt=""><figcaption><p>Self-Hosted pricing page</p></figcaption></figure>

In Cloud, you can choose from the following:

* Free
* Small
* Medium
* Enterprise
* Custom

Here is a comparison between plans:

| **Explanation**                                                                                                                                                                                                  | **Feature**                  | **Free**                | **Small**                               | **Medium**                              | **Enterprise**                       | **Custom**                                               |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------------------- | --------------------------------------- | --------------------------------------- | ------------------------------------ | -------------------------------------------------------- |
| Maximum number of Kubernetes nodes to observe                                                                                                                                                                    | Kubernetes Nodes Count       | 1                       | 2                                       | 10                                      | 60                                   | Custom                                                   |
| Once the data retention period has expired, you will no longer be able to access your observability data                                                                                                         | Observability Data Retention | 1 Day                   | 2 Days                                  | 3 Days                                  | 7 Days                               | Custom                                                   |
| Maximum number of active alerts                                                                                                                                                                                  | Alert Count                  | 3                       | 5                                       | 10                                      | 25                                   | Custom                                                   |
| <p>The request represents an individual network request fired by</p><p>          Ddosify. Your request count balance will be decreased every time</p><p>          Ddosify sent a network request.</p><p><br></p> | Request Count                | 50,000                  | 500,000                                 | 5,000,000                               | 50,000,000                           | Custom                                                   |
| The Duration represents the total test duration you can run on Ddosify Cloud. The granularity of the duration is in seconds.                                                                                     | Duration                     | 500 seconds             | 2,500 seconds                           | 12,000 seconds                          | 60,000 seconds                       | Custom                                                   |
| <p>Once the data retention period has expired, you will no longer be</p><p>          able to access your information.</p><p><br></p>                                                                             | Data Retention               | 3 Days                  | 14 Days                                 | 30 Days                                 | 90 Days                              | Custom                                                   |
| Maximum Test Duration for a single load test                                                                                                                                                                     | Max Test Duration            | 2 Minutes               | 5 Minutes                               | 10 Minutes                              | 15 Minutes                           | Custom                                                   |
| Maximum concurrent user/iteration for a single test                                                                                                                                                              | Max Concurrent User          | 100                     | 1,000                                   | 2,500                                   | 5,000                                | Custom                                                   |
| Maximum request origin country count for a single test                                                                                                                                                           | Max Load Zone                | 1 Country               | 5 Countries                             | 10 Countries                            | 25 Countries                         | Custom                                                   |
| Maximum uploadable file size (multipart, binary).                                                                                                                                                                | File Size                    | 500 KB                  | 1 MB                                    | 2 MB                                    | 9 MB                                 | Custom                                                   |
| Maximum city count per latency test                                                                                                                                                                              | Max City Per Test            | 3                       | 10                                      | 25                                      | No Limit                             | No Limit                                                 |
| Maximum interval period for a single scheduled latency test                                                                                                                                                      | Max Interval                 | 5 Minutes               | 1 Minute                                | 30 Seconds                              | 30 Seconds                           | Custom                                                   |
| Maximum active scheduler count                                                                                                                                                                                   | Scheduler                    | 0                       | 2                                       | 10                                      | 50                                   | No Limit                                                 |
| <p>Technical support<br></p>                                                                                                                                                                                     | Support                      | Community (Best Effort) | Community (Business hours, 3 days max.) | Community (Business hours, 1 to 2 days) | Premium (Business Hours, 1 day max.) | Dedicated (Professional support through a Slack channel) |
| Manage your team members and their access.                                                                                                                                                                       | Team Management              | No                      | No                                      | No                                      | Yes (Up to 5 users)                  | Yes                                                      |
| Single Sign On (SSO) support like Okta, Onelogin etc.                                                                                                                                                            | SSO (Single Sign On)         | No                      | No                                      | No                                      | Yes                                  | Yes                                                      |

In Self-Hosted, you can choose from the following:

* Free
* Enterprise
* Custom

| <p><br></p>                   | **Selfhosted Community** | **Selfhosted Enterprise** | **Custom**        |
| ----------------------------- | ------------------------ | ------------------------- | ----------------- |
| Distributed Load Testing      | Yes                      | Yes                       | Yes               |
| Kubernetes Cluster Monitoring | Up to 1 node             | Up to 20 nodes            | Custom            |
| Alert Count                   | No                       | Up to 25 alerts           | Custom            |
| SSO                           | No                       | Yes                       | Yes               |
| Team Plan                     | No                       | Up to 5 users             | Custom            |
| Support                       | Community Support        | Premium support           | Dedicated support |

To pick the best option for you, you can compare the plans [here](https://app.ddosify.com/pricing).

{% hint style="info" %}
**Note:** If you wish to create your own plan, you can click on the “Contact Sales” button or send an email to <support@ddosify.com> to get in touch with us.
{% endhint %}

{% hint style="info" %}
**Note:** You can’t simultaneously use paid plans in both Cloud and Self-Hosted. You can either pick one. If you upgrade your plan to Self-Hosted enterprise, you will only be able to use Ddosify Cloud in the free plan and vice versa.&#x20;
{% endhint %}

To change your plan, you can use the buttons below them:

<figure><img src="https://lh7-us.googleusercontent.com/pxIMwRlWax1BwqlconHwgAu8HThucZpgIedDqaKL5hEpU2kCqVY243pZKzuTm76SkXeac-gserLHXPzsXH7iGvyvG-D7aq2SH3z4epK-3XpVgMY2ERNAv2hhyCcVR-eea3e8RxTM30_Cvx5ufz-5EXQ" alt=""><figcaption><p>Plan upgrade/downgrade buttons</p></figcaption></figure>

### Buying Your First Plan

To upgrade your plan, you can click on the “Upgrade” button below your selected plan. This will take you to the payment pop-up. For handling payments, Ddosify uses Paddle as a payment provider and its security is guaranteed. To learn more, you can check [Paddle](https://www.paddle.com/).&#x20;

&#x20;

<figure><img src="https://lh7-us.googleusercontent.com/a4iVSqWQcVl8eZOS2oPaLlZ_LncB-6o5nZypU1CzBFqf8sY8wbH10IUPzvdhpYZxnodRTaTt2OhKXsGCGjIGRg3Sr1hv350TS-ph86vYfN5cL_qmt4qKPA-h5nWlOdoVe9szxf0qO0c4seCFuV5J2PA" alt="" width="563"><figcaption><p>Paddle payment pop-up</p></figcaption></figure>

After you fill your payment information and submit the form, you can start to use your plan right away. Your request count and duration will be updated according to your new plan.

### Upgrading Your Plan

To upgrade your plan, you can click on the “Upgrade” button below your selected plan. First, a notification will show up:

<figure><img src="https://lh7-us.googleusercontent.com/zstGxkn3BjKeBn0e0zynZRUwQGflkkhWePYrxGDuWR50TcaSlM54EekJtw1dxwD7-LsnyE4gUdQUJb5X34KbX8vAC_L_NjWDI3fLwUUQKL241lQH5UHrWYQVJC8Hz7CPJdKwk8F8tmNd20PfrwqtXuc" alt="" width="375"><figcaption><p>Plan upgrade pop-up</p></figcaption></figure>

After you click on “Approve”, your plan will be upgraded and you can start to use your new plan right away. Your request count and duration will be updated according to your new plan.

### Downgrading Your Plan

To downgrade your plan, you can click on the “Downgrade” button below your selected plan. First, a notification will show up:

<figure><img src="https://lh7-us.googleusercontent.com/DQqvoe2J0Zx8Uvn2doIfa3APXmpZvYA8FH6XwJgncRocplGcL4pOanydskG33N3j2HZS4kn7FRLUPvY8_Nq3oTFcX8_ftb0f6EvrN3b3q9NRUxfArd4GlYUzDeWARuDXD7vqPNl__zWskHei2z9pPtE" alt="" width="375"><figcaption><p>Plan downgrade pop-up</p></figcaption></figure>

After you click on “Approve”, your plan will be downgraded. Then you can start to use your new plan right away. Your request count and duration will be updated with your new plan.

### Canceling Your Plan

To cancel your plan, click on the “Downgrade” button below the free plan in the pricing page. Then, this pop-up will appear:

<figure><img src="https://lh7-us.googleusercontent.com/CSBQ7OxEDAAAarWBf4ThpJ48TBiraFTej1_0MKqtlJFc6axUzK9gL6WANmqohCJ2j95FNkaWZB_ckIRssQ6DjUHni0GmrZWRxxVwznWE0Ru7X3QqrBYse7ioaLkmlUcxWGOaYpkTQreDzyXqXdiTRDk" alt="" width="375"><figcaption><p>Plan cancel pop-up</p></figcaption></figure>

After you click on “Approve”, your plan will be canceled. However, you can continue to use your existing plan until the next billing cycle. The pricing page will look like this until then:

<figure><img src="https://lh7-us.googleusercontent.com/MJWq8pL3LVhvRitd1vwnHxssHakbJs-gRRATIm7VS5Jwz2pBSL3oZM9P4RjMspzs71pjoUSCNsAzyYoDeintrbJFD8kESoLMlG_8TYRfN3SCLAvnHYFdr8ppIgwwHzdNBn6JX_41vLFcqwIaG-eHQjs" alt=""><figcaption><p>Cancelled plan</p></figcaption></figure>

After the billing cycle, your plan will be turned into free.

### Updating Your Payment Information

If you wish to update your payment information, you can send a mail to <support@ddosify.com>.&#x20;

{% hint style="success" %}
If you require assistance with upgrading/downgrading/canceling your subscription plans or updating your payment information, you can join our[ Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.&#x20;
{% endhint %}


# Kubernetes Monitoring

{% embed url="<https://www.youtube.com/watch?v=PrbS9LNHLAk>" %}

If you have a Kubernetes Cluster that you want to observe, look no further. Ddosify Observability allows you to monitor your Kubernetes Clusters with nearly zero manual effort. You only need to run our [open-source eBPF agent (Alaz)](https://github.com/ddosify/alaz) as a DaemonSet on your Kubernetes cluster. Ddosify will handle the rest of the work and [Service Map](/ddosify/kubernetes-monitoring/service-map), [Metrics Dashboard](/ddosify/kubernetes-monitoring/metrics) and [Distributed Tracing](/ddosify/kubernetes-monitoring/distributed-tracing) will be available on Ddosify UI.&#x20;

### Service Map

Service Map allows you to view the interactions between the resources in your K8s Cluster. Here, you can take a look at the requests sent, their latency, RPS and many more. You can also filter them however you want to get the insights you require.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FZFJisxuPfZSuHJPSro5H%2Fimage.png?alt=media&amp;token=a62d290c-f48f-4120-86b5-d246ccde7509" alt=""><figcaption><p>Ddosify Kubernetes Service Map</p></figcaption></figure>

### Metrics

Metrics allow you to view statistics about your K8s instances such as CPU/Memory/Disk usage. You can also see their change over time and apply time filtering if you want to take a look at a specific time interval.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Ff9UwWCps9EZwo9M7VBbo%2Fimage.png?alt=media&amp;token=918edbf8-7594-4d9b-b4bc-580f22efcd33" alt=""><figcaption><p>Ddosify Kubernetes Metrics</p></figcaption></figure>

### Distributed Tracing

Distributed tracing allows you to trace the requests sent inside your cluster without needing any custom span generation or manual instrumentation. Here, you are able to view which requests triggered which ones and their durations alongside their call hierarchy.

{% hint style="info" %}
Kubernetes Monitoring section of the Ddosify Stack is available on both Ddosify Self-Hosted or Ddosify Cloud.
{% endhint %}


# Install eBPF Agent (Alaz)

To start monitoring your Kubernetes Cluster, you need to create a new Cluster on the Ddosify platform. To achieve this, navigate to the [Clusters page](https://app.ddosify.com/clusters) and click the Add Cluster button. After providing a unique name for the Cluster, you will be navigated to the Observability page, where you will see the [Service Map](/ddosify/kubernetes-monitoring/service-map), [Metrics Dashboard](/ddosify/kubernetes-monitoring/metrics), and [Distributed Tracing](/ddosify/kubernetes-monitoring/distributed-tracing) for this Cluster.&#x20;

But before that, you have to install and run our [open-source eBPF agent (Alaz)](https://github.com/ddosify/alaz) as a DaemonSet in your Kubernetes Cluster. Follow the below instructions to set up a new cluster successfully.

{% hint style="info" %}
Installing Alaz on Ddosify Self-Hosted requires some extra steps. For that case, please refer [here](https://app.gitbook.com/o/jN3rtZ38DU58INyTNPm7/s/ugegoRCn84wtxrIelgft/~/changes/115/ddosify/self-hosted/install-ebpf-agent-alaz-on-self-hosted).
{% endhint %}

1. Click the Set Up Cluster button&#x20;

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FQVcTkolcpISafnq6OMQ9%2Fimage.png?alt=media&amp;token=b51b6a13-22e0-4d1e-b632-58fbaa7dcf33" alt=""><figcaption></figcaption></figure>
2. A pop-up will open and show you how to install Alaz via Kubectl or Helm:

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FULu9XkpPCSPPf6M3HyXa%2Fimage.png?alt=media&amp;token=3a1b0a80-a65d-41dd-97ea-16e34819d990" alt=""><figcaption></figcaption></figure>

#### Kubectl

<figure><img src="https://lh7-us.googleusercontent.com/Nlmc87GCPgmyj28j4_ZW-sROMiev83JqPwmXRfHWZC5Py1iXKQUz5pJUYlppUGeBLiTPxiUESWLx4Dw4_pCo77b7FjmdhqJDm11pZZd6Z_ajm6ZCsKuD1rrUXv2C6oOzyo_K5eDFzIetak3lQTNRS4s" alt="" width="563"><figcaption><p>Kubectl instructions</p></figcaption></figure>

This installs Alaz as a DaemonSet in your cluster. Let's see what each line does:

```
# Deploy Alaz with Kubectl
1. MONITORING_ID=0ce2ef05-ef64-459d-90d9-7f2cbd65fff8
2. curl -sSL https://raw.githubusercontent.com/ddosify/alaz/master/resources/alaz.yaml -o alaz.yaml
3. sed -i"" -e "s/<MONITORING_ID>/$MONITORING_ID/g" alaz.yaml
4. kubectl create namespace ddosify
5. kubectl apply -f alaz.yaml
```

1. Defines the monitoring id of the cluster. It's a unique id for the cluster and is auto-generated by Ddosify.&#x20;
2. Retrieves the Alaz yaml file containing the required declarations. Check [file](https://raw.githubusercontent.com/ddosify/alaz/master/resources/alaz.yaml).
3. Replaces the $MONITORING\_ID variable with the monitoring id declared in Step 1.
4. Creates the `ddosify` namespace.
5. Applies the Alaz yaml file.

#### Helm

<figure><img src="https://lh7-us.googleusercontent.com/yBHo56JR0jOD-7xiziZlNiAei0TJ0bIf3041ASoSPHBgYFTtg_O0KraW4UErLNU2Ffz7EEKYXSDReEG0780ps6YJZ9WimczUSxSkkfuQY00CktVcnlodL13jECPMPi_WuY_hrtecA2JnYxp_mMKsgFE" alt="" width="563"><figcaption><p>Helm instructions</p></figcaption></figure>

This uses the Helm package manager to do the same. It installs Alaz as a DaemonSet in your cluster. Let's see what each line does:

<pre><code><strong># Deploy Alaz with Helm
</strong><strong>1. MONITORING_ID=0ce2ef05-ef64-459d-90d9-7f2cbd65fff8 
</strong>2. helm repo add ddosify https://ddosify.github.io/ddosify-helm-charts/
3. helm repo update
4. kubectl create namespace ddosify
5. helm upgrade --install --namespace ddosify alaz ddosify/alaz --set monitoringID=$MONITORING_ID
</code></pre>

1. Defines the monitoring id of the cluster. It's a unique id for the cluster and is auto-generated by Ddosify.&#x20;

2. Adds the Ddosify Helm chart to your local Helm registry. Check [Helm Chart.](https://github.com/ddosify/ddosify-helm-charts)&#x20;

3. Updates your Helm registry with the addition of Ddosify.

4. Creates the `ddosify` namespace.

5. Installs Alaz in your cluster using Helm by setting the monitoring id. You can also set other parameters like backendHost if you use Self-hosted. Check [Helm Chart parameters](https://github.com/ddosify/ddosify-helm-charts?tab=readme-ov-file#alaz-parameters).&#x20;

6. After a few seconds, [Service Map](/ddosify/kubernetes-monitoring/service-map) and [Metrics Dashboard](/ddosify/kubernetes-monitoring/metrics) will be ready on Ddosify.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fp5wxJHyCJr8sSAsMOknV%2F03_Ddosify_Kubernetes_Service_Map.png?alt=media&amp;token=c2d4eb2b-24ac-4212-b442-aef1980bb292" alt=""><figcaption><p>Inspect Kubernetes Service Map on Ddosify Platform</p></figcaption></figure>

{% hint style="success" %}
If you require assistance with setting up Alaz, you can join our[ Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# K8s Clusters

Ddosify allows you to monitor your Kubernetes clusters in great detail while requiring minimal configuration. While monitoring your Kubernetes clusters from Ddosify, you can view their summary information. To do so, first click on the Clusters button on the left:

<figure><img src="https://lh7-us.googleusercontent.com/Yy3o5dXcd8-mrUy3WoCdspkg27HfR4krPTM1TXrmlYynUA76a01MBn3_KB38PIKs3c9VIr2WNmAF89oL9ZHFkbVeZOzGnLIXWmNMP9KmtTCdVKbxtje5fB5pn4ZeF0GQAc7j-78woEZC864DLG4hSNo" alt="" width="188"><figcaption><p>Ddosify menu buttons </p></figcaption></figure>

This will take you to the following page:

<figure><img src="https://lh7-us.googleusercontent.com/qmYUQAjgMgFdOXlH_AalDZQYev4n1G-iZ8LzXaYg-RdXH-cOzzHjUFQVGznLf4d76ZsM_UDrb8hK8iURTO9UR5zCmDhCBSeptxz8QQnjP3VLFTAcGIHxPAIQKvalmcNeX5bEuPU_nHQMoEBFSCnkxOs" alt=""><figcaption><p>Clusters page</p></figcaption></figure>

All the clusters you created are listed here. You can check all of your clusters through the page numbers below.

If you haven’t set up Alaz in your cluster, you will see “-” for its summary information. If you successfully set Alaz up and it is currently live, you will see the following:

* Last data timestamp
* Status
* Memory usage
* Filesystem usage
* CPU usage
* Node count
* Pod count
* Alaz version

If you set your cluster up successfully at some time, but it is currently not receiving data, you will see N/A for these. You can re-enable Alaz to continue from where you left off.

You can scroll to the right to find the action buttons. Here, you can view your cluster in more detail, update its name or delete it.

<figure><img src="https://lh7-us.googleusercontent.com/ogzdHyOLyvP3kRwcmKRqDinHY9az3-ZAjYQ8C9WfE4tbjhTC-wa_HQE7EknXDI3LbknEzQs_7f53V8tv8f1fS5VmX0E8kaKCzjIWRVsMG7kMffypUA7-PgtYvkEguBU3Tttq-i5Q5FkIrIiZmiUspw8" alt=""><figcaption><p>Cluster action buttons (on the right)</p></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/Z7jFUQsbUErZafXyJZemdDhteKwwB5T2q1v2vwgLNccLiLNTpMz1t4v-9ZaTsOzZHbMiF6sJm26oqhV8PpN7cjYqTlNBbW1vRuYaVe_EwetOz02k87HerPED1FcJaaFBudeyWHDw_2cB4DZlZ1xOfrQ" alt="" width="375"><figcaption><p>Renaming a cluster</p></figcaption></figure>

To add a cluster, click the “Add Cluster” button in the upper right corner. Here, you can provide a name for your cluster and it will be created. This will take you to the metrics page of your cluster. You can then follow the steps to set Alaz up in your cluster. For more details on this, please check our [installation guide](https://app.gitbook.com/o/jN3rtZ38DU58INyTNPm7/s/ugegoRCn84wtxrIelgft/~/changes/105/ddosify/kubernetes-monitoring/installing-alaz).

<figure><img src="https://lh7-us.googleusercontent.com/GwBWE9ZXxlNVDV9ZwoKDso98y3q1qIgwfRY9yijsamtleJkOERP6vQh2S8qF7eMfryXrsvBmmyM8p6H5FaaBXZ1VrrWNHjkaXIzCUgsSL-HWOeK42qdtcG4TNFApX8uIT61Wa-WkTpGhLTduz4AwRe0" alt="" width="375"><figcaption><p>Creating a cluster</p></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/uJ9hu9sKrs5GqA7tWuSOxxNV-AVyGbWayDodMs3Zoe_4JKqzDs0p0ADP975k_Pp2jU3Bc5UtZ6Kw1dwAOYm76F0KcRUMxRk_eAn9HIA4mMA74Vemm-Z3R9h8z940PXLmGDhnFmkHRm-rN6hFhDQdQp0" alt=""><figcaption><p>A freshly created cluster</p></figcaption></figure>

{% hint style="success" %}
If you require assistance with monitoring your Kubernetes clusters, you can join our[ Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# Service Map

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FoJSUDUfB4hCiC6e6phpJ%2F04_Ddosify_Kubernetes_Service_Map_Show_Slow.png?alt=media&amp;token=8bfe6833-30db-4d5e-aac7-64d0f6451e52" alt=""><figcaption><p>You can inspect high latency, high RPS network calls on Ddosify Platform</p></figcaption></figure>

Once you properly [set up your Cluster,](/ddosify/kubernetes-monitoring/k8s-clusters) Ddosify automatically creates a service map for this cluster so you can easily get insights about what is going on in your cluster.

For example, you can easily find answers to the below questions:

* What is the average latency between service X and service Y?
* Which services have higher/lower latency than XX ms?
* What is the average RPS between service X and service Y?
* Is there a Zombie Service on your cluster?
* How much time does it take to run SQL queries?
* ... and more

**Supported Protocols**

Check [Alaz](https://github.com/ddosify/alaz#supported-protocols).

Other protocols will be available soon.&#x20;

## Monitoring Your Service Map

Ddosify makes use of eBPF to monitor the requests sent in your cluster so that you can get a better view of what happens in it without any code changes, service restarts and side-cars. Here’s how you can do so:

<figure><img src="https://lh7-us.googleusercontent.com/jwKB_O5sondiEwSa7sYoj68H0mVQNdPzfsgTLIm--2VitdJijaxUi7qEURCVCrb1o-lCxQvp3VAnPMaXZGdgS-VT22YGWe-yrO4qQYSSHDLQNff006wkzMHSQ5qH01gof15eHeB17uaOkJVlbU-4-ec" alt=""><figcaption><p>Clusters Page</p></figcaption></figure>

After you click on a cluster you want to observe in the clusters page, click on the service map tab. This will take you to the service map page.

<figure><img src="https://lh7-us.googleusercontent.com/apMym9IjBViC3sTrhPfmj6rpVwOGClRVSKkjpaWYO7UIfcdqbtnEbw896ClynI-kdEB5vZHjt85KrfmbjImkSJe8GB8CFjKK8X-yQZNEu6v2Aa6QQeb_LQqIIfGhlclojWYs56EWTCTVyXUw0cbMZ0c" alt=""><figcaption><p>Service Map</p></figcaption></figure>

This is an example cluster service map page. If you haven’t completed the installation of Alaz, you will see this instead:

<figure><img src="https://lh7-us.googleusercontent.com/cwTduI-bTA5NO7Jsu9CiLdc_PPwI89bPyN6hkg7-jmIhz3n6kowyU9RzIZAcMw4sRz9pOBLqh6I6stfkodG0s9WXCc2Vb4WUvJrT6p33Bt4rw_doI2CmOHpK5MjQXcFlO7_DDt6HkgKx9Wre9aTg2OE" alt=""><figcaption><p>Empty Service Map</p></figcaption></figure>

To complete your cluster installation, you can check the cogwheel button right next to the node selector dropdown or click “Set Up Cluster” on the center. This shows you the instructions to connect your cluster to Ddosify through Alaz. If you need help on this, you can check the [docs](https://app.gitbook.com/o/jN3rtZ38DU58INyTNPm7/s/ugegoRCn84wtxrIelgft/~/changes/105/ddosify/kubernetes-monitoring/installing-alaz).

## Filtering the data

#### Namespaces

Here, you can pick the namespaces present in your cluster on the upper right corner to filter them.

<figure><img src="https://lh7-us.googleusercontent.com/yrP7-lQUSLCh474eocyn_dc7IYMsy4zrDevUvLNSrn2FFRS2WKp13lyBmNp48HC7yjVQxtFH6Fy8fqau8PxxF_N1mkXR6s6pcqgk-fBdbMYh-XHfCwFGL_rd7lBOg6l6fQ7EQCpSuv5s6ITHqdLFFU8" alt="" width="563"><figcaption><p>Namespace filtering</p></figcaption></figure>

#### Protocols, Status Codes, Latencies, RPS

You can use the filters button to filter out protocols, HTTP status codes and latency/rps values. HTTP status code filter only works for HTTP protocols and does not affect the other protocols. [Here](https://github.com/ddosify/alaz#supported-protocols) is the list of supported protocols.

<figure><img src="https://lh7-us.googleusercontent.com/7I2T2zFH2X3HvTmJY9j_tNQ4qO3TO0wO8OSzfdBI8jhaELjdUodFwI9fxmexUOawvXVD2dgJ6NRQjX0YTCistHr9om3O1pJG0dpAFy38sQw2kbv_Rmig9iLlfnfb_heybXtl6d2Lx8FbU8eBPfRF-9s" alt="" width="563"><figcaption><p>Filtering traffic</p></figcaption></figure>

Each edge in the service map represents the total traffic sent/received between those two resources with all of the protocols combined. Edges are also distinguished by the receiving port of the destination resource.&#x20;

Here’s what it looks like when the filters are applied. The resources satisfying the filters are highlighted whereas the others are shadowed.

<figure><img src="https://lh7-us.googleusercontent.com/tSb05SLlxDMUmi5Jh3CmNqETp5w_OSV5hVSiBYz6X_btNZnjM9e2ZnjVVfhP646dv6yqcYp31Lxv65zekajz55CF4Spg3ywJ2nrtXkXARyZnCF61S8A7o1WbtnNiykpRSpw7gMxnx6MIRBV-FTZ_0l0" alt=""><figcaption><p>Filtered service map</p></figcaption></figure>

{% hint style="info" %}
**Note:** The latency and RPS filters filter the **endpoints** (or the SQL queries depending on the protocol of the traffic) in the edges. It **does not** filter the edges. This means that an edge (with all the endpoints in it) could have an RPS of 100 but an endpoint in it could have an RPS of 1.5. This filter looks at all of the endpoints in the edge and highlights it if a **single endpoint** satisfies the selection. If **none of the endpoints** satisfy the conditions, a shadow is applied to the edge. The same goes for the average latency. This allows you to detect bottlenecks in the traffic while still being able to see the total RPS and average latency of the edge.&#x20;
{% endhint %}

<figure><img src="https://lh7-us.googleusercontent.com/4AtRlb9eDLsE8RenF6v9xOqX9QOOTlrWgj0lai_3ALKeFBhJlPqMUM4uD3-Qiz9_CcYOXBPyxtUJV-JV1XRVxZDdWaAUdqudeFPCODFBPM2bTRWReHhgBqC-Tdm1JuXIxf2y449h5WghrT6XyaWr1UQ" alt=""><figcaption><p>Latency filtering</p></figcaption></figure>

You can also click on the “Show Only Zombies” option to highlight the Kubernetes resources without any traffic. Selecting this disables the other filters.

<figure><img src="https://lh7-us.googleusercontent.com/t2r7h8ax9-IokPsPYIrZ4cGIIrKATb6fPCEAa1EP8kAAY-v19K0WpgAoLkNiX7mhW-2dpx7H4KyOpz9yM3cA5kIKFmn6CJF2_iqatjsvJyZPP1XVWBRbpo5GYj3908J6futV-p2qgW5-YBraW_IY7P4" alt=""><figcaption><p>Zombie filtering</p></figcaption></figure>

Here are the zombie resources of the service map. These are the resources that do not have any traffic related to them.

#### Time intervals

You can also use the time selector in the same upper right corner. You can either specify one of the predetermined time intervals on the right or you can specify your custom time interval:

<figure><img src="https://lh7-us.googleusercontent.com/7DO8oPor-naoDm2G-H4JGgYsues9GA3MBxxT1ZS58pQcRUukSDNT_NwlmhVswRrpsE6qqK_aXvM_ap0aayrlkZiZa93wTq-L0vahT4V162rOtlZWHDq_uU3e-zN4iZ2u_Z7ElR0rpEIXzskwKWMay20" alt="" width="563"><figcaption><p>Time filtering</p></figcaption></figure>

{% hint style="info" %}
**Note:** The service map page is reloaded at about every 5 seconds. If you wish to observe an instant, you can pause the page from the play/pause button on the upper right corner. After you are done, you can enable the reloading by clicking on it again.
{% endhint %}

#### Searching

If you want to look for specific resources, you can use the search bar. This highlights the matching resources with yellow and autofocuses on them. You can check the next/previous matches with the arrow buttons or by pressing Enter:

<figure><img src="https://lh7-us.googleusercontent.com/b_uxS4F1WtKgwyrZ2z4NsZ8fPpTbf0J2TDEurR3kuTqXk2eSJ-RhxTaDoK53ke_FcRL5O98DYoI7qgk0uWU11s16fwAAlsgHKjHz9dvAYx4OTx8dqOUIwys87QOMXN5h_OYEsUzoKIyECYcFzmDeGAo" alt=""><figcaption><p>Resource searching</p></figcaption></figure>

## Navigating through the service map

#### Edges

The requests sent between resources are represented by arrows/edges. The thickness and the colors of these edges depend on the average latencies and total RPS of them. To learn more, you can click on the eye icon on the upper left corner. While red colors represent higher latencies, thicker edges represent higher RPS values.

<figure><img src="https://lh7-us.googleusercontent.com/D-3JqyE_ZTkcmLDhbmMGBN_fGPx0rUE4dWzKpMSGRGdZhD4XvH4c4kXj3raQ1e5efJPC1nYCN6vJ6cCAfud6rOuR6UmyRzcs1CZN_zzy2APdvOxT44nx9rp1jCmfFtSQGa4osYutz9a-M5LTd_lt95w" alt="" width="375"><figcaption><p>Edge representation</p></figcaption></figure>

The edges are drawn from the source resource to the receiving port of the destination resource. When drawing the edges, the outgoing contact points are always the right center of the resource but the receiving contact points are determined by the receiving ports. This is because requests could be sent by any port whereas they are received only by specific ports.

<figure><img src="https://lh7-us.googleusercontent.com/3Jy9GccNUXhtHIz-0dM4naZoaNTgtffRx1W94X5iFSmhu-Z5WyYcAMFyneqk844D9qzES7uCwfjripvhIz7OHDC4SyAX7HBLPNNBtWs7lSO-tmqdRrhSBaN3TwXQg8y8h62GmEOjjC4n0bQIc-X9ylE" alt=""><figcaption><p>An example traffic flow</p></figcaption></figure>

{% hint style="info" %}
**Note:** To ensure the stable performance of the service map, a resource limit is applied when returning the data. Currently, this limit is set to 50. When this number limits your service map visualization, you are notified at the top of the page. If you cannot see some of the desired resources, you can apply namespace filtering to narrow down your results.&#x20;
{% endhint %}

{% hint style="info" %}
**Note:** To be able to draw an edge on the service map, both the source and the destination resources should be present. If at least one of them is not drawn (due to resource limiting or filtering etc.), the edge cannot be drawn either.
{% endhint %}

You can also use the minimap on the bottom right corner to navigate through the service map.

If you hover on the information button of an edge, you can see the source and the destination resources, the average latency and the total RPS of that edge.

<figure><img src="https://lh7-us.googleusercontent.com/s1GCoZQ0r4uVpqYLhtHQuRSeHLhcoih-mn7nTlYmApbYTDUP9s4w8aAMQJ2K-dBpGiPLE-elQSJi_2GD_qEBJust8hU9-ul6AYDjqXXAy5qfv1vjafRvB6fcTY2OFsau9g7jjF-4TMvrJN8NtczWHQo" alt="" width="375"><figcaption><p>Hovering on an edge</p></figcaption></figure>

If there is traffic sent to outer resources that are not present in the cluster, they are denoted as outbounds. They do not have namespaces and Kubernetes resource types.

<figure><img src="https://lh7-us.googleusercontent.com/L7LgSyX4spnkTws4xqktUuy6mpHZ_NdWKmsbqxqxSvXqnVJad3LtMxX5D1poD4dgs4tccHOGWf-UN9G7AKlV-Ok3o03O0ejwmN7O_Rf0DoBJq5OJDHufovw_LFHjA20W1MfmLPfgbMsJfYIFrM1tOVI" alt=""><figcaption><p>Outbounds</p></figcaption></figure>

#### Resources

Let’s also learn what each icon/text means in a resource:

<figure><img src="https://lh7-us.googleusercontent.com/yki97NM6nc57g8IweGN1OOvX0fiaZzpHJzH0W_mD_B2yqI4k5vZiX1aB3jzF0n9e9v1shBkx-77bDB4e9R_vtv4BrHOwljcs9QsJCTsyKyX9nvkKArZAHT2UG-DXaw3qo6U2ODjp2kdE3hVPTeYjlqU" alt="" width="375"><figcaption><p>An example resource</p></figcaption></figure>

In the header of each resource, these are written respectively:

* The most prominent protocol of the resource (if applicable)
* The name of the resource&#x20;
* The namespace of the resource
* The symbol of the resource type (Pod, Deployment, DaemonSet, etc.)

The symbol of the resource type can be seen in more detail while hovering over it:

<figure><img src="https://lh7-us.googleusercontent.com/wM6FgA_rUEC-uyi5fucpxOCcUHq8YA0VOnw1PvP3pIMDZeMvDPiUh5v1wtlwYRVnTcn9LTrDAsp9hyDdvbPm2zgCZ5s6g_zRxCmpimf9CJeWQZIzNDUF0NhDdRQT0A7bBAdx1ZfAiOaREYtghVzJu24" alt="" width="375"><figcaption><p>Hovering on the Kubernetes icon</p></figcaption></figure>

Each resource's receiving (port, protocol) pairs are also written on them.

## Monitoring individual resources

You can click on the resources to learn more about them. There can be at most three tabs for a resource:

* Summary
* Resources (applicable only if that resource manages other smaller resources, like ReplicaSets for Deployments)
* Metrics (applicable only if that resource receives traffic)

<figure><img src="https://lh7-us.googleusercontent.com/WBHwoIkrhcjfJATiCazcDVDasmSdXK5-az19Zm_LFdEHoNS7MbWdDa95UJ9ziOXNGRSMRPLIA0hr8_7VxIn6NMPBPrcqWBZ8q3dUVZk88rkDng4aGluteCzp7h84jMwkkKohsDnmInhgV-UUNdAIHJA" alt=""><figcaption><p>Resource details</p></figcaption></figure>

#### Summary

{% hint style="info" %}
**Note:** Services point their received traffic to other resources. This means that these traffic data are also present in the pointed resources and are denoted by “Forwarded From Service”. They are also written in the outgoing traffic section of the pointing Service and denoted by “Forwarded To Deployment/DaemonSet” etc.
{% endhint %}

<figure><img src="https://lh7-us.googleusercontent.com/5tuCL1t36qlJeiO-duwJ8JGz-kkX1EocKKYHB7vStr_uE7LLELC1x2L4sbYXgNE0QbPNMRM9j2B8D_h1z2w3KGnb9vcSztRT_hsTOT7kHeunz-vTLfDtyQmEIs69PXjWa-evxA6UkHefpBqF9nRIKJI" alt=""><figcaption><p>Traffic forwarded from service</p></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/OKSEQxrTrhvkHOkxs4GUOJbfL5y2HOBUn5h6vO1kdqHxAVNOoRuWDQsrHP9uqTq4561gbNzmTSrS7BWXsYCcLTv61Dvnf64V5LpNntNgBBJlkoW3Co_5uUXbmD8awc5LJjl5Jey4KWjp3RO8wfx-OII" alt=""><figcaption><p>Resource details of the forwarding service</p></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/lWZGPGuxWVMLfC77RUqCZ9Md-irRJEtGLcW6H7KciU6F-B548wG_mB1LKMFy8h-Fkm7BiY_1LAHhmt_fpplqmqyhObklJ9VbwddARfJTcGZxpiLEhlWVL21YXegNk-VsanA4m1sWed-2L9X6tkQVnwo" alt=""><figcaption><p>Resource details of the forwarded deployment</p></figcaption></figure>

In this section, you will see the name and the namespace of the resource, incoming/outgoing traffic and the used ports. If you wish to filter the traffic data, you can click the “Filters” button on the right to use protocol and HTTP status code filters. After you click “Apply”, only the traffic satisfying the conditions will be visible.

{% hint style="info" %}
**Note:** HTTP status filters only work for HTTP and HTTPS protocols. They don’t have any effect on other protocols.
{% endhint %}

<figure><img src="https://lh7-us.googleusercontent.com/eK8edFXK1Ai0yJYz4Y2VbfLyfbU5Y2exkk73PIMfC5RrQ5mI-LP7g-IWzFrisYUiJFYz3JtR2uF7DnsHNixBWlNnKGs0hwkaAZjMdbIKv9_OeDMRr1BcJQh_pdyLRVrzCAnr4aPABahEzRiFJ8KcKXw" alt="" width="375"><figcaption><p>Resource details filtering</p></figcaption></figure>

If you wish to specify a time interval, use the button next to the filters. Here, you can either specify one of the predetermined time intervals, or you can specify your custom time interval:

<figure><img src="https://lh7-us.googleusercontent.com/5XDEvMhtTmFxiL2hCq5KbdNbUnZyUzPn8iRC1S__5rJCgt6LWxLFTgAkWYEh0BVGsEw5Vk66nz1V3FYKZ4zNyEj2RO8qF72XG95tW-ROY5L6xB0LTOvK2v0A5KC_RJim4xXaQZ1yidPD8oa047sKBHc" alt="" width="375"><figcaption><p>Resource details time filtering</p></figcaption></figure>

In each traffic object, the other resource (sending resource if the traffic is incoming, receiving resource if the traffic is outgoing) and the receiving port of the receiving resource is written. Then, the traffic protocol is written alongside average latency and total RPS. If you wish to learn more about this traffic, you can click on it.&#x20;

<figure><img src="https://lh7-us.googleusercontent.com/wIVIOsJiPP7NZHOY5yRVt6nRCPu9Vt6zC_IKMRhfc6_sOtcTtOxecq6QiyrOJBQrfB9_H5x_unknyyHGoMaV_b0Sfnnz-jW2wnfGQ2BOnLoGlcQbAoP69fDh25qLHHxIZtv56iSImnAkV6If1U9m6tc" alt="" width="375"><figcaption><p>An example traffic inside the resource details</p></figcaption></figure>

Here, you can view individual endpoints belonging to this traffic alongside their average latencies and total RPS. You can use the page buttons to navigate if there are more than five endpoints.

<figure><img src="https://lh7-us.googleusercontent.com/ircWOrwHhdIT19O8JH82TcmVbrvVBGTDr38h9oumimHQ6CKV7WFGvqknA4w0HxgNl1kb4VucrlSXzQaMtJvJl553VgG-StRJjpuhY_qLnFHkQQ0TpYy4V_ysoeiB7AfNE-eproQWEBu_4JRiNNtWclY" alt=""><figcaption><p>Endpoints in the traffic</p></figcaption></figure>

If you click on the methods, more details are shown, such as status codes and latency/RPS information of them:

<figure><img src="https://lh7-us.googleusercontent.com/nUJDwwgWNGgQR5ZJxN35LghR_SgkpRlK0yEUKQ87VWcV_GQWbQ6Qx9Zw0RisHrfNtDA8RqRF_kq_D2nNHYCTcB9x8WYGjsYL3jQPSdK_75LGK2-bvokkrBvX-4b_jQz-fTWAMeHVuo5XRKfvb2jsq-I" alt=""><figcaption><p>Endpoint details</p></figcaption></figure>

If you are viewing Postgres traffic, the endpoints turn to queries. Here, if you click on the type and then on the query, you can examine the query up to a character limit.&#x20;

{% hint style="info" %}
**Note:** Literal values inside the Postgres queries are turned to placeholders.
{% endhint %}

&#x20;

<figure><img src="https://lh7-us.googleusercontent.com/XuMXRy6TnL1EgZps7bX1_PpVI0srh41kIeccIRTTi_roHof12ooeg3x5f8i9bdd5gC3gT4KDJc7zfPNfFgb5Pf8NEnc723VXipzE95lHt6_1WLxBeC0zvh4IX6cYgyzlwac2o3Jv5S5sNRc2qOg0DXY" alt=""><figcaption><p>An example Postgres query</p></figcaption></figure>

A helpful way to understand which endpoints respond the slowest or take up most of the traffic is by using the sorting option in the upper right. Here, you can sort by latency or RPS and sort with descending or ascending.

{% hint style="info" %}
**Note:** There is a traffic object per each (resource, port, protocol) tuple. For example, in the below example, there are two traffic as their receiving ports are different:
{% endhint %}

<figure><img src="https://lh7-us.googleusercontent.com/FJLfMLsbKL7lclNNTILNO8Ci4Ky6GrmHpjCuZHHIdmmKk5fcbtGtj9v4VOthS0bD7XJA71TdGawKi1rhdO_hriHrX3yuW40DZOnZx1_dgOXcXr9gX3o5MSPLHDxzOZOAe2QB1ABVItaNM7Evgs2jNoA" alt="" width="375"><figcaption><p>Two different traffic separated by ports</p></figcaption></figure>

#### Resources

This section is only applicable to Deployments, Services and DaemonSets. It shows the inner resources of the selected resource. This means ReplicaSets for Deployments, Pods for DaemonSets and Endpoints for Services. Here are some examples:

*Deployment:*

<figure><img src="https://lh7-us.googleusercontent.com/V1VuvfhS4PfCs_yQDG9l2e0u3ytdXkfokUzV8b-MDlWQQu2cgsgYFDLVme-ya3WwJkJFJRyowjIhbB5XqYhVj-60I6jdBCFRjKwUoVDNA2frrspqre99y8C4Sn3yiyiAT1YUTzEi4QzAETjeCDeSNB8" alt=""><figcaption><p>Resources of a deployment</p></figcaption></figure>

ReplicaSets belonging to the Deployment are written alongside their Pods.

*Service:*

<figure><img src="https://lh7-us.googleusercontent.com/vL5AO5MwS7tiKbNHcXcfH7fCZwWTPB3GtLGzA3zMZO6trhAodRD5VsBunVnifHVE-5ISkoE6FxanpPmthp5G9Zb2Z3jn-Qh0AJ2xcG734FnQMth3OW-0ZCN7lT7GWsf6XTyRjxqslmfsFY_yQZmGk9E" alt=""><figcaption><p>Resources of a service</p></figcaption></figure>

Endpoints, their ports and the resources they point to are written.

*DaemonSet:*

<figure><img src="https://lh7-us.googleusercontent.com/tQlyNvi-rVb0GZECt_lcstu2-_p4MCZcvm4C2yidY6VSWm09KzGz0-hb0b-ZfH6QrrGVs7Eqf-OZiJy1a5vpGXeJQwlnCuESiKInHlT2lz7UuGCEcyff75xBIaGeBM5jleiUQkGpvnS58MQ5hHklyKE" alt=""><figcaption><p>Resources of a DaemonSet</p></figcaption></figure>

Pods belonging to the DaemonSet are written.

#### Metrics

{% hint style="info" %}
**Note:** This section is only available for resources receiving traffic.
{% endhint %}

<figure><img src="https://lh7-us.googleusercontent.com/sy7eVX3yOniXLUgC2vPG5rNyZH8tTGKV3YWOUHDCj2CmF4y8t1HA6wStoVlbR6MXnk3dGMlE04-bOlQFaTovPlObbsuvxbNnreA6lOISuCif_BE6li6xH_QfFDxLAPUV1xUHMPOlWldFVaSUyP3t0JM" alt=""><figcaption><p>Resource metrics</p></figcaption></figure>

Here, you can view the following:

* The percentage of the requests ended up with 5xx status codes (only if HTTP/HTTPS).
* The distribution of the status codes over time (0,1,2 if Postgres)
* Endpoints (queries if Postgres) with the top 5 average latencies
* Endpoints (queries if Postgres) with the top 5 RPS

You can also specify a time interval of your choice on the upper right. You can either specify one of the predetermined time intervals on the upper right or your custom time interval.

<figure><img src="https://lh7-us.googleusercontent.com/mduNVxMU_kkAP22aaIVxULZDHyIp22OHjvO15zxkybdvWvYowm62uVkMTGQDVhBb6ev16wNJZZK6_pQZGbx2zVP9wataJpcUVyt-tf092_-axAtJuYIzPx0IEVZchzsXFRJ7CQeUaJgZ-WzOV_SJNos" alt=""><figcaption><p>Top 5 latencies of the resource</p></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/YMNEoWoeNXibtHxBENBYMj9hgGSi5O_9wFxJu5auEDLD9cJAlZoznLR3aCsZM6ZaXsh55YzZbK3gtPvE-1AqnniyU4ROjKBKcKvMYiNk9GOiBYOLxudkEuo7iw3IZ4XmQpoRSeDGyR5qQYWQtAYJFIY" alt=""><figcaption><p>Top 5 RPS of the resource</p></figcaption></figure>

In the top 5 latency/RPS sections, you can also filter protocols and/or search among them:

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F5Ra2ePhdIvVJx1sFRuBP%2Fimage.png?alt=media&amp;token=81a01450-aa2b-4db7-b01f-a4fdb77e6578" alt=""><figcaption><p>Filtered top 5 RPS endpoints</p></figcaption></figure>

{% hint style="success" %}
If you require assistance with monitoring your service map, you can join our[ Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# Metrics

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F5HIhExrbEnCWV0wa00fM%2F02_Ddosify_Kubernetes_Metrics.png?alt=media&amp;token=e2f8b987-75d7-49fd-bf95-91ac7724d304" alt=""><figcaption><p>lastYou can inspect CPU, Memory, Disk and Network metrics with out-of-box dashboards</p></figcaption></figure>

Ddosify tracks and displays live data on your CPU, memory, disk, and network usage of your cluster instances. All the dashboards are generated out of the box, and you can create alerts based on these metrics' values. Check out [Alerts](/ddosify/kubernetes-monitoring/alerts) for more.&#x20;

You can filter based on Time and Kubernetes Instance.&#x20;

## Monitoring Your Cluster Metrics

Analyzing cluster metrics is one of the keystones of cluster observability. And it can’t get easier than it is on Ddosify. You can view metrics about your CPU, RAM, Memory, Network usage, etc. You can also apply time filters and examine specific nodes. Here’s how you can do that:

<figure><img src="https://lh7-us.googleusercontent.com/NB0S_vFl_JI4AcEYY5wzw1C5z3MhIvM7gUjUEfK7aBi_wdF4W1Wby0NMT5_JsQQAZTYpCmW4wsmJtwr-LSlVAMYLQhT-T3mV8lQdOTLxc-6uR6lhcffjz2jsBPohN-h71lc457iVaePEqrWjaGn4Cyc" alt=""><figcaption><p>Clusters page</p></figcaption></figure>

After you click on the cluster you want to observe on the clusters page, the first page that opens is the metrics.

<figure><img src="https://lh7-us.googleusercontent.com/WmIrCyEYzn-qKWo58oXSjOQ4rviatjzwIzNLMtBst34-wreXyglzWAqJooMy2ff8ZHyZ4laYAzx4N64Cs5rAJQpmEZECBUmFSey2-c7RA5ttq68PpawKZeJcwBtaeLdGaGTTFa-qlRHHex49MxZxNks" alt=""><figcaption><p>Metrics page</p></figcaption></figure>

This is an example cluster metrics page. If you haven’t completed the installation of Alaz, you will see this instead:

<figure><img src="https://lh7-us.googleusercontent.com/P9Fe4jVJcU6wGlnVasQQVj1dd97sAH8zQYeFEsDS7ylyMCX3Ilj_-xUaetz-GB8oLPPUQeyqJJY6nDkf8ILSUwRPh7eI73SWISDhiW58I5gVAhvWScey3-3wjxJPNYCU1HjagAceRoHoc-F6VbKShRo" alt=""><figcaption><p>A cluster needing setup</p></figcaption></figure>

To complete your cluster installation, check the cogwheel button next to the node selector dropdown or click "Set Up Cluster" in the center. It shows you the instructions to connect your cluster to Ddosify through Alaz. If you need help on this, you can check the [docs](https://app.gitbook.com/o/jN3rtZ38DU58INyTNPm7/s/ugegoRCn84wtxrIelgft/~/changes/105/ddosify/kubernetes-monitoring/installing-alaz).

<figure><img src="https://lh7-us.googleusercontent.com/DcLlPLhFUaWTtBzXApUMi2z07SPVuinTfekc81rTzDCFgRziPdYnd2Y5C-7Vrwt31SqDWsxC9NYVvpF7usN_8MEoF6lapjp-gHKBC5o6f9Du_EKHwcrITUV9WunpbI0gCG_7nknZuUKfoDfiKLwApsE" alt=""><figcaption><p>Setting up Alaz using Kubectl</p></figcaption></figure>

### Filtering

#### Node selection

Here, you can pick one of your cluster nodes to see how well they operate. To do so, use the node selector in the upper right corner:

<figure><img src="https://lh7-us.googleusercontent.com/4e-UZKcSigGECCkeahSBz9aIDbMD6vQQpuuxgGxYSYUN0ts6VaKHO6HN6gfMSA1W8lznFICx4X4V9qgMk0RqkacQyV943Xc68s24b3ELkPChFt3oprdUvUhqruK9JXNl48hgG5HDrp6Lu96u94a7eYI" alt="" width="375"><figcaption><p>Node filtering</p></figcaption></figure>

#### Time selection

You can also use the time selector right next to it. You can either specify one of the predetermined time intervals on the right or you can specify your custom time interval:

<figure><img src="https://lh7-us.googleusercontent.com/gnZb51Pr4xUEu7v6IvDhOZsU9VTzOsSGAx6P0sjQSi62ymLMAxtTbvj89hJssYy6Kb71KLyotO92JahMsV6QcX31xbBqGySHI3FeUUFF5mgL9941xA0grR86ZZfj9TgNEt8EL4RAzunmDJT57CXZFIM" alt="" width="375"><figcaption><p>Time selection</p></figcaption></figure>

{% hint style="info" %}
**Note:** The nodes on the dropdown menu depend on the selected time interval. It will not be shown if a node does not have corresponding data during the selected time interval.
{% endhint %}

{% hint style="info" %}
**Note:** The metrics page is reloaded at about every 5 seconds. If you wish to observe an instant, you can pause the page from the play/pause button in the upper right corner. After you are done, you can enable the reloading by clicking on it again.
{% endhint %}

Now that you selected your node and desired interval let’s understand what each gauge and time graph presents:

### Gauges

<figure><img src="https://lh7-us.googleusercontent.com/_MCB9YgNVdogfwKpd7AQfR-VjPZdJXcQIDwMQu-nDFBneeim1uBuWslLy6d8kU1oeaHhJJG_Nnm0TFeW6XkmLbsmmR6SicTXQh05qHhbh8BOXt-pjkN0oOJAzEaU6yV6gTPZhgGHZ83Ty9pINXRYWxs" alt=""><figcaption><p>The first half of the gauge metrics</p></figcaption></figure>

<table><thead><tr><th width="135">Metric</th><th>Definition</th><th>Meaning</th><th>Numerics</th></tr></thead><tbody><tr><td>CPU Busy</td><td>The amount of time the CPU spends executing non-idle tasks. </td><td>High CPU busy percentages over extended periods might indicate that the system is under heavy load, potentially leading to slower response times or performance issues. </td><td>It is given as a percentage of the time spent non-idle over the total time spent and can’t exceed 100%.</td></tr><tr><td>Sys Load (5m)</td><td>The average load on the CPU for the past 5 minutes. Sys load represents the number of processes currently running. </td><td>If the load consistently stays high compared to the system's capacity (number of CPU cores, for instance), it could signify that the system is under heavy demand or possibly overloaded. </td><td>It is given as a percentage of the average process count over the last 5 minutes and it can exceed 100% depending on the CPU core count. </td></tr><tr><td>Sys Load (15m)</td><td>The average load on the CPU for the past 15 minutes. Sys load represents the number of processes currently running. </td><td>If the load consistently stays high compared to the system's capacity (number of CPU cores, for instance), it could signify that the system is under heavy demand or possibly overloaded. </td><td>It is given as a percentage of the average process count over the last 15 minutes and it can exceed 100% depending on the CPU core count. </td></tr><tr><td>RAM Used</td><td>The amount of Random Access Memory (RAM) currently being utilized by active processes and the operating system. </td><td>Consistent high usage may lead to performance issues and it may result from memory leaks or inefficient resource usages. </td><td>It is given as a percentage of the used amount over the total amount and can’t exceed 100%.</td></tr><tr><td>Swap Used</td><td>Swap is a space on a disk that is used when the amount of RAM (physical memory) is full. </td><td>Swap usage indicates the amount of swap space currently being used by the system. High swap usage may indicate that the system is running out of physical memory and is relying more heavily on disk storage. </td><td>It is given as a percentage of the used swap space over the total swap space and can’t exceed 100%.</td></tr><tr><td>Root FS Used</td><td>The Root File System (Root FS) contains essential files required for the system to boot and operate. Root FS usage refers to the amount of space on the root filesystem that is currently in use. </td><td>High usage could potentially lead to system performance issues or, in extreme cases, cause the system to run out of space. </td><td>Given as a percentage of the used disk space over the total disk space. It can’t exceed 100%.</td></tr></tbody></table>

<figure><img src="https://lh7-us.googleusercontent.com/lKFEx2ofIBAJWfa9YvZlVIT40yiBnF_Pd59Hw5__NCvcJcPJ8yFMuMjZZw_SLaiETNal1yiJEes0OO945sREz-Srr_Z4RqQw4CW4Y9AjBAbuEHOP1NG7DLY2qZQgg-t_JAD3J_ekMSs-xUe0ysLcfJg" alt=""><figcaption><p>The second half of the gauge metrics</p></figcaption></figure>

* **CPU Core:** Total CPU core count&#x20;
* **Uptime:** The duration for which the node has been continuously running without a restart or shutdown
* **Last Data:** The timestamp of the last recorded data
* **Total Root FS:** The total disk space of the root filesystem
* **RAM Total:** The total RAM bytes of the node
* **Total Swap:** The total Swap bytes of the node

### Time Graphs

#### Avg CPU Usage %

<figure><img src="https://lh7-us.googleusercontent.com/e5ahCtKvv1HxlV_3WB8YcQKxqW1PRNECRSvIA-fhwFTn5cCv5Ez_ShbXVIpU28u7oxYwtRv6LxoT8dxFY5Opu121whMal5WKfB04opjJp-t_IDXedxSLloTEMvSC7TiUSwihyzkgPnjvMShFKKH0YsQ" alt="" width="563"><figcaption><p>Avg CPU Usage %</p></figcaption></figure>

Represents the average CPU usage percentage of the node in different modes over the selected time interval.

#### Avg Memory Usage %

<figure><img src="https://lh7-us.googleusercontent.com/ULWVnZ6tpxBAixoxgHlo5nn9k8mG4hKJHLV8xbj97qlP3dZRpfgg-yeUGEAacQX6OTHyyLbenVgYNx33-qnbfvpjOmj6hfoWbBVY0KHJ7FgOnf0nUCPW9qFY6WXXgl1ckhl2rjA006hqkOBetZpRRuQ" alt="" width="563"><figcaption><p>Avg Memory Usage %</p></figcaption></figure>

Represents the average memory usage percentage of the node in different modes over the selected time interval.

#### Avg Disk Usage %

<figure><img src="https://lh7-us.googleusercontent.com/7YJ5C2J-UZxFNOOLI3oilnHppS6peyiENiKS8QATHarDVNf64f2lU-gYxFF9VwjQ424w2oeKGL1RXULT0qLTCBNQ9j5vthtd7wmqiTJndc8nGFx3egLgl8zzf3n_rwVx8cb40wg_kih9hNl6KB_IvTU" alt="" width="563"><figcaption><p>Avg Disk Usage %</p></figcaption></figure>

Represents the average disk usage percentage of the node over the selected time interval.

#### Avg Memory Usage

<figure><img src="https://lh7-us.googleusercontent.com/oXC8cnDmLodAW7v0WDULclppbBz42A9Eq7CtFJxxS5j2TCEpgL-ngazJBkjDWiCVrwfG0etYI_lSgVFprOCAkLZ7GOFKmXjNAdvO2CaGMa-aC2CfSqaZk8vt1rPi4MjgpGpppPtl2I3n-JYt70oXVu0" alt="" width="563"><figcaption><p>Avg Memory Usage</p></figcaption></figure>

Represents the node's memory usage over the selected time interval in bytes.

#### Avg Network Usage

<figure><img src="https://lh7-us.googleusercontent.com/0HHBMAskqueF2IRbOInymZhWDlA8_N2mfkxHPAWqpMYS7CvOJ_J0OZYqFe65fPcgErVSBOicZHgx64_vszKftWpQuY1s0nh8sCz9-XSjaATW25Bw_tMjOCnlhpLOHdRhZM1RmiVnJJvP_M4rqo3WE_U" alt="" width="563"><figcaption><p>Avg Network Usage</p></figcaption></figure>

Represents the average network usage of the node over the selected time interval in bytes. You can select your node's network interfaces in the upper right for better monitoring.

<figure><img src="https://lh7-us.googleusercontent.com/4JVv3ftXhLZe1c7h3CkxfxtNn5-6CjiGUmjPfYxP9kuu4e6-qAHA884pkRUMv5RwU-CaeHB278t2s7WSoceBx8P4eovseMF1AgnlSUO8tieMIIAIHrUS_00r6_p-oUOhQwo_hPx_QM6xzOEBlx6C2aE" alt="" width="375"><figcaption><p>Network interface selector</p></figcaption></figure>

{% hint style="info" %}
**Note:** You can click on the colors of each time graph’s legend to enable or disable them. This way, you can focus only on the modes you care about.
{% endhint %}

<figure><img src="https://lh7-us.googleusercontent.com/PtfKx7h2OLoFl6FDrmgpfizW82XvwwgvYx15vDXJ8KlBVZuWtJ9BdnvI5Y2s8x3BHB-txL7fF3bPcKRFZdJTCV-7lpnEv41GGsuX6u5LNrEUeb5pr8otWtFhUwfIXYfuu2BIHxIwV3fxoEJzsq3TvU8" alt="" width="563"><figcaption><p>Avg CPU Usage % with 4 modes enabled</p></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/lzo09qRNdlEA7jZFyDqsOLn-truJb0MrUSgZgD8OK4tPlAuCqoFzt0S3-SZA5HYC1Scp8nf2R7BdNimLFpu_ySkYNskIxqp4fK3mVPqA8AQgb7K5EPyP1FQiMLaKa4bC1QxrO52qmwYw36Klr2u2mRw" alt="" width="563"><figcaption><p>Avg CPU Usage % with 3 modes enabled (idle mode is disabled)</p></figcaption></figure>

{% hint style="info" %}
**Note:** To learn more about each metric, you can hover on the tooltip icon next to them:
{% endhint %}

<figure><img src="https://lh7-us.googleusercontent.com/ZXe_g6zXnPTNjNKX1ppocPfOtmqAv2yshYajZx-Wadj4Bspf8Ura55u4Lolj9zTBv9X8s0c69lTfY0xH9QaqUOjqJMmKHGvjhjjKlQ3rGAcQf3I985Z9qK8FRBk7jkEdx5MTOwXi121vyJL98tecyyI" alt="" width="563"><figcaption><p>Avg Memory Usage % with tooltip</p></figcaption></figure>

{% hint style="success" %}
If you require assistance with monitoring your cluster metrics, you can join our[ Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# Distributed Tracing

**Distributed Tracing** enables tracking of requests as they pass through the microservices in a syste&#x6D;**.** Ddosify captures **Traces** and **Spans** out-of-the-box on your Kubernetes Cluster without modifying your code or restarting your services. Ddosify uses a lightweight [eBPF Agent (Alaz)](https://github.com/ddosify/alaz) to generate Distributed Tracing data and enable auto context propagation.

To do so, on the [Ddosify Platform](https://app.ddosify.com/), click "Clusters" under the "Observability" tab first.

<figure><img src="https://lh7-us.googleusercontent.com/jwKB_O5sondiEwSa7sYoj68H0mVQNdPzfsgTLIm--2VitdJijaxUi7qEURCVCrb1o-lCxQvp3VAnPMaXZGdgS-VT22YGWe-yrO4qQYSSHDLQNff006wkzMHSQ5qH01gof15eHeB17uaOkJVlbU-4-ec" alt=""><figcaption><p>Clusters Page</p></figcaption></figure>

After you click on a cluster you want to observe on the clusters page, click on the distributed tracing tab. This will take you to the distributed tracing page. You will see this:

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FquV2oqpI4XSWhpNc9AYe%2Fimage.png?alt=media&amp;token=9146744c-9eb6-4e9f-a0bc-31d1db0d4082" alt=""><figcaption><p>Distributed Tracing</p></figcaption></figure>

Here, you can filter and view traces in chart and list form.

### Filtering

You can apply the following filtering:

* Operations (trace names)
* Trace count
* Tags
* Min/max duration (in ms)
* Min/max span count
* Time interval

{% hint style="info" %}
**Note:** Filtering affects both the trace chart and the trace list. They show the same traces but in different formats.
{% endhint %}

To apply filtering, click the "Filters" button on the upper right.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FTAl0la5K2EJ72Zjw6QYO%2Fimage.png?alt=media&amp;token=67267c8a-a596-4ad4-b25b-aa5b44c0feda" alt="" width="375"><figcaption><p>Trace filtering</p></figcaption></figure>

#### Operations

Operations filtering allows you to select traces with specific names. It allows multi-select so that you can look for multiple names.

{% hint style="info" %}
**Note:** The name of a trace is the name of its first span.
{% endhint %}

#### Max Results

This limits the number of traces shown.

#### Tags

Tags allow you to filter traces by the tags in their spans. Tag filtering accepts the [logfmt](https://brandur.org/logfmt) format.

{% hint style="info" %}
**Note:** Span attributes are not allowed to be nested; thus, tag filtering does not support nested filtering either.
{% endhint %}

Let's see how we can query traces by their tags. Let this be an example tags for a span:

```json
{
    "path": "/", 
    "to_ip": "192.168.20.73", 
    "method": "GET", 
    "to_uid": "d0210c8f-fe44-472c-bbb2-39d64973e5a4", 
    "from_ip": "192.168.30.206", 
    "to_name": "kube-state-metrics-shard", 
    "to_port": "8081", 
    "to_type": "daemonset", 
    "from_uid": "2148b55d-cab8-41c6-ab5e-b12d9630ba0c", 
    "protocol": "HTTP", 
    "from_name": "aws-node", 
    "from_port": "41736", 
    "from_type": "daemonset", 
    "status_code": "200"
}
```

An example tag filter could look like this:

```
method=GET protocol=HTTP from_port=41736
```

While filtering, it is enough for a single span of a trace to satisfy this filter. As a result, the traces with at least one span matching this filter are retrieved.

#### Min/Max Duration

You can filter the traces by the total time they took in ms.

#### Min/Max Span Count

You can also filter the traces by their span count.&#x20;

#### Time Interval

To apply a time interval, click the "Last 5 min" button next to the "Filters" button. You will see this:

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FdbWPJECZgIfAYOh3cjey%2Fimage.png?alt=media&amp;token=249a48f4-7378-482b-af69-740eda9b119b" alt=""><figcaption><p>Time interval filtering</p></figcaption></figure>

Here, you can specify your desired time interval. You can specify your start-end times yourself or pick predefined time intervals from the "Quick Selections" section.

{% hint style="info" %}
**Note:** The time interval between the start and the end could be apart at most 24 hours.
{% endhint %}

### Trace Chart

The trace chart allows you to view the distribution of your filtered traces by their dates and durations. While the x-axis is the date, the y-axis is the duration.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F8IcAj801tCVQlKLd0LT9%2Fimage.png?alt=media&amp;token=3652d27d-d932-44e6-99b0-4b0010c4aa7d" alt=""><figcaption><p>Trace Chart</p></figcaption></figure>

To view more details (start time, name, duration, span count) about a trace, you can hover on it:

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FDbzNe6qGpUn1p14TCcKO%2Fimage.png?alt=media&amp;token=4ee93f7b-6954-4971-b869-d34fc7c3b045" alt=""><figcaption><p>Hovering On A Trace</p></figcaption></figure>

### Trace List

Under the trace chart, you can view the filtered traces in a listed format. You can delete them here as well. You can also use the page numbers below to see the remaining traces.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FUfJWuci85oIm558Gjfk5%2Fimage.png?alt=media&amp;token=2353de1d-6b32-4a51-b8b8-1eeffdc6372c" alt=""><figcaption><p>Trace List</p></figcaption></figure>

### Trace Details

After you click on a trace (either on the chart or the list), you can view its details (including its call hierarchy and time).

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F1AmgP4m45i73CdcwDbuF%2Fimage.png?alt=media&amp;token=502e1d3e-15a0-45a2-aac3-22e11946866a" alt=""><figcaption><p>Trace Details</p></figcaption></figure>

Each row represents a trace, whereas the columns represent the time.&#x20;

No matter how long your trace took, the whole hierarchy is always fitted inside your view, so you would not need scrolling/zooming to understand the trace.&#x20;

You can expand/collapse spans by clicking on their "Name" column.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fo9BCdZo3WS5w3J4aqgVC%2Fimage.png?alt=media&amp;token=069ff45b-c381-42bf-9dc1-9a47535cc78e" alt=""><figcaption><p>Collapsed Span</p></figcaption></figure>

You can also hover over a span to see its details, such as:

* Source/target ports
* Path (endpoint)
* Status code
* Request method
* Start/end time

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F0vJcdGYZRiEApE17BXAt%2Fimage.png?alt=media&amp;token=8108e144-2f9c-4ee2-bdce-e7956442a8c3" alt=""><figcaption><p>Hovering On A Span</p></figcaption></figure>

For more details, you can click on a span:

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FRfnrXh6GDvyveD7ju1lg%2Fimage.png?alt=media&amp;token=cb92e2f3-6d52-4e66-ab2d-3635bcc03935" alt="" width="563"><figcaption><p>Span Details</p></figcaption></figure>

Here, you can view the span's details, including:

* From/to resources
* From/to IPs
* From/to port numbers
* Start/end times
* Duration
* Path
* Method
* Protocol
* Status code

{% hint style="success" %}
If you require assistance with **Distributed Tracing**, you can join our[ Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# Alerts

Ddosify monitors your Kubernetes cluster with different rules and sends alerts when necessary. For example, it can send an alert when a node's CPU usage is too high or low Disk space via E-mail, [Slack](/ddosify/integrations#slack-integration), [Opsgenie](/ddosify/integrations#opsgenie-integration) or [Webhook](/ddosify/integrations#webhook-integration).

Ddosify monitors CPU, memory, disk space, and network usage, sending alerts when exceeding thresholds.

{% hint style="info" %}
Alerts feature is available on Ddosify Cloud and Ddosify Self-hosted Enterprise.&#x20;
{% endhint %}

### Key Features and Benefits

* **Comprehensive Monitoring**: Continuously tracks the health of your system's vital signs like CPU, Memory, Disk and Network.
* **Customizable Alerts**: Set up alerts based on specific conditions that matter to you.
* **Scalable**: The system scales with your needs, whether you’re monitoring a single node or a thousand nodes.
* **Integrative**: Seamlessly integrates with popular platforms like Slack, E-mail, Opsgenie, and Webhooks for streamlined notifications. For more integrations, check [Integrations](/ddosify/integrations).

### Prerequisites

Before adding an alert, you must install the Ddosify eBPF agent ([Alaz](https://github.com/ddosify/alaz)) on your Kubernetes cluster. You can find the installation guide here: [K8s Clusters](/ddosify/kubernetes-monitoring/k8s-clusters).

{% hint style="info" %}
If you need help creating clusters or adding alerts, you can ask a question on our [Discord server](https://discord.com/invite/9KdnrSUZQg).&#x20;
{% endhint %}

### Add Alert

On Ddosify, click the Observability tab and then the Alerts tab. On this page, you can see the list of alerts that you have added before. To add a new alert, click on the **+ Add Alert** button.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fd0fUfiOvc503uh5XGw9E%2FCleanShot%202023-11-09%20at%2022.21.20%402x.png?alt=media&amp;token=e869f442-62d5-4ce4-9765-2090f4426f4d" alt=""><figcaption><p>Ddosify Add Alert </p></figcaption></figure>

Give a name and select your Kubernetes Cluster.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FVaE9IqySZZ3yK0ry6lsW%2FCleanShot%202023-11-13%20at%2021.12.38.png?alt=media&amp;token=2755a352-3a43-4c6e-8d6c-c5b59024ffdd" alt=""><figcaption><p>Ddosify Add Alert </p></figcaption></figure>

**Monitor All Current & Future Nodes** checkbox is selected by default. This means all current and future nodes will be monitored, irrespective of the K8s autoscale. However, if you want to monitor only specific nodes, you can uncheck the **Monitor All Current & Future Nodes** checkbox and manually select the nodes you want to monitor.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FXxJw8z206ESRk6yUQqdc%2FCleanShot%202023-11-13%20at%2021.49.37.png?alt=media&amp;token=ebdaa023-4291-4d53-91a7-da103afecfb8" alt=""><figcaption><p>Ddosify Add Alert - Select K8s Cluster</p></figcaption></figure>

Select Metric for alerting. Here are the metrics that Ddosify supports:&#x20;

#### CPU Metrics:

<table><thead><tr><th width="205">Metric Name</th><th width="120">Min. Value</th><th width="122">Max. Value</th><th>Description</th></tr></thead><tbody><tr><td>CPU Busy Percent</td><td>0</td><td>100</td><td>Measures the percentage of time the CPU is working on processes instead of being idle. A value close to 100% indicates that your CPU is very busy.</td></tr><tr><td>CPU Usage Percent IRQ</td><td>0</td><td>100</td><td>Tracks the percentage of CPU usage consumed by interrupt requests from hardware devices.</td></tr><tr><td>CPU Usage Percent Other</td><td>0</td><td>100</td><td>Percentage of CPU time spent in non-idle, non-user, non-system modes</td></tr><tr><td>CPU Usage Percent Idle</td><td>0</td><td>100</td><td>Shows the percentage of time the CPU is not being used by any process.</td></tr><tr><td>CPU Usage Percent User</td><td>0</td><td>100</td><td>Indicates the percentage of CPU utilized by user-initiated processes or applications.</td></tr><tr><td>CPU Usage Percent IOWait</td><td>0</td><td>100</td><td>Measures the percentage of time the CPU is waiting for Input/Output operations to complete.</td></tr><tr><td>CPU Usage Percent System</td><td>0</td><td>100</td><td>Refers to the percentage of CPU used by system processes (kernel code).</td></tr><tr><td>CPU Core</td><td>0</td><td>-</td><td>Gives the count of CPU cores available on your system.</td></tr></tbody></table>

#### System Load Metrics:

<table><thead><tr><th width="205">Metric Name</th><th width="120">Min. Value</th><th width="122">Max. Value</th><th>Description</th></tr></thead><tbody><tr><td>Sys Load 5m</td><td>0</td><td>-</td><td>Represents the system load average over the last 5 minutes, indicating how many processes are actively running or waiting to run. The max. value is your CPU core count * 100. </td></tr><tr><td>Sys Load 15m</td><td>0</td><td>-</td><td>Similar to the 5-minute metric but averaged over 15 minutes.</td></tr></tbody></table>

#### RAM Metrics in Percent:

<table><thead><tr><th width="205">Metric Name</th><th width="120">Min. Value</th><th width="122">Max. Value</th><th>Description</th></tr></thead><tbody><tr><td>RAM Used Percent</td><td>0</td><td>100</td><td>Shows the percentage of the total RAM that is currently being used.</td></tr><tr><td>Swap Used Percent</td><td>0</td><td>100</td><td>Indicates the percentage of the swap space that is in use. Swap space is used when the RAM is full.</td></tr><tr><td>RAM Usage Percent Cache and Buffer</td><td>0</td><td>100</td><td>Displays the percentage of RAM used for buffers and cache.</td></tr><tr><td>RAM Usage Percent Used</td><td>0</td><td>100</td><td>Reflects the portion of RAM being actively used by processes.</td></tr><tr><td>RAM Usage Percent Free</td><td>0</td><td>100</td><td>Shows the percentage of RAM that is free and available for new processes.</td></tr><tr><td>RAM Usage Percent Swap</td><td>0</td><td>100</td><td>Measures the percentage of the swap space currently in use.</td></tr><tr><td>RAM Usage Percent Total</td><td>0</td><td>100</td><td>Represents the total percentage of RAM used, including all buffers and caches.</td></tr></tbody></table>

#### RAM Metrics in Bytes:

These metrics are similar to their percent-used counterparts but provide the raw values in bytes, giving you an exact memory usage figure.

<table><thead><tr><th width="205">Metric Name</th><th width="120">Min. Value</th><th width="122">Max. Value</th><th>Description</th></tr></thead><tbody><tr><td>Total RAM Bytes</td><td>0</td><td>-</td><td>The total amount of RAM available on the system, in bytes.</td></tr><tr><td>Total Swap Bytes</td><td>0</td><td>-</td><td>The total size of swap space available on the system, in bytes.</td></tr><tr><td>RAM Usage Bytes Cache and Buffer</td><td>0</td><td>-</td><td>The amount of RAM in bytes used for cache and buffers.</td></tr><tr><td>RAM Usage Bytes Used</td><td>0</td><td>-</td><td>The total bytes of RAM that are currently used by processes.</td></tr><tr><td>RAM Usage Bytes Free</td><td>0</td><td>-</td><td>The amount of free RAM available in bytes.</td></tr><tr><td>RAM Usage Bytes Swap</td><td>0</td><td>-</td><td>The size of used swap space in bytes.</td></tr><tr><td>RAM Usage Bytes Total</td><td>0</td><td>-</td><td>The total size of RAM in bytes.</td></tr></tbody></table>

#### Disk Metrics:

<table><thead><tr><th width="205">Metric Name</th><th width="120">Min. Value</th><th width="122">Max. Value</th><th>Description</th></tr></thead><tbody><tr><td><strong>Root FS Used Percent</strong></td><td>0</td><td>100</td><td>Displays the percentage of the root filesystem that is used.</td></tr><tr><td>Total Root FS Bytes</td><td>0</td><td>-</td><td>The total size of the root filesystem, measured in bytes.</td></tr><tr><td>Disk Usage Percent Used</td><td>0</td><td>100</td><td>Indicates the percentage of disk space used across all mounted filesystems.</td></tr></tbody></table>

#### Network Metrics:

<table><thead><tr><th width="205">Metric Name</th><th width="120">Min. Value</th><th width="122">Max. Value</th><th>Description</th></tr></thead><tbody><tr><td>Network Usage Amount Bits Received</td><td>0</td><td>-</td><td>The total number of bits received over the network.</td></tr><tr><td>Network Usage Amount Bits Transmitted</td><td>0</td><td>-</td><td>The total number of bits transmitted over the network.</td></tr></tbody></table>

#### Miscellaneous Metrics:

<table><thead><tr><th width="205">Metric Name</th><th width="120">Min. Value</th><th width="122">Max. Value</th><th>Description</th></tr></thead><tbody><tr><td>Uptime Seconds</td><td>0</td><td>-</td><td>The total time, in seconds, that the system has been running since the last reboot.</td></tr></tbody></table>

After you select the **Metric**, select **Threshold** and **Threshold Value**.&#x20;

Select **Priority,** which will be used for urgency level. P1 represents the highest priority, while P5 is the lowest. This helps prioritize response to alerts and is used for escalation in integrated systems like Opsgenie and PagerDuty.&#x20;

Optionally, you can add Tags.&#x20;

Select **Window Duration** to specify the time window when the metric value should meet the threshold condition to trigger an alert. This helps prevent false positives and ensures consistent problematic behavior before alerting. **All the data points in the window duration should be alerted to make an alert.**&#x20;

For example, in this configuration, an alert will be triggered if the RAM Used Percent exceeds 80 for at least 30 seconds.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FTLCkztTzphKakEsz1kMx%2FCleanShot%202023-11-13%20at%2021.50.19.png?alt=media&amp;token=0e8b08f9-1a14-45da-b147-67e1d5418c68" alt=""><figcaption><p>Ddosify Add Alert Configuration</p></figcaption></figure>

By default, your e-mail address is used for notifications. You can add additional e-mail addresses by clicking the **Add New Recipient** button.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FTvLYTeIaLLgZDp6eQuYL%2FCleanShot%202023-11-13%20at%2021.41.16.png?alt=media&amp;token=f1cfc1f6-948e-47c1-9ab0-db21004c0a7e" alt=""><figcaption><p>Ddosify Add Alert E-mail</p></figcaption></figure>

You can add another integration with e-mail notification by clicking the **New Integration** button. In this configuration, if an alert is triggered, a notification will be sent using e-mail, Slack and OpsGenie.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Foz7nphCvadKYOQrSkbfC%2FCleanShot%202023-11-13%20at%2021.43.43.png?alt=media&amp;token=c4e14c10-8fb7-4fc6-9e9c-39c0560234a3" alt=""><figcaption><p>Ddosify Add Alert Notifications</p></figcaption></figure>

{% hint style="success" %}
To add new integrations, check [Integrations](/ddosify/integrations) page.&#x20;
{% endhint %}

Click **Save Alert** to save the alert. Every 30 seconds, the condition will be checked and if an alert is triggered.

{% hint style="warning" %}
Ddosify alert system sends notifications on the **1st**, **10th**, **20th**, and **30th** occurrence of an issue. This allows you to stay on top of critical events with minimal distractions.
{% endhint %}

### List Alerts

On the Alerts page, you can see your alerts as a list. You can enable/disable alerts by active column, Edit and Delete alerts. Status columns can be **OK** if everything is fine and **Alert** if there is an alert condition.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FbIidLWn5egITqrZCIPhW%2FCleanShot%202023-11-13%20at%2021.51.42.png?alt=media&amp;token=36842e1b-f3e4-4e71-a9a0-e1c1392e6cad" alt=""><figcaption><p>Ddosify Alerts List</p></figcaption></figure>

### Alert History

You can access the Alert History by clicking the Alert name in the Alert list. In this section, you can see **Alert Count**, **OK Count** and **Alert Rate** with time period (Last 5 min, Last 30 min, ...). In this example, the Alert Rate is 26.09% in the last 30 minutes.&#x20;

The table shows the **Time**, **Rule**, **Actual value** on the window, **Priority** and **Integrations** for Alerted checks.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fd1OlS9sOGXNWddFQqzlY%2FCleanShot%202023-11-13%20at%2022.17.53.png?alt=media&amp;token=b1071bc0-18e0-4d22-a7db-c8576600ffff" alt=""><figcaption><p>Ddosify Alert History</p></figcaption></figure>

{% hint style="success" %}
If you require assistance with Alerts, you can join our [Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# Performance Testing

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FmaWfk8BI1YHVX9KMIagK%2F08_Ddosify_Performance_Testing.png?alt=media&amp;token=ec8b531d-30a9-45a5-9e8b-e9fde299b084" alt=""><figcaption><p>You can simulate users on no-code Ddosify Platform</p></figcaption></figure>

You can create complex and realistic user flows on Ddosify No-code UI. Here are the list of key concepts on Ddosify Performance Testing:

* [Parametrization](/ddosify/performance-testing/parametrization)
* [Test Data Import](/ddosify/performance-testing/test-data-import)
* [Environment Variables](/ddosify/performance-testing/environment-variables)
* [Correlation](/ddosify/performance-testing/correlation)
* [Assertion](/ddosify/performance-testing/assertion)
* [Debugging](/ddosify/performance-testing/debugging)
* [Postman Import](/ddosify/performance-testing/postman-import)

If you need CLI based load testing tool, [Ddosify Engine](https://github.com/ddosify/ddosify/tree/master/engine_docs) is the open-source and high-performance load testing tool, written in Golang.


# Test Suite

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FGl6BwqAKse8l1XYHvAXd%2FScreenshot%202023-04-17%20at%2017.30.51.png?alt=media&amp;token=5096de57-b1b5-4c99-a4c5-bd2a013ccd7d" alt=""><figcaption><p>Ddosify Test Suite</p></figcaption></figure>

Test Suite is the place where the magic happens. It will let you configure scenario steps, iteration count, duration, load type, geographical distributions of the requests, etc. Once you finalize your configurations, you can start the test immediately or save it as [Test Plan](/ddosify/performance-testing/test-plan) to use for future tests.

### Where to Start

1. [Prepare Scenario Flow](/ddosify/performance-testing/test-suite/scenario-flow)
2. [Configure Load](/ddosify/performance-testing/test-suite/load-configuration)
3. [Configure Location Distribution](/ddosify/performance-testing/test-suite/location-configuration)
4. [Finalize](/ddosify/performance-testing/test-suite/finalize)


# Scenario Flow

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fq4gYxerIYr71UdxARYN9%2Fimage.png?alt=media&amp;token=45f59791-797e-4223-9c8e-520333f4cf09" alt=""><figcaption><p>Ddosify Scenario Builder</p></figcaption></figure>

### What is Scenario?

In essence, a scenario represents a series of steps designed to mimic the actions of an end-user. This end-user could be a real person using a browser to access your website or another software program that sends API requests to your endpoints.

For instance, imagine you own an e-commerce business and wish to evaluate the performance of the following user flow:

1. User visits the home page
2. User logs in
3. User adds a product to the shopping cart

To accomplish this, you must construct a scenario containing these 3 steps. It is essential to ensure that the steps are executed in the correct order, as the sequence is critical to accurately simulating the end-user's experience.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FqHmXypPMWjqTlT2VLsb1%2Fimage.png?alt=media&amp;token=19ddc4b5-24af-4ce9-9433-48881ba21d42" alt=""><figcaption><p>Ddosify Load Testing Example Scenario</p></figcaption></figure>

### What is a Step?

Step represents the individual network request.&#x20;

* **Step Name** is not mandatory. But it is nice to have since you can easily distinguish your steps on the Test Report page if you provide it.
* **Target** is where you supply network protocol and URL.
* **Method** is the HTTP method.

{% hint style="warning" %}
**Caution:** Don't put query parameters in the target field. There is a section for query parameters in the [Step Details](#step-details) section.

For example, instead of **`http://example.com/search?q=term`** write **`http://example.com/search`** and put **`q=term`** parameter to the key-value form in [Step Details](#step-details) modal.
{% endhint %}

* Click the **New Step** button if you would like to add another step to the scenario.
* Click the 'More' (three-dot icon at the right) button to provide [Step Details](#step-details).

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FjtlnBXa2poTybuABhJyV%2Fimage.png?alt=media&amp;token=f178eaa3-1a13-48e1-93b3-0166736b15f5" alt=""><figcaption></figcaption></figure>

#### Step Details

You can provide query parameters, request headers, payload, authentication, and network details of the request here. You can also [Capture Variables](/ddosify/performance-testing/correlation) and create [Assertion](/ddosify/performance-testing/assertion) logic in Step Detail.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FPmwpem1lzoRBpF3QkH4M%2Fimage.png?alt=media&amp;token=e9135bcc-14d4-45be-a5e8-345024bbe512" alt=""><figcaption></figcaption></figure>

#### Other Important Concepts on Scenario Builder

* [Parametrization](/ddosify/performance-testing/parametrization)
* [Test Data](/ddosify/performance-testing/test-data-import)
* [Environments](/ddosify/performance-testing/environment-variables)
* [Correlation](/ddosify/performance-testing/correlation)
* [Assertion](/ddosify/performance-testing/assertion)
* [Debugging](/ddosify/performance-testing/debugging)
* [Postman Import](/ddosify/performance-testing/postman-import)

&#x20;


# Load Configuration

Once you configured your scenario, the next step is configuring the shape and duration of the load.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FXZwxB7gV1TZAT5932HVX%2Fimage.png?alt=media&amp;token=4104920f-c6f8-4c38-aff1-eacc125421eb" alt=""><figcaption></figcaption></figure>

There are two methods for configuring the load: [Predefined Load](#predefined-load) and [Custom Load](#custom-load). However, both methods share two common elements: the total [iteration count](#iteration-count) and the [total test duration](#duration). Let's familiarize ourselves with these elements first.

#### Iteration Count

The Scenario is composed of a series of Steps that are executed in order. The term "iteration count" refers to the number of times the entire Scenario is executed. While some might call this the run or transaction count, we prefer to use "iteration count."

It's important to clarify that the iteration count is distinct from the request count. The relationship between these two depends on the number of Steps in the Scenario. For instance, if a Scenario contains three Steps and has an iteration count of 100, the total request count would be 300 (100 iterations multiplied by 3 Steps).

#### Duration

The Duration simply indicates the total length of the test in seconds, without any hidden significance.

{% hint style="info" %}
**Good to know:** You can see the maximum test duration you can supply at the bottom of the Duration label.
{% endhint %}

### Predefined Load

The predefined load is designed to save you time on setup. Simply input the Iteration count and Duration, then choose one of the load types. That's all it takes. Ddosify offers 3 unique load types for various scenarios:

#### Linear Load

With a linear load, the iteration count remains constant every second. For example, if the iteration count is 100 and Duration is 10 seconds, Ddosify will execute 10 iterations per second.

#### Incremental Load

In contrast to the linear load, the iteration count increases each second in this load type.

#### Waved Load

Real-life traffic doesn't follow a consistent pattern, with both busy and quiet periods. To replicate this type of load, Ddosify provides the waved load option.

### Custom Load

Ddosify comes with pre-defined load types for convenience, but you might want to design your own load type. Using the Custom Load Type Builder, you can set the number of iterations for specific time intervals. To view the load profile you've created, check the Load Preview section, which is situated to the right of the pane.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FR9wOE9JkZjpMsbip0utw%2Fimage.png?alt=media&amp;token=4ea96ecd-c95c-4877-b13e-75f7b1bfb14a" alt=""><figcaption></figcaption></figure>


# Location Configuration

In this step, you will configure load volumes from global locations that reflect your user base.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FLOPqIsdyAfD7B1o652rT%2Fimage.png?alt=media&amp;token=0e7f4f50-67c2-4954-9671-215da4d86e93" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
The location module is only available in Ddosify Cloud.
{% endhint %}

Just like the[ Load Configuration](/ddosify/performance-testing/test-suite/load-configuration) feature, the Location Configuration offers two methods for geographically distributing the load you set up earlier.

### Auto Distribution

Opt for auto mode when you prefer not to allocate load volumes for individual countries. In this mode, Ddosify evenly distributes the load across your chosen countries. For instance, if you select 5 countries and have a total of 100 iterations, Ddosify sends 20 (100/5) iterations from each location.

### Manual Distribution

Choose this mode if you prefer to personally allocate the load across different countries. This option provides you with greater control over the distribution of the load.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F5FYJNyIVSC57qYPBZsIi%2Fimage.png?alt=media&amp;token=8386ac04-1cbf-474f-893e-b950aa8ba56c" alt=""><figcaption></figcaption></figure>


# Finalize

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FsjbITUorGRBXCkw1C7bz%2Fimage.png?alt=media&amp;token=ea650c51-4405-47e0-8b45-5a7302cd7a57" alt=""><figcaption><p>Ddosify Load Testing Summary Page</p></figcaption></figure>

After setting up your scenario, configuring the load, and distributing it across locations, you now need to decide what to do with this configuration. You can launch the test immediately or save the configuration as a [Test Plan](/ddosify/performance-testing/test-plan) for future use.

### Starting a New Test

1. First, enter a unique test name, which is required to differentiate test results.
2. Click the "Start New Test" button.
3. If successful, you will be redirected to the[ Live Test Reporting Page.](/ddosify/performance-testing/test-report/live-report)

### Saving as Test Plan

1. To save the configuration for later use, enter a unique test plan name and click "Save."

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FKvWh1QwGP5FReY27kJFy%2Fimage.png?alt=media&amp;token=396fbc68-973b-47cc-8f02-4f0d6d31e1df" alt=""><figcaption></figcaption></figure>
2. If the test plan saves successfully, you will see the test plan name displayed next to the Test Suite title, indicating that the Test Suite has switched from "New" to "Test Plan Edit" mode. Any subsequent changes will update this test plan.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FWGMauMfb8fqVomRju3xS%2Fimage.png?alt=media&amp;token=52a34f3f-7cf8-4861-bd1d-4961ae94067b" alt=""><figcaption></figcaption></figure>

To create a new test using a saved test plan, simply enter a test name and click the "Start New Test" button. If successful, you will be redirected to the [Live Test Reporting Page](/ddosify/performance-testing/test-report/live-report).


# Test Plan

A test plan is a helpful tool for reusing test configurations.

### Creating a Test Plan

1. To create a new test plan, go to the ['Finalize' phase of the Test Suite.](/ddosify/performance-testing/test-suite/finalize)

### Editing Existing Test Plan

Go to the [Test Plans](https://app.ddosify.com/test-plans) page and click the **Edit Button** of the test plan you want to change.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Ff4fPaNkC7Eb5l3XuEPvt%2Fimage.png?alt=media&amp;token=06ec192f-1c37-44ef-bf1f-3de7c39541d5" alt=""><figcaption></figcaption></figure>

You will be taken to the Test Suite. The test plan name will appear on the right side of the Test Suite title, indicating that you are in 'Test Plan Edit' mode.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FZay3upR8hAwHfU49laSJ%2Fimage.png?alt=media&amp;token=96753898-5120-4558-be77-63a0cd3f08c0" alt=""><figcaption></figcaption></figure>

Save your changes by clicking the 'Save' button on the 'Finalize' step of the Test Suite.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F6K3RWkfqjPoaxdhx5vpb%2Fimage.png?alt=media&amp;token=a54700c5-98e1-4ee3-b48b-2ca170cc8246" alt=""><figcaption></figcaption></figure>

### Starting a New Test From Test Plan

Go to the [Test Plans](https://app.ddosify.com/test-plans) page and click the **Edit Button** of the test plan. Click the **Next** buttons until the Finalize step. Ddosify will give a unique test name by default, but you can change the test name if you would like. Click the **Start New Test** button to start the new test.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F8GHbXLsZqOUznpvgSR0y%2Fimage.png?alt=media&amp;token=a8d13d21-0dd2-40fa-865f-d28cdb110f30" alt=""><figcaption></figcaption></figure>


# Test Report

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FMFqUSLZfYrueI73GTxmG%2Fimage.png?alt=media&amp;token=dcb37e46-618c-4668-b126-59fb8c0688c7" alt=""><figcaption></figcaption></figure>

The Test Report module is specifically designed to display a comprehensive set of metrics gathered during load testing of your target system. It operates in two distinct modes depending on the test status. If the test is ongoing, the Test Report will be in [Live Mode](/ddosify/performance-testing/test-report/live-report). Once the test is completed, the module will switch to [Final Mode](/ddosify/performance-testing/test-suite/finalize).


# Live Report

![](https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fi8HT84tXDE2pbyKwkmL1%2FScreen%20Shot%202022-03-14%20at%2012.15.02.png?alt=media\&token=dc62a1b3-3925-411f-abcd-3cbbe0be52ea)

In Live Mode, essential metrics are displayed, allowing you to monitor the test and halt it if any unforeseen issues arise. To stop the test immediately, click the Terminate button located at the top-right corner of the page. When the test is stopped, the Test Report mode will switch to Final Mode. If the test concludes without any interruptions, the Test Report mode will also transition to [Final Mode.](/ddosify/performance-testing/test-report/final-report)


# Final Report

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FtXus0LxJaQTzS1FWoGxl%2Fimage.png?alt=media&amp;token=c84d62d6-09b7-4d43-ba47-deb0be588191" alt=""><figcaption></figcaption></figure>

The Final Report provides all the necessary information to evaluate your load test. Before diving into the details of interpreting this data, let's discuss the three possible states of the Final Report.

### States

When the test is finished, it can have 3 different states.

#### Finished

When the test is complete, it may be in the Finished state. This means Ddosify successfully executed your configuration. The word "Finished" will appear in green at the top left corner of the screen.

![](https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FCtwOYEAigyGaShZiS6iy%2FScreen%20Shot%202022-03-14%20at%2012.38.32.png?alt=media\&token=ea8a81c5-3c55-4fab-bc1e-504f7ab104e5)

#### Stopped

If you click the 'Terminate' button in[ Live Mode](/ddosify/performance-testing/test-report/live-report), Ddosify will stop the test and set its status to Stopped.

![](https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FaZfoKVj4lS7cNCSckPdR%2FScreen%20Shot%202022-03-14%20at%2012.37.57.png?alt=media\&token=8b67da35-8dfd-499f-9a71-04462b8f44d4)

#### Failed

A Failed test means something went wrong on Ddosify's end. If this occurs, you'll be refunded all credits used for that test.

### Reports

When the State shows either Finished or Stopped, the Report page will display four sections: Summary, Scenario Report, Location Report, Stats, and Analyze. Let's explore these sections and their functions.

{% hint style="info" %}
**Good to know:** Charts have a zoom feature. Don't hesitate to play with it.
{% endhint %}

#### Summary

Similar to Live Mode reports, the Summary section offers a comprehensive overview of your test results. If you notice any anomalies or unexpected behavior, you can examine the corresponding detailed reports. For instance, if the Location Stats section (located at the bottom left of the screen) shows high response times for a specific country, you can access the Location Report for a more in-depth analysis.

#### Scenario Report

The Scenario Report section allows you to closely examine the metrics for each step in the scenario.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FO71r79IlTpkJjG1uzEvy%2Fimage.png?alt=media&amp;token=6668740a-1d23-48bd-b4bc-72f8e8f77cc3" alt=""><figcaption></figcaption></figure>

#### Location Report

This section allows you to analyze your system's performance across various countries.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FPUvdlbY4zDeBL6US6Eu2%2Fimage.png?alt=media&amp;token=c4c97225-b63e-4a81-a8b8-d586c906d1bf" alt=""><figcaption></figcaption></figure>

#### Stats

The performance metrics table displays all combinations of relevant data, making it simple to identify underperforming steps in specific countries.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FyFIS31EkhPowTdGnJ1Zs%2Fimage.png?alt=media&amp;token=79891a0a-9909-48f9-b4c4-0ca1f2f97345" alt=""><figcaption></figcaption></figure>

#### Analyze

The "Analyze" section presents information about failed iterations. A chart at the top illustrates the number of failures over time, while a table beneath it lists the individual failed iterations. Although the chart may indicate multiple failures within a specific second, the table only displays one failed iteration for that second. This is because Ddosify retains the content of only one failed iteration per second.&#x20;

To examine and investigate the content of a failed iteration, simply click on the corresponding table row. A pop-up window will appear, allowing you to easily review request and response contents, environment variables, captured variables, assertion status, and test data associated with that particular iteration.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FAzBdNNysxgHS9g7jKdXZ%2Fimage.png?alt=media&amp;token=cc75d382-6d60-4e90-8b01-684ac307f8c9" alt=""><figcaption></figcaption></figure>

### Modify and Re-run Test

To re-run the test with the same settings or to modify some of its configurations, click the "Configure" button. You will be redirected to the Test Suite, which will be pre-filled with the current test's settings.

![](https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FrOAIAb2hoKdcw7PTfYMv%2FScreen%20Shot%202022-03-17%20at%2018.38.38.png?alt=media\&token=dfa0076d-1f22-42a0-8f90-e8c988036dc7)

{% hint style="info" %}
**Good to know:** When you click the 'Configure' button, it opens the Test Suite in a 'New' mode. This means that even if you initially created the test from a Test Plan, any modifications made in this mode won't impact the original Test Plan. To learn about editing a Test Plan and creating a new test from it, please refer to the [Test Plan](/ddosify/performance-testing/test-plan) documentation.
{% endhint %}


# Parametrization

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FIfHPmpzR4MsDMBQvWSCe%2Fimage.png?alt=media&amp;token=e79489dc-1c3a-4971-ba08-245258abba6a" alt=""><figcaption><p>Ddosify Dynamic Variable Feature</p></figcaption></figure>

When designing a test scenario, accurately simulating user behavior is essential. The testing platform should be capable of injecting random variables in the appropriate locations. Ddosify supports parametrization (dynamic variables) in URLs, headers, payload (body), and basic authentication. We support all the random methods that [Postman does](https://learning.postman.com/docs/writing-scripts/script-references/variables-list/). If you use `{{$randomVariable}}` in Postman, simply replace it with `{{_randomVariable}}` in Ddosify by changing `$` to `_`. This allows Ddosify to send requests with dynamic variables, simulating a realistic load test on your system.

{% hint style="info" %}
Please check the [Dynamic Variables](/ddosify/performance-testing/dynamic-variables-parametrization) section to see the complete list.
{% endhint %}

In addition to Dynamic Variables, Ddosify offers support for [Test Data](/ddosify/performance-testing/test-data-import) injection using CSV files and [Correlation](/ddosify/performance-testing/correlation), allowing you to extract variables from one step and utilize the extracted values in subsequent steps.


# Test Data Import

{% embed url="<https://www.youtube.com/watch?v=Fqfuf18upd0>" %}
Ddosify Test Data Import Feature
{% endembed %}

Import your CSV-formatted Test Data into the Ddosify Platform and incorporate it into your scenarios for more realistic testing experiences.

#### Test Data Creation

1. Navigate to the Test Data listing page within the Ddosify App, and find the 'Upload CSV' button situated at the top-right corner of the page.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FOUD99QJx3IOnfAEPMGn1%2Fimage.png?alt=media&amp;token=73c90d79-04d5-4dba-b88f-9730532e4786" alt=""><figcaption><p>Test Data Listing Page</p></figcaption></figure>

2. Once you've selected the CSV file on your computer, you will be prompted to indicate whether the first row contains column headers or not. Although you can rename the column headers later, it's crucial to inform Ddosify at this stage, as it will affect how the first row of the CSV is processed.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FwQFi0EnY7GUdnq0Mvdly%2Fimage.png?alt=media&amp;token=39053e38-527d-4284-9ffb-a41e20a57d47" alt=""><figcaption></figcaption></figure>

3. Upon uploading the CSV, you can configure the metadata, modify column headers, remove unwanted columns, and assign data types to columns. The configurations are detailed below:\
   \
   **Settings**

   * **Name:** Provide a unique identifier for this test data.
   * **Order:** Choose between 'Random' or 'Sequential'. In 'Random' mode, Ddosify selects and sends test data randomly for each iteration. In 'Sequential' mode, Ddosify reads and sends test data line by line.
   * **Skip Empty Line:** Ddosify will skip any empty rows in the CSV file if enabled.
   * **Allow Quota:** Enable this option if a quote may appear in an unquoted field, and a non-doubled quote may appear in a quoted field. By default, this is set to 'false'.

   **Data Preview**

   * Ddosify displays the first 10 rows of the CSV as a preview. In this section, you can change the column header names. Keep in mind that you will use these header names in the test scenario for data injection.
   * By disabling the 'Include Header' option, you can exclude a column, and Ddosify will not import it.
   * Lastly, assign a data type to each column to ensure proper formatting. For instance, prevent sending integer values as strings by configuring them here.

   <div><figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FhwLNIhkISQB2xoTA8xa3%2Fimage.png?alt=media&amp;token=695088e8-9efe-4b0e-bf0a-9bcb661dc96b" alt=""><figcaption><p>Ddosify Test Data Creation Modal 1</p></figcaption></figure> <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F1JCCqKepmBOb39bZtiQq%2FScreenshot%202023-04-17%20at%2018.11.25.png?alt=media&amp;token=b71ada39-5bbb-4086-8402-afea33d4f977" alt=""><figcaption><p>Ddosify Test Data Creation Modal 2</p></figcaption></figure></div>

#### Incorporate Test Data into Tests

1. In the Ddosify App, go to the Test Suite and choose the Test Data you previously created using the dropdown menu in the top-right corner of the Test Suite. You have the option to attach multiple Test Data to a single test.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FzHYlOL6suvoQjpNSsTNf%2FScreenshot%202023-04-17%20at%2018.16.35.png?alt=media&amp;token=e1f90314-2163-423c-b1de-f1268d7d9c0d" alt=""><figcaption><p>Attach a Test Data </p></figcaption></figure>
2. Utilize the `{{data.test_data_name.header_name}}` format to insert test data into one of the following locations: URL, headers, query parameters, or authentication.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FeF8Dia1g9wURWCztlzcF%2Fimage.png?alt=media&amp;token=4b0bf66c-ac32-4ef5-8638-946fa08584c2" alt=""><figcaption></figcaption></figure>


# Environment Variables

{% embed url="<https://www.youtube.com/watch?v=VIakLfguzsc>" %}
Ddosify Environment Variables Feature
{% endembed %}

Similar to Postman, the Ddosify Platform offers an Environment Variables feature that allows you to store constants in variables for convenient use within your test scenarios.

#### Environment Variable Creation

1. Navigate to the Environments listing page within the Ddosify App, and find the 'New' button situated at the top-left corner of the page.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FirMxODNnXMz6MeKgJRUN%2Fimage.png?alt=media&amp;token=8f1e7f06-576d-4708-9f95-7b235a0468e5" alt=""><figcaption><p>Ddosify Environment Listing Page</p></figcaption></figure>
2. Assign a unique name to the new environment, which will be used to link the environment to a test. Next, create your name-value pairs. The values can be of various types, such as Number, String, or Array.

   <div><figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FDP05IM3R2TL40d3Ty7JM%2Fimage.png?alt=media&amp;token=d51bd1bb-dede-46c9-91d3-edc17bf542d3" alt=""><figcaption></figcaption></figure> <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F5LvIsrdJcThHaVlzLOik%2FScreenshot%202023-04-17%20at%2019.00.41.png?alt=media&amp;token=2cf1424c-97d1-4a70-b25c-045d54927d82" alt=""><figcaption></figcaption></figure></div>

#### Attach Environment into Tests

1. In the Ddosify App, go to the Test Suite and choose the Environment you previously created using the dropdown menu in the top-right corner of the Test Suite.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FShVDt5rrusoREzInsUoN%2Fimage.png?alt=media&amp;token=224b82eb-2fc3-46c1-bdda-f3f77e55493a" alt=""><figcaption></figcaption></figure>
2. Utilize the `{{environmentVariableName}}` format to insert test data into one of the following locations: URL, headers, query parameters, or authentication.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fpfh3IEmAavCTnvsSzRWZ%2Fimage.png?alt=media&amp;token=88c9c41c-d499-4563-9e1e-976de99f623b" alt=""><figcaption></figcaption></figure>


# Correlation

{% embed url="<https://www.youtube.com/watch?v=1knf6Ou_phY>" %}

Correlation allows you to link steps together. For instance, you can design a test scenario to evaluate your authentication process by taking the following steps: First, obtain the authentication token from the response of a login request. Then, insert the extracted token into subsequent requests. This short example demonstrates how correlation works in practice.

#### Capture Value from the Response

1. Click the ***More*** button located to the right of the step and open the "Step Details" section.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FmbSwQfviZSrch1Ui5a5X%2Fimage.png?alt=media&amp;token=c8f52039-4e64-4f43-81eb-ad417fa79dd4" alt=""><figcaption><p>Step Detail Button </p></figcaption></figure>
2. To capture a value from the response of a step, go to the "Capture" tab in the "Step Detail" section and follow these steps:

   * Give a unique name to a variable that you will use to access the captured value in subsequent requests.
   * Select whether to extract the value from the response body or response headers.
   * Choose the appropriate extraction type based on where you extract the value.
   * If you're extracting from the response body, you can use JSON path, XML path, or regular expressions to extract the value.
   * If you're extracting from response headers, you can extract the entire header value or a part of the header value by using regular expressions.

   <div><figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FUAZ9a8YlKo61gVCfLjjm%2Fimage.png?alt=media&amp;token=7754db95-af39-43a8-bfff-e52242586ca7" alt=""><figcaption></figcaption></figure> <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FmpULA3LbbiQzvDgFFN2x%2FScreenshot%202023-04-17%20at%2019.32.08.png?alt=media&amp;token=be4faa8a-d042-4b8e-9357-0442c3ddd39d" alt=""><figcaption></figcaption></figure></div>

#### Use Captured Value in Requests

You can use the format {{captured\_variable\_name}} to insert a value that was previously captured into various parts of subsequent requests. This includes the URL, the request body, query parameters, headers, and authentication information.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FJtho1KjE92O1YdYK0cuk%2Fimage.png?alt=media&amp;token=bc359682-fd42-4073-9e2d-af96e5d3aed3" alt=""><figcaption></figcaption></figure>


# Assertion

{% embed url="<https://youtu.be/lcBZg1DAtvw>" %}
Ddosify Assertion Feature
{% endembed %}

At default, Ddosify marks the step result as successful if it sends the request and receives the response without any network error happening. Status code, body type (or content), or other metrics does not have any effect on success/failure criteria. But this may not be a good test result for your use case and you may want to create your success/fail logic. That's where you can use Assertions.&#x20;

Using the no-code capabilities of the Ddosify Platform, you can easily create assertion logic based on various factors, such as status code, response time, response size, response body, response header, or captured variables. Additionally, you can combine multiple assertions to develop more intricate logic.

#### Create Assertion Logic

1. Click the ***More*** button located to the right of the step and open the "Step Details" section.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FWZPPdOo6CQ5H5IQTsPqo%2Fimage.png?alt=media&amp;token=8c48d1e3-1855-4668-a9c0-04d900726092" alt=""><figcaption></figcaption></figure>
2. To create an Assertion logic based on the response of a step, go to the "Assertions" tab in the "Step Detail".&#x20;

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FAYB3wIB612tBWAYK4fpp%2Fimage.png?alt=media&amp;token=7088c5bc-2450-40d9-b5de-472c89525b4a" alt=""><figcaption></figcaption></figure>
3. You can also join assertions using the 'And' operator. If any assertion does not match the specified value, Ddosify will mark the step as failed.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FCXXcmIyUnPuVW2q2C3U6%2Fimage.png?alt=media&amp;token=8f3f5290-8ff9-429a-b5a6-11ba0cf22265" alt=""><figcaption></figcaption></figure>


# Debugging

{% embed url="<https://www.youtube.com/watch?v=H6uwznnG2ZQ>" %}
Ddosify Debug Feature
{% endembed %}

Before beginning a load test, it is highly recommended to test the scenario. The debug feature of Ddosify runs the scenario only once, displaying both sent and received packet contents. This includes the environment variables, test data, and captured variables used at each step.

{% hint style="info" %}
You will not incur any charges for using Debug requests within the Ddosify Cloud platform.
{% endhint %}

#### Steps to Debug Scenario

1. In the Ddosify App, go to the Test Suite and click the 'Debug' button in the top-right corner of the Test Suite.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FVPRTxUQf90MfizBUoIiP%2Fimage.png?alt=media&amp;token=34ba849f-9e13-4d2a-afa1-fc225c97c05e" alt=""><figcaption></figcaption></figure>
2. Once the debugging process is complete, a pop-up window appears, displaying all the necessary information to assist you in examining your configuration.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FrbNoY1JSduHIOdXUAcbY%2Fimage.png?alt=media&amp;token=9e7ec34d-d21b-449a-ab80-dcf0299dddc7" alt=""><figcaption></figcaption></figure>


# Postman Import

{% embed url="<https://www.youtube.com/watch?v=6ZLP0YLY6Cc>" %}
Ddosify Postman Import Feature
{% endembed %}

Easily import your Postman Collection into the Ddosify App to test your API endpoints, eliminating the need to configure endpoints separately on both platforms. Additionally, you can import Postman Environments for use as Environment Variables within Ddosify.

#### To import Postman Collections, follow these easy steps:

1. Select the 'Import' button located in the top-right corner of the Scenario Step.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FuPz11JBkmjJ1cOkLqPaJ%2FScreenshot%202023-04-17%20at%2015.09.26.png?alt=media&amp;token=58135db8-e530-4a22-8db3-ba883778c92d" alt=""><figcaption><p>Postman Import Button</p></figcaption></figure>
2. You have two options for importing your collection into the Ddosify App: either through an exported API from Postman or by uploading a collection file. To learn more about exporting your Postman Collections, refer to the [Postman Export documentation.](https://learning.postman.com/docs/getting-started/importing-and-exporting-data/#exporting-postman-data)

   <div align="center"><figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fi0Bsr6ryqvZ2pFRzZriO%2FScreenshot%202023-04-17%20at%2016.57.49.png?alt=media&amp;token=4224397c-d264-47a3-b72b-0602aca69c7d" alt=""><figcaption><p>Postman Collection Import Stage</p></figcaption></figure></div>
3. On the left side of the screen, choose the requests you'd like to import into Ddosify. Then, on the right side, arrange the selected requests by dragging and dropping them to create a user flow. Ddosify will import the requests in the order you've configured on the right side.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FgcwCWHJMzBgc0DeioYmM%2FScreenshot%202023-04-17%20at%2017.01.33.png?alt=media&amp;token=1d800f48-c56d-4261-a64b-33e9a7ec1951" alt=""><figcaption></figcaption></figure>
4. When importing a Postman Collection that utilizes environment variables, you can also import these variables into Ddosify. Upon import, Ddosify will save the Postman Environment as a [Ddosify Environment](/ddosify/performance-testing/environment-variables) and associate it with the corresponding test.&#x20;

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FvbcW1ON3kW4bd4Htvpg7%2Fimage.png?alt=media&amp;token=c1f525bc-6b9d-4b9a-bf08-a5cb653575ac" alt=""><figcaption><p>Postman Environment Import on Ddosify Platform</p></figcaption></figure>
5. After clicking the 'Submit' button, Ddosify will generate the specified scenario.

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FkeiULMF621Y67MXsxlkD%2Fimage.png?alt=media&amp;token=10cab753-c085-436a-8b1d-918239ddb2dc" alt=""><figcaption><p>Ddosify Scenairo based on Postman Collection</p></figcaption></figure>


# Dynamic Variables (Parametrization)

Make a load test with dynamic data.

Just like the [Postman](https://learning.postman.com/docs/writing-scripts/script-references/variables-list/), Ddosify supports dynamic variables. Actually, we support all the random methods Postman supports. If you use `{{$randomVariable}}` on Postman you can use it as `{{_randomVariable}}` on Ddosify. Just change `$` to `_` and you will be fine.

For example, to generate fake integers, you can use `{{_randomInt}}` on *URL, header, body or basic authentication.* To simulate a realistic load test on your system, Ddosify sends every request with the new random value that corresponds to the variable you provide.

If you wonder, Ddosify uses [go-faker](https://github.com/ddosify/go-faker) library to generate fake data.

Here is the list of all available dynamic variables.

### Common

<table><thead><tr><th width="214.8412129015572">Variable</th><th width="208.31485408079268">Description</th><th>Examples</th></tr></thead><tbody><tr><td><code>_guid</code></td><td>UUID</td><td><code>5066a748-9a72-404d-94f7-512c0779ff8e</code>, <code>adda49b1-7148-4a89-92de-6c4b756c1226</code></td></tr><tr><td><code>_timestamp</code></td><td>Current timestamp in seconds</td><td><code>1654037772</code>, <code>1654037847</code></td></tr><tr><td><code>_isoTimestamp</code></td><td>Current ISO timestamp in seconds</td><td><code>2022-05-31T22:58:40.653Z</code>, <code>2022-05-31T22:59:06.013Z</code></td></tr><tr><td><code>_randomUUID</code></td><td>UUID</td><td><code>35334fa3-fa83-4589-97e7-7419c9a2173e</code>, <code>6661c4cb-ec3a-464c-9ecc-d9fd051e8def</code></td></tr></tbody></table>

### Text, Numbers and Colors&#x20;

<table><thead><tr><th width="259.3333333333333">Variable</th><th>Description</th><th>Examples</th></tr></thead><tbody><tr><td><code>_randomAlphaNumeric</code></td><td>Alphanumberic character</td><td><code>b</code>, <code>6</code></td></tr><tr><td><code>_randomBoolean</code></td><td>Random boolean value</td><td><code>true</code>, <code>false</code></td></tr><tr><td><code>_randomInt</code></td><td>Random integer btw. 0 and 1000</td><td><code>352</code>, <code>518</code></td></tr><tr><td><code>_randomColor</code></td><td>Random color</td><td><code>silver</code>, <code>yellow</code></td></tr><tr><td><code>_randomHexColor</code></td><td>Random HEX color</td><td><code>#269423</code>, <code>#2859B0</code></td></tr><tr><td><code>_randomAbbreviation</code> </td><td>Rancom abbreviation</td><td><code>THX</code>, <code>XML</code></td></tr></tbody></table>

### Internet and IP Addresses

| Variable            | Description             | Examples                                                                             |
| ------------------- | ----------------------- | ------------------------------------------------------------------------------------ |
| `_randomIP`         | Random IPv4             | `213.102.60.64`, `83.3.166.18`                                                       |
| `_randomIPV6`       | Random IPv6             | `b915:b036:2e09:cb24:5ffc:942c:9592:01f2`, `b915:b036:2e09:cb24:5ffc:942c:9592:01f2` |
| `_randomMACAddress` | Random MAC Address      | `AE:8E:83:84:A8:98`, `CD:1A:D6:66:88:13`                                             |
| `_randomPassword`   | Random password         | `cprvljasdymm}trs`, `yiqot{uw`                                                       |
| `_randomLocale`     | Random locale           | `bo`, `ia`                                                                           |
| `_randomUserAgent`  | Random User Agent       | `Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060820 Firefox/1.5.0.5` |
| `_randomProtocol`   | Random Protocol         | `http`, `https`                                                                      |
| `_randomSemver`     | Random Semantic Version | `4.2.2`, `8.0.4`                                                                     |

### Names

| Variable            | Description        | Examples                        |
| ------------------- | ------------------ | ------------------------------- |
| `_randomFirstName`  | Random first name  | `Dorothy`, `Alek`               |
| `_randomLastName`   | Random last name   | `Corkery`, `Friesen`            |
| `_randomFullName`   | Random full name   | `Patsy Becker`, `Camron Graham` |
| `_randomNamePrefix` | Random name prefix | `Mr.`, `Ms.`                    |
| `_randomNameSuffix` | Random name suffix | `I`, `DVM`                      |

### Profession

| Variable               | Description           | Examples                                                       |
| ---------------------- | --------------------- | -------------------------------------------------------------- |
| `_randomJobArea`       | Random job area       | `Infrastructure`, `Usability`                                  |
| `_randomJobDescriptor` | Random job descriptor | `Regional`, `Global`                                           |
| `_randomJobTitle`      | Random job title      | `Internal Factors Administrator`, `Central Metrics Technician` |
| `_randomJobType`       | Random job type       | `Agent`, `Coordinator`                                         |

### Phone, Address, and Location

| Variable                | Description                        | Examples                                                |
| ----------------------- | ---------------------------------- | ------------------------------------------------------- |
| `_randomPhoneNumber`    | Random phone number                | `601-272-3813`, `208-658-9378`                          |
| `_randomPhoneNumberExt` | Random phone number with extension | `50-859-544-9083`, `86-685-370-3469`                    |
| `_randomCity`           | Random city name                   | `Ethelfurt`, `Bergstromport`                            |
| `_randomStreetName`     | Random street name                 | `Ethel Roads`, `Bergstrom Valley`                       |
| `_randomStreetAddress`  | Random street address              | `88 Cassandra Trail`, `847147 Helmer Corners Suite 777` |
| `_randomCountry`        | Random country                     | `Malta`, `Bermuda`                                      |
| `_randomCountryCode`    | Random 2 letter country code       | `UG`, `IE`                                              |
| `_randomLatitude`       | Random latitude                    | `72.240845`, `13.890682`                                |
| `_randomLongitude`      | Random longitude                   | `68.437796`, `98.146903`                                |

### Images

| Variable                | Description                 | Examples                                                      |
| ----------------------- | --------------------------- | ------------------------------------------------------------- |
| `_randomAvatarImage`    | Random avatar image         | `http://placeimg.com/640/480/people`                          |
| `_randomImageUrl`       | Random image URL            | `http://placeimg.com/640/480`                                 |
| `_randomAbstractImage`  | Random abstract image URL   | `http://placeimg.com/640/480/abstract`                        |
| `_randomAnimalsImage`   | Random animal image URL     | `http://placeimg.com/640/480/animals`                         |
| `_randomBusinessImage`  | Random business image URL   | `http://placeimg.com/640/480/busines`                         |
| `_randomCatsImage`      | Random cat image URL        | `http://placeimg.com/640/480/cats`                            |
| `_randomCityImage`      | Random city image URL       | `http://placeimg.com/640/480/city`                            |
| `_randomFoodImage`      | Random food image URL       | `http://placeimg.com/640/480/food`                            |
| `_randomNightlifeImage` | Random night life image URL | `http://placeimg.com/640/480/nightlife`                       |
| `_randomFashionImage`   | Random fashion image URL    | `http://placeimg.com/640/480/fashion`                         |
| `_randomPeopleImage`    | Random people image URL     | `http://placeimg.com/640/480/people`                          |
| `_randomNatureImage`    | Random nature image URL     | `http://placeimg.com/640/480/nature`                          |
| `_randomSportsImage`    | Random sport image URL      | `http://placeimg.com/640/480/sports`                          |
| `_randomTransportImage` | Random transport image URL  | `http://placeimg.com/640/480/transport`                       |
| `_randomImageDataUri`   | Random image data URI       | `data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22htt...` |

### Finance

| Variable                 | Description                         | Examples                                                             |
| ------------------------ | ----------------------------------- | -------------------------------------------------------------------- |
| `_randomBankAccount`     | Random eight digit bank bumber      | `44014606`, `21604863`                                               |
| `_randomBankAccountName` | Random bank account name            | `Checking`, `Home Loan`                                              |
| `_randomCreditCardMask`  | Random credit card mask number      | `6520`, `5339`                                                       |
| `_randomBankAccountBic`  | Random bank identifier code (swift) | `BKTRTRIS`, `SOGEFRPPRIG`                                            |
| `_randomBankAccountIban` | Random IBAN                         | `HU63755471863115172345115723`, `EE268872311844634138`               |
| `_randomTransactionType` | Random transaction type             | `invoice`, `payment`                                                 |
| `_randomCurrencyCode`    | Random three letter currency code   | `BIF`, `QAR`                                                         |
| `_randomCurrencyName`    | Random currency name                | `Uzbekistan Sum`, `Rupiah`                                           |
| `_randomCurrencySymbol`  | Random currency symbol              | `J$`, `£`                                                            |
| `_randomBitcoin`         | Random bitcoin address              | `XBvHFJHdGdszbgqwDi6yZy7QXgeU`, `XBvHFJHdGdszbgqwDi6yZy7QXgeUSiH5kT` |

### Business

| Variable               | Description                     | Examples                                                         |
| ---------------------- | ------------------------------- | ---------------------------------------------------------------- |
| `_randomCompanyName`   | Random company name             | `Daniel Bruen`, `Michael Cassin`                                 |
| `_randomCompanySuffix` | Random company suffix           | `und Söhne`, `Inc.`                                              |
| `_randomBs`            | Random business speak words     | `synthesize efficient systems`, `matrix virtual functionalities` |
| `_randomBsAdjective`   | Random business speak adjective | `interactive`, `plug-and-play`                                   |
| `_randomBsBuzz`        | Random business speak buzzword  | `harness`, `morph`                                               |
| `_randomBsNoun`        | Random business speak noun      | `paradigms`, `infrastructures`                                   |

### Catchphrases

| Variable                       | Description                    | Examples                                                               |
| ------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |
| `_randomCatchPhrase`           | Random catchpharase            | `Monitored explicit throughput`, `Secured stable budgetary management` |
| `_randomCatchPhraseAdjective`  | Random catchpharase adjective  | `Implemented`, `Secured`                                               |
| `_randomCatchPhraseDescriptor` | Random catchpharase descriptor | `bandwidth-monitored`, `hybrid`                                        |
| `_randomCatchPhraseNoun`       | Random catchpharase noun       | `array`, `installation`                                                |

### Databases

| Variable                   | Description               | Examples                         |
| -------------------------- | ------------------------- | -------------------------------- |
| `_randomDatabaseColumn`    | Random database column    | `updatedAt`, `createdAt`         |
| `_randomDatabaseType`      | Random database type      | `serial`, `datetime`             |
| `_randomDatabaseCollation` | Random database collation | `cp1250_general_ci`, `ascii_bin` |
| `_randomDatabaseEngine`    | Random database engine    | `ARCHIVE`, `BLACKHOLE`           |

### Dates

| Variable            | Description            | Examples                                                       |
| ------------------- | ---------------------- | -------------------------------------------------------------- |
| `_randomDateFuture` | Random future datetime | `Wed Mar 18 09:19:24 UTC 2026`, `Fri Aug 1 09:58:13 UTC 2025`  |
| `_randomDatePast`   | Random past datetime   | `Tue Dec 20 21:06:56 UTC 2016`, `Sun Dec 5 07:14:23 UTC 2021`  |
| `_randomDateRecent` | Random recent datetime | `Thu Apr 14 12:14:25 UTC 2022`, `Thu Apr 14 12:14:33 UTC 2022` |
| `_randomWeekday`    | Random weekday         | `Wednesday`, `Thursday`                                        |
| `_randomMonth`      | Random month           | `March`, `August`                                              |

### Domains, Emails, and Usernames

| Variable              | Description                      | Examples                                                     |
| --------------------- | -------------------------------- | ------------------------------------------------------------ |
| `_randomDomainName`   | Random domain name               | `claudiabeier.com`, `chasescott.ac.uk`                       |
| `_randomDomainSuffix` | Random domain suffix             | `scot`, `info`                                               |
| `_randomDomainWord`   | Random domain word               | `jessecormier`, `victoriafisher`                             |
| `_randomEmail`        | Random email                     | `max.smitham@hotmail.com`, `ivy.wood@outlook.com`            |
| `_randomExampleEmail` | Random email with example domain | `isabella.bauch@example.net`, `tahlia.baumbach@example.org`  |
| `_randomUserName`     | Random username                  | `Hayden.Heaney`, `Lara.Durgan`                               |
| `_randomUrl`          | Random URL                       | `https://sophiemills.scot`, `https://harrisongoldner.ltd.uk` |

### Files and Directories

| Variable                | Description                  | Examples                                                         |
| ----------------------- | ---------------------------- | ---------------------------------------------------------------- |
| `_randomFileName`       | Random file name             | `matthew_moore.gdoc`, `angus_daniel.mov`                         |
| `_randomFileType`       | Random file type             | `video` `application`                                            |
| `_randomFileExt`        | Random file extension        | `xml`, `gif`                                                     |
| `_randomCommonFileName` | Random common file name      | `marcuswaters.csv`, `elizaowen.html`                             |
| `_randomCommonFileType` | Random common file tyoe      | `application`, `image`                                           |
| `_randomCommonFileExt`  | Random common file extension | `m3a`, `gif`                                                     |
| `_randomFilePath`       | Random file path             | `/usr/X11R6/hugoschmidt.mp4`, `/usr/libexec/mitchelloreilly.mp4` |
| `_randomDirectoryPath`  | Random directory path        | `/proc`, `/usr`                                                  |
| `_randomMimeType`       | Random mime type             | `image/gif`, `image/png`                                         |

### Stores

| Variable                  | Description                 | Examples                                              |
| ------------------------- | --------------------------- | ----------------------------------------------------- |
| `_randomPrice`            | Random price (0.00-1000.00) | `445.60`, `802.67`                                    |
| `_randomProduct`          | Random product              | `Hat`, `Shoes`                                        |
| `_randomProductAdjective` | Random product adjective    | `Fantastic`, `Tasty`                                  |
| `_randomProductMaterial`  | Random product material     | `Cotton`, `Steel`                                     |
| `_randomProductName`      | Random product name         | `Gorgeous Frozen Chicken`, `Recycled Bronze Sausages` |
| `_randomDepartment`       | Random stores department    | `Tools`, `Health`                                     |

### Grammar

| Variable           | Description      | Examples                                                             |
| ------------------ | ---------------- | -------------------------------------------------------------------- |
| `_randomNoun`      | Random noun      | `interface`, `port`                                                  |
| `_randomVerb`      | Random verb      | `calculate`, `parse`                                                 |
| `_randomIngverb`   | Random ing verb  | `indexing`, `hacking`                                                |
| `_randomAdjective` | Random adjective | `multi-byte`, `neural`                                               |
| `_randomWord`      | Random word      | `program`, `overriding`                                              |
| `_randomWords`     | Random words     | `virtual navigate 1080p`, `reboot online alarm`                      |
| `_randomPhrase`    | Random phrase    | `nobis iste omnis iusto aut. aliquam illo maxime aperiam nobis. ...` |

### Lorem Ipsum

| Variable                 | Description                   | Examples                                                                  |
| ------------------------ | ----------------------------- | ------------------------------------------------------------------------- |
| `_randomLoremWord`       | Random lorem ipsum word       | `iusto`, `quaerat`                                                        |
| `_randomLoremWords`      | Random lorem ipsum words      | `officiis iusto`, `deleniti molestiae veritatis non`                      |
| `_randomLoremSentence`   | Random lorem ipsum sentence   | `delectus iure qui qui veritatis sit accusantium.`                        |
| `_randomLoremSentences`  | Random lorem ipsum sentences  | `ab perferendis cupiditate atque. saepe sed nulla ut deserunt.`           |
| `_randomLoremParagraph`  | Random lorem ipsum paragraph  | `provident asperiores dolorum. beatae totam ut. ...`                      |
| `_randomLoremParagraphs` | Random lorem ipsum paragraphs | `eum reiciendis modi. ab minus vero. exercitationem nisi. ...`            |
| `_randomLoremText`       | Random lorem ipsum text       | `quia officim laborum. aliquid ullam blanditiis voluptatem ipsam labore.` |
| `_randomLoremSlug`       | Random lorem ipsum slug       | `cupiditate-consectetur-et`, `adipisci-suscipit-qui`                      |
| `_randomLoremLines`      | Random lorem ipsum lines      | `esse soluta voluptatem atque aut ut \n exercitationem optio est`         |


# Integrations

Ddosify sends alerts through three integration options: [Slack](#slack-integration), [Opsgenie](#opsgenie-integration), and [Webhook](#webhook-integration).

### Add Integration

On Ddosify, click the Integrations tab. You can see the list of integrations you have added on this page. To add a new integration, click on the **+ Add Integration** button.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FU6krT78CO9WSn0GgqV0Y%2FCleanShot%202023-11-13%20at%2022.29.26.png?alt=media&amp;token=96085a7a-ccf0-4c19-b343-5a5b6f14257b" alt=""><figcaption><p>Ddosify Integrations</p></figcaption></figure>

#### Slack Integration

Send alerting messages to your Slack channels. Ddosify uses its own Slack application for the integration.&#x20;

{% hint style="info" %}
If you use Ddosify Self-hosted EE, you can make a Slack integration for alerts. Check [docs](/ddosify/self-hosted/self-hosted-slack-integration) for more.
{% endhint %}

1\) Select Slack from the left menu, give it a name and click the Make Integration button.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FKq44jUjPS22bdnKodz8f%2FCleanShot%202023-11-13%20at%2022.31.43.png?alt=media&amp;token=622f200f-38e6-45aa-ab6b-c0f0f81d8bae" alt=""><figcaption><p>Ddosify Slack Integration</p></figcaption></figure>

2\) Ddosify application requests permission to access your Slack workspace to send notifications. Click the Allow button.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FK6pZuwlLITIZplroKApX%2FCleanShot%202023-11-13%20at%2022.32.37.png?alt=media&amp;token=04d38791-6868-457b-9240-17a0b77ec16c" alt=""><figcaption></figcaption></figure>

3\) Select a Slack channel for notifications and click the Save Channel button. You can change the channel later.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FhT4PNaVDvuqHoNgnBKTH%2FCleanShot%202023-11-13%20at%2022.33.56.png?alt=media&amp;token=e2d96bd7-b7dd-4789-bc40-4cf193f0ff96" alt=""><figcaption></figcaption></figure>

4\) You should see the Success message. Click the **Test Integration** button to check everything is working as expected. Ddosify will send a test message to the channel.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FxDCFcJZedsbXZapVOuP3%2FCleanShot%202023-11-13%20at%2022.35.20.png?alt=media&amp;token=43b39dfa-a0fa-4a6d-9d7e-cefc1506e356" alt=""><figcaption></figcaption></figure>

On Slack, you should see the test message.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fa4P2KSYCFixf6WerATx5%2FCleanShot%202023-11-13%20at%2022.36.54.png?alt=media&amp;token=3ba5927a-1692-4f41-8b31-3c2bb0b0925f" alt=""><figcaption></figcaption></figure>

#### Opsgenie Integration

Integrate Opsgenie to manage alert escalations and on-call schedules.&#x20;

1\) Select Opsgenie from the left menu, give it a name, paste your Opsgenie API Key (Check [Opsgenie docs](https://support.atlassian.com/opsgenie/docs/api-key-management/)) and select **Notification Type** (Alert or Incident) and click the **Make Integration** button.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FxkBgcXQxuwXyC2FtpZOG%2FCleanShot%202023-11-13%20at%2022.38.50.png?alt=media&amp;token=88202977-4d1d-468d-963c-675650edbb75" alt=""><figcaption><p>Ddosify Opsgenie Integration</p></figcaption></figure>

2\) Click the **Test Integration** button to check everything is working as expected. You should see a success message if the integration is successful.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FdCJLXUyyuWVoubwWJwSJ%2FCleanShot%202023-11-14%20at%2011.30.09.png?alt=media&amp;token=1efd4918-030c-4547-96dd-4959ea576c7f" alt=""><figcaption></figcaption></figure>

#### Webhook Integration

Send a HTTP POST request when an alert occurs. For testing the webhook integration, you can use [Beeceptor](https://beeceptor.com/), [ngrok](https://ngrok.com/) or similar tools.&#x20;

1\) Select Webhook from the left menu and give it a name, URL, and Headers for Webhook integration. Ddosify sends a HTTP POST request to the URL with the given Headers and Basic Auth.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Ftt650K8wkT5wKd5rG7dg%2FCleanShot%202023-11-13%20at%2022.54.37.png?alt=media&amp;token=2798e338-0855-420d-b833-78a58bbedbda" alt=""><figcaption><p>Ddosify Webhook Integration</p></figcaption></figure>

2\) Click the **Test Integration** button to ensure everything works as expected. You should see a success message if the integration is successful.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FUUkT2FPHagzeceJL7dWy%2FCleanShot%202023-11-14%20at%2011.39.22.png?alt=media&amp;token=717aa9e6-49bf-434a-92be-0a120cdda1a5" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
If you require assistance with Slack, Opsgenie or Webhook integration, you can join our [Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# Deployment

There are various deployment options for:

* 🏠 [Ddosify Self-hosted](#ddosify-self-hosted)
* 🚀 [Ddosify Engine](#ddosify-engine)
* 🐝 [Ddosify eBPF Agent (Alaz)](#ddosify-ebpf-agent-alaz)
* ☁️ [Ddosify Cloud](#ddosify-cloud) <- *If you need a complete SaaS solution*

### 🏠 Ddosify Self-hosted

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FrrVA2frJuGYlCR37Yf2K%2Fddosify_service_map.png?alt=media&amp;token=c61c2978-cc47-421f-8fe8-12190a740763" alt=""><figcaption><p>Ddosify automatically generates a Service Map of your K8s cluster without code instrumentation or sidecars. So you can easily find the bottlenecks in your system. Red lines indicate the high latency between services.</p></figcaption></figure>

If you need a web-based user interface with **Performance Testing**, and **Kubernetes Monitoring** capabilities and want to maintain it on your own, Ddosify Self-hosted is the right choice for you.

Check out the [Ddosify Self-hosted](https://github.com/ddosify/ddosify/tree/master/selfhosted) guide for reference. You can also deploy Ddosify Self-hosted on [AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-mwvnujtgjedjy).

### 🚀 Ddosify Engine

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FVlHcJfArnp96Ok8s4zLP%2Fddosify-quick-start.gif?alt=media&amp;token=ae506830-f725-4f7b-be42-af5ea0b6d262" alt=""><figcaption><p>With Ddosify Engine you can simulate and load test your endpoints on your terminal without writing code.</p></figcaption></figure>

If you need CLI-based load testing tool, [Ddosify Engine](https://github.com/ddosify/ddosify/tree/master/engine_docs) is an open-source and high-performance load testing tool, written in Golang.&#x20;

Check out the [Ddosify Engine Installation](https://github.com/ddosify/ddosify/tree/master/engine_docs#installation) guide for reference.&#x20;

### 🐝 Ddosify eBPF Agent (Alaz)

If you use Kubernetes Monitoring either on Ddosify Cloud or Ddosify Self-hosted, the Ddosify eBPF Agent (Alaz) must be installed as a Daemonset on your Kubernetes cluster. The system resources are limited to 1 CPU core and 1Gi Memory per K8s node, so it it very lightweight.

Check out the [Alaz GitHub](https://github.com/ddosify/alaz) repository for reference.&#x20;

### ☁️ Ddosify Cloud

If you need a complete SaaS solution for Performance Testing **worldwide** and Kubernetes Monitoring and do not want to manage the services, Ddosify Cloud is the right choice.&#x20;

Check out the [Ddosify Cloud](https://app.ddosify.com/) guide for reference.

{% hint style="success" %}
If you require assistance with deploying Ddosify, you can join our [Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# API&#x20;

Ddosify Load Testing API

Although you can use Ddosify Cloud Web UI to create and analyze load tests, we support API integration to let you automate your tasks.

In this documentation, we'll provide detailed descriptions of each API endpoint, along with example requests and responses. We'll also include code samples in several programming languages to help you start quickly.

Additionally, we have a [public Postman collection](https://www.postman.com/ddosify/workspace/ddosify-public/overview) that you can use to quickly and easily test out our API endpoints. The collection includes requests and responses for each API endpoint, so you can see how the API works and test out different parameters and inputs.

* [Load Testing API](/ddosify/api/load-testing-api)

### Get Your API Key

You'll need your secret API Key to successfully send requests to the Ddosify endpoints. To get your API Key, go to your [Account Settings](https://app.ddosify.com/account-settings) page. Then copy your API Key.

{% hint style="warning" %}
&#x20;It is your responsibility to store your API Key safely.
{% endhint %}

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FCsuN99cXgB9ZS6B4p30g%2Fimage.png?alt=media&amp;token=e8cb21a6-1635-47ea-b450-78f52e2ab67e" alt=""><figcaption><p>Ddosify Cloud Account Settings</p></figcaption></figure>


# Load Testing API

Ddosify Load Testing API

You can automate the process of load testing your web applications or APIs, and easily incorporate load testing into your CI/CD pipeline.

Our API provides a wide range of features, including the ability to create load test plans, run load tests, and retrieve detailed reports and metrics on test results. You can also create environment variables and test data (CSV) using this API. The API is designed to be easy to use, with a RESTful architecture and JSON-based responses.

In this section, you will find the APIs for `test` and `plan` endpoints. It's recommended to start the load test with a test plan using [this](#create-a-load-test-with-plan-recommended) endpoint. You can create test plans easily with no-code UI using [Ddosify Cloud](https://app.ddosify.com/load/test-plans). You can select the `Save as Test Plan` in the summary page of the test suite. Once you create the test plan you can get the test plan id from the URL: `https://app.ddosify.com/load/configure-test-plans/<TEST_PLAN_ID>`

* [Create a Load Test (POST)](#create-a-load-test)
* [Create a Load Test with Plan (POST)](#create-a-load-test-with-plan-recommended) <- Recommended
* [List Load Tests (GET)](#get-load-tests)
* [Retrieve the Load Test (GET)](#retrieve-details-of-the-load-test)
* [Result of the Load Test (GET)](#result-of-load-test)
* [Stop the Load Test (GET)](#stop-the-load-test)
* [Get Supported Load Locations (GET)](#get-supported-load-locations)<br>
* [Create Test Plan (POST)](#create-a-load-test-plan)
* [List Test Plans (GET)](#get-load-test-plans)
* [Retrieve the Test Plan (GET)](#retrieve-details-of-the-load-test-plan)
* [Update the Test Plan (PATCH)](#update-the-load-test-plan)
* [Delete the Test Plan (DELETE)](#delete-the-load-test-plan)<br>
* [Create Environment (POST)](#create-environment)
* [List Environments (GET)](#get-environments)
* [Retrieve the Environment (GET)](#retrieve-details-of-the-environment)
* [Update the Environment (PATCH)](#update-the-environment)
* [Delete the Environment (DELETE)](#delete-the-environment)<br>
* [Create Test Data (POST)](#create-test-data)
* [List Test Data (GET)](#get-test-data)
* [Retrieve the Test Data (GET)](#retrieve-details-of-the-test-data)
* [Delete the Test Data (DELETE)](#delete-the-test-data)

You can also find different [examples](/ddosify/api/load-testing-api/load-testing-examples) of this API.&#x20;

{% hint style="warning" %}
All endpoints require the `X-API-KEY` header for authentication. Please check the [Get Your API Key](/ddosify/api#get-your-api-key) section to learn how you can get it.
{% endhint %}

{% hint style="info" %}
For every successful load test, you'll be charged for `request_count` and `duration` in the body `config_data`.
{% endhint %}

{% hint style="info" %}
API concurrency limit is 5 **requests per second** for GET endpoints and 2 **requests per second** for others. You will get `HTTP 429` (Concurrency Limit Exceeded) when you reach the concurrency.
{% endhint %}

### Load Test

## Create a Load Test

<mark style="color:green;">`POST`</mark> `https://api.ddosify.com/v1/load/test/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

#### Request Body

| Name                                           | Type   | Description                                           |
| ---------------------------------------------- | ------ | ----------------------------------------------------- |
| name<mark style="color:red;">\*</mark>         | String | Name of the test                                      |
| config\_data<mark style="color:red;">\*</mark> | JSON   | Configuration of the load test. [More](#config-data). |

{% tabs %}
{% tab title="201: Created Test Created" %}

```json
{
    "id": "fda3642b-df27-409d-b24d-63f861840ac5",
    "test_url": "https://app.ddosify.com/load/report/fda3642b-df27-409d-b24d-63f861840ac5",
    "status": "initial",
    "failure_reason": null
}
```

{% endtab %}

{% tab title="400: Bad Request Invalid Request Parameters" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Create a Load Test with Plan (Recommended)

<mark style="color:green;">`POST`</mark> `https://api.ddosify.com/v1/load/test/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

#### Request Body

| Name                                                       | Type   | Description                                                                                        |
| ---------------------------------------------------------- | ------ | -------------------------------------------------------------------------------------------------- |
| name<mark style="color:red;">\*</mark>                     | String | Name of the test                                                                                   |
| test\_plan\_template\_id<mark style="color:red;">\*</mark> | UUID   | Test Plan ID. Create test plan with [this](#create-a-load-test-plan) endpoint.                     |
| environment\_id                                            | UUID   | Environment ID to override the test. Get the environments from [this](#get-environments) endpoint. |

{% tabs %}
{% tab title="201: Created Test Created" %}

```javascript
{
    "id": "fda3642b-df27-409d-b24d-63f861840ac5",
    "test_url": "https://app.ddosify.com/load/report/fda3642b-df27-409d-b24d-63f861840ac5",
    "status": "initial",
    "failure_reason": null
}
```

{% endtab %}

{% tab title="400: Bad Request Invalid Request Parameters" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Get Load Tests

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/load/test/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK List of load tests" %}

```json
[
    {
        "id": "0b04ac74-b389-4749-9fa8-7484900d8319",
        "environment_id": null,
        "test_plan_template_id": null,
        "name": "Test 14",
        "testdata_ids": null,
        "date_created": "2023-03-04T00:25:50.225449Z",
        "status": "done",
        "failure_reason": null
    },
    {
        "id": "83cef293-3929-4137-a107-8890d96c43b1",
        "environment_id": null,
        "test_plan_template_id": null,
        "name": "Admin Test 10",
        "testdata_ids": null,
        "date_created": "2023-02-24T09:56:01.765072Z",
        "status": "done",
        "failure_reason": null
    },
    {
        "id": "82d8b25f-6e78-4281-b7db-b7235c0a9a2d",
        "environment_id": null,
        "test_plan_template_id": null,
        "name": "Admin Test 10",
        "testdata_ids": null,
        "date_created": "2023-02-23T11:54:50.012640Z",
        "status": "done",
        "failure_reason": null
    }
]
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Retrieve details of the Load Test

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/load/test/<TEST_ID>/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK Details of load test" %}

```json
{
    "id": "5308bc3c-7bc3-4a25-95d8-abdb57042098",
    "environment_id": null,
    "test_plan_template_id": null,
    "name": "Test 14",
    "config_data": {
        "steps": [
            {
                "id": 1,
                "url": "https://servdown.com",
                "name": "Home Page",
                "method": "GET",
                "others": {
                    "h2": false,
                    "keep-alive": false,
                    "disable-redirect": false,
                    "disable-compression": false
                },
                "headers": {
                    "Host": "asgfasfgas"
                },
                "payload": "{\"id\": 5}",
                "timeout": 15
            }
        ],
        "duration": 20,
        "load_type": "linear",
        "proxy_config": {
            "DE": 50,
            "US": 50
        },
        "request_count": 100
    },
    "testdata_ids": null,
    "date_created": "2023-03-02T18:01:45.819888Z",
    "status": "done",
    "failure_reason": null
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Result of Load Test

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/load/test/<TEST_ID>/result/`

This endpoint waits until the test is finished. [More](#test-result).

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK Result of load test." %}

```json
{
    "test_url": "https://app.ddosify.com/load/report/9272cecd-b844-43bc-9702-469895f20d90",
    "results": {
        "steps": [
            {
                "id": 1,
                "error_dist": {},
                "fail_count": 0,
                "location_dist": {
                    "DE": {
                        "error_dist": {},
                        "fail_count": 0,
                        "location_dist": {},
                        "success_count": 500,
                        "response_times": {
                            "avg": 26,
                            "max": 63,
                            "min": 19,
                            "p80": 29,
                            "p90": 33,
                            "p95": 37,
                            "p99": 56,
                            "median": 24,
                            "stddev": 6
                        },
                        "iteration_count": 500,
                        "status_code_dist": {
                            "405": 500
                        }
                    },
                    "US": {
                        "error_dist": {},
                        "fail_count": 0,
                        "location_dist": {},
                        "success_count": 500,
                        "response_times": {
                            "avg": 172,
                            "max": 201,
                            "min": 162,
                            "p80": 175,
                            "p90": 178,
                            "p95": 181,
                            "p99": 193,
                            "median": 171,
                            "stddev": 5
                        },
                        "iteration_count": 500,
                        "status_code_dist": {
                            "405": 500
                        }
                    }
                },
                "success_count": 1000,
                "response_times": {
                    "avg": 99,
                    "max": 201,
                    "min": 19,
                    "p80": 172,
                    "p90": 175,
                    "p95": 178,
                    "p99": 189,
                    "median": 113,
                    "stddev": 73
                },
                "iteration_count": 1000,
                "status_code_dist": {
                    "405": 1000
                }
            },
            {
                "id": 2,
                "error_dist": {},
                "fail_count": 0,
                "location_dist": {
                    "DE": {
                        "error_dist": {},
                        "fail_count": 0,
                        "location_dist": {},
                        "success_count": 500,
                        "response_times": {
                            "avg": 48,
                            "max": 242,
                            "min": 35,
                            "p80": 51,
                            "p90": 57,
                            "p95": 70,
                            "p99": 131,
                            "median": 44,
                            "stddev": 17
                        },
                        "iteration_count": 500,
                        "status_code_dist": {
                            "200": 500
                        }
                    },
                    "US": {
                        "error_dist": {},
                        "fail_count": 0,
                        "location_dist": {},
                        "success_count": 500,
                        "response_times": {
                            "avg": 323,
                            "max": 807,
                            "min": 296,
                            "p80": 317,
                            "p90": 332,
                            "p95": 383,
                            "p99": 684,
                            "median": 307,
                            "stddev": 64
                        },
                        "iteration_count": 500,
                        "status_code_dist": {
                            "200": 500
                        }
                    }
                },
                "success_count": 1000,
                "response_times": {
                    "avg": 186,
                    "max": 807,
                    "min": 35,
                    "p80": 309,
                    "p90": 317,
                    "p95": 332,
                    "p99": 678,
                    "median": 269,
                    "stddev": 145
                },
                "iteration_count": 1000,
                "status_code_dist": {
                    "200": 1000
                }
            }
        ],
        "fail_count": 0,
        "location_dist": {
            "DE": {
                "fail_count": 0,
                "success_count": 500,
                "response_times": {
                    "avg": 37,
                    "max": 242,
                    "min": 19,
                    "p80": 46,
                    "p90": 52,
                    "p95": 59,
                    "p99": 96,
                    "median": 37,
                    "stddev": 17
                },
                "iteration_count": 500
            },
            "US": {
                "fail_count": 0,
                "success_count": 500,
                "response_times": {
                    "avg": 247,
                    "max": 807,
                    "min": 162,
                    "p80": 309,
                    "p90": 317,
                    "p95": 332,
                    "p99": 678,
                    "median": 249,
                    "stddev": 88
                },
                "iteration_count": 500
            }
        },
        "success_count": 1000,
        "response_times": {
            "avg": 142,
            "max": 807,
            "min": 19,
            "p80": 303,
            "p90": 309,
            "p95": 317,
            "p99": 400,
            "median": 163,
            "stddev": 122
        },
        "iteration_count": 1000
    }
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Stop the Load Test

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/load/test/<TEST_ID>/stop/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK Load test is stopped" %}

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

{% endtab %}
{% endtabs %}

## Get Supported Load Locations

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/load/locations/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK List of supported load locations" %}

```json
{
    "countries": [
        "AU",
        "BE",
        "CA",
        "CH",
        "CN",
        "DE",
        "ES",
        "FI",
        "FR",
        "GB",
        "HK",
        "HR",
        "HU",
        "IL",
        "IT",
        "JP",
        "NL",
        "NO",
        "PL",
        "RO",
        "RS",
        "SE",
        "TR",
        "UA",
        "US"
    ]
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

{% endtab %}
{% endtabs %}

#### Config Data

Config data contains the configuration of the load test to [start a load test](#start-a-load-test) and [create load test plan](#create-a-load-test-plan) endpoints. Here is an example:&#x20;

```json
{
    "steps": [
        {
            "id": 1,
            "url": "https://servdown.com",
            "name": "Home Page",
            "method": "POST",
            "others": {
                "h2": false,
                "disable-redirect": false,
                "disable-compression": false
            },
            "headers": {
                "Test-Header": "Test Value",
                "Test-Header2": "Test Value2"
            },
            "payload": "{\"id\": 24}",
            "timeout": 15
        },
        {
            "id": 2,
            "url": "https://app.servdown.com",
            "name": "Servdown App",
            "method": "GET",
            "others": {
                "h2": false,
                "disable-redirect": false,
                "disable-compression": false
            },
            "timeout": 15
        }
    ],
    "proxy_config": {
        "US": 50,
        "DE": 50
    },
    "iteration_count": 1000,
    "load_type": "linear",
    "duration": 20
}
```

This load-testing configuration includes `two` steps, each of which represents a specific action to be executed by the load-testing tool.

The first step represents a `POST` request to the "[https://servdown.com](https://servdown.com/)" URL with a payload of `{"id": 24}`. The headers of the request include `Test-Header` with a value of `Test Value` and `Test-Header2` with a value of `Test Value2`. The timeout for this step is set to `15` seconds.

The second step represents a `GET` request to the "[https://app.servdown.com](https://app.servdown.com/)" URL. The timeout for this step is also set to `15` seconds.

The `proxy_config` field indicates that the load testing tool will use a mix of `US (United States)` and `DE (Germany)` servers, with a `50/50` distribution. You can get the full list of the supported locations by using [this](#get-supported-load-locations) endpoint.

The `iteration_count` field indicates that the load testing tool will execute each step `1000` times. There will be a total of `1000*2=2000` requests.

The `load_type` field specifies a `linear` load pattern, which means that the load will be the same over time.

The `duration` field indicates that the load testing will last for `20` seconds.

| Key            | Supported                                                                                                                      | Description                                                                                    |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------- |
| `proxy_config` | `"AU","BE","CA","CH","CN","DE","ES","FI","FR","GB","HK","HR","HU","IL","IT","JP","NL","NO","PL","RO","RS","SE","TR","UA","US"` | Supported locations. You can get the list with [this](#get-supported-load-locations) endpoint. |
| `load_type`    | `"linear", "waved", "incremental"`                                                                                             | Type of the load. [More](https://github.com/ddosify/ddosify#load-types).                       |

### Load Test Plan

## Create a Load Test Plan

<mark style="color:green;">`POST`</mark> `https://api.ddosify.com/v1/load/plan/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

#### Request Body

| Name                                           | Type   | Description                                           |
| ---------------------------------------------- | ------ | ----------------------------------------------------- |
| name<mark style="color:red;">\*</mark>         | String | Test plan name. It's unique.                          |
| config\_data<mark style="color:red;">\*</mark> | JSON   | Configuration of the load test. [More](#config-data). |

{% tabs %}
{% tab title="201: Created Test Plan Created" %}

```json
{
    "id": "49350aff-1b77-493f-bb20-9742ed345a0c"
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}

{% tab title="400: Bad Request Invalid Request Parameters" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}
{% endtabs %}

## Get Load Test Plans

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/load/plan/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK List of load test plans" %}

```json
[
    {
        "id": "6c140d00-c01f-4d60-935a-6d4424f49497",
        "test_count": 1,
        "environment_id": null,
        "name": "Fatih Test TestPlan Template 392124212242",
        "testdata_ids": null,
        "date_created": "2023-02-23T10:33:20.848546Z"
    },
    {
        "id": "d5c3b48c-cea1-4949-aae0-caa73bea6242",
        "environment_name": "Test Environment Name 6",
        "test_count": 2,
        "environment_id": "0fe50223-32a5-4cf6-9079-58e02d256331",
        "name": "Fatih Test TestPlan Template 434",
        "testdata_ids": [
            "7feefbce-8189-42f5-9c93-edfe58023b46"
        ],
        "date_created": "2023-02-18T22:06:04.647822Z"
    },
    {
        "id": "3010a2ed-3b01-41cb-a2f0-78b32ddda6c8",
        "test_count": 0,
        "environment_id": null,
        "name": "Fatih Test TestPlan New Name",
        "testdata_ids": null,
        "date_created": "2023-02-14T12:46:14.250734Z"
    }
]
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Retrieve details of the Load Test Plan

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/load/plan/<PLAN_ID>/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK Load test plan" %}

```json
{
    "id": "6d0a3cd4-a625-407c-9dc7-c7702b670550",
    "environment_id": null,
    "name": "Test TestPlan Template 1241241",
    "config_data": {
        "steps": [
            {
                "id": 1,
                "url": "https://app.servdown.com/accounts/login/?next=/",
                "method": "GET",
                "headers": {
                    "ContenType": "application/xml",
                    "X-ddosify-key": "ajkndalnasd"
                },
                "payload": "",
                "timeout": 5
            }
        ],
        "duration": 10,
        "load_type": "linear",
        "proxy_config": {
            "DE": 30,
            "GB": 20,
            "US": 50
        },
        "request_count": 100
    },
    "testdata_ids": null,
    "date_created": "2023-02-28T15:36:36.510444Z"
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Update the Load Test Plan

<mark style="color:purple;">`PATCH`</mark> `https://api.ddosify.com/v1/load/plan/<PLAN_ID>/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

#### Request Body

| Name         | Type   | Description                                           |
| ------------ | ------ | ----------------------------------------------------- |
| name         | String | Test plan name                                        |
| config\_data | JSON   | Configuration of the load test. [More](#config-data). |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "id": "49350aff-1b77-493f-bb20-9742ed345a0c",
    "environment_id": null,
    "name": "TestPlan New Name",
    "config_data": {
        "steps": [
            {
                "id": 1,
                "url": "https://app.servdown.com/accounts/login/?next=/",
                "method": "GET",
                "headers": {
                    "ContenType": "application/xml",
                    "X-ddosify-key": "ajkndalnasd"
                },
                "payload": "",
                "timeout": 5
            }
        ],
        "duration": 10,
        "load_type": "linear",
        "proxy_config": {
            "DE": 30,
            "GB": 20,
            "US": 50
        },
        "request_count": 100
    },
    "testdata_ids": null
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Delete the Load Test Plan

<mark style="color:red;">`DELETE`</mark> `https://api.ddosify.com/v1/load/plan/<PLAN_ID>/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="204: No Content " %}

```javascript
{
    // Response
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

### Environment

## Create Environment

<mark style="color:green;">`POST`</mark> `https://api.ddosify.com/v1/environment/`

[Example](/ddosify/api/load-testing-api/load-testing-examples#create-environment).

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

#### Request Body

| Name                                   | Type   | Description                    |
| -------------------------------------- | ------ | ------------------------------ |
| name<mark style="color:red;">\*</mark> | String | Environment name. It's unique. |
| vars<mark style="color:red;">\*</mark> | JSON   | Variables. [More](#vars).      |

{% tabs %}
{% tab title="201: Created Environment Created" %}

```json
{
    "id": "e5cf444d-9d76-4ba6-843c-b20d2bcf3302"
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}

{% tab title="400: Bad Request Invalid Request Parameters" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}
{% endtabs %}

## Get Environments

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/environment/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK List of environments" %}

````javascript
```json
[
    {
        "id": "e5cf444d-9d76-4ba6-843c-b20d2bcf3302",
        "name": "Test Environment Name 5",
        "vars": [
            {
                "key": "test_key_1_bool",
                "value": false
            },
            {
                "key": "test_key_2_string",
                "value": "test_value_2"
            },
            {
                "key": "test_key_2_number_int",
                "value": 15
            },
            {
                "key": "test_key_2_number_float",
                "value": 15.2
            },
            {
                "key": "test_key_2_number_list",
                "value": [
                    14,
                    12,
                    15
                ]
            }
        ],
        "date_created": "2023-03-05T20:59:13.440806Z"
    },
    {
        "id": "8ad0f224-c338-4722-9c6d-ef14abcf8449",
        "name": "Test Environment Name 3",
        "vars": [
            {
                "key": "test_key_1",
                "value": false
            },
            {
                "key": "test_key_2",
                "value": "test_value_2"
            }
        ],
        "date_created": "2023-03-05T19:29:20.582063Z"
    }
]
````

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Retrieve details of the Environment

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/environment/<ENVIRONMENT_ID>/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK Environment" %}

```json
{
    "id": "e5cf444d-9d76-4ba6-843c-b20d2bcf3302",
    "name": "Test Environment Name 5",
    "vars": [
        {
            "key": "test_key_1_bool",
            "value": false
        },
        {
            "key": "test_key_2_string",
            "value": "test_value_2"
        },
        {
            "key": "test_key_2_number_int",
            "value": 15
        },
        {
            "key": "test_key_2_number_float",
            "value": 15.2
        },
        {
            "key": "test_key_2_number_list",
            "value": [
                14,
                12,
                15
            ]
        }
    ],
    "date_created": "2023-03-05T20:59:13.440806Z"
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Update the Environment

<mark style="color:purple;">`PATCH`</mark> `https://api.ddosify.com/v1/environment/<ENVIRONMENT_ID>/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

#### Request Body

| Name | Type   | Description                    |
| ---- | ------ | ------------------------------ |
| name | String | Environment name. It's unique. |
| vars | JSON   | Variables. [More](#vars).      |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "id": "e5cf444d-9d76-4ba6-843c-b20d2bcf3302",
    "name": "Test Environment Name 12421",
    "vars": [
        {
            "key": "test_key_3",
            "value": 1234
        },
        {
            "key": "test_key_2",
            "value": "test_value_2"
        }
    ]
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

```javascript
```

{% endtab %}
{% endtabs %}

## Delete the Environment

<mark style="color:red;">`DELETE`</mark> `https://api.ddosify.com/v1/environment/<ENVIRONMENT_ID>/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="204: No Content " %}

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```json
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

{% endtab %}
{% endtabs %}

#### vars

`vars` represents the environment variables for [Create Environment](#create-environment) endpoint.

Each key-value pair consists of a `key` and a `value`. The `key` represents the name of the environment variable to be set, and the `value` represents the value to be assigned to that variable.

The types of values can be `bool`, `number`, `string` and `array`. Here is an example of vars:

```json
[
    {"key": "test_key_bool", "value": false},
    {"key": "test_key_string", "value": "test_value_2"},
    {"key": "test_key_number_int", "value": 15},
    {"key": "test_key_number_float", "value": 15.2},
    {"key": "test_key_array", "value": [14, 12, 15]}
]
```

In this specific example, there are five environment variables:

* `test_key_bool` with a type of bool and value of `false`
* `test_key_string` with a type of string and value of `test_value_2`
* `test_key_number_int` with a type of number and value of `15`
* `test_key_number_float` with a type of number and value of `15.2`
* `test_key_array` with a type of `array` and value of `[14, 12, 15]`

### Test Data (CSV)

## Create Test Data

<mark style="color:green;">`POST`</mark> `https://api.ddosify.com/v1/testdata/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

#### Request Body

| Name                                           | Type   | Description                        |
| ---------------------------------------------- | ------ | ---------------------------------- |
| name<mark style="color:red;">\*</mark>         | String | Test Data name. It's unique.       |
| file<mark style="color:red;">\*</mark>         | File   | CSV File                           |
| type                                           | String | Default is `csv`.                  |
| file\_config<mark style="color:red;">\*</mark> | JSON   | File config. [More](#file_config). |

{% tabs %}
{% tab title="201: Created Test Data Created" %}

```json
{
    "id": "6c50cc89-8c1f-46f1-af9d-d61fdfc4c2f4",
    "name": "name_of_file",
    "file": "https://URL/media/testdata/38f79dbc-742f-4c73-9451-d30b54f412d2/6c50cc89-8c1f-46f1-af9d-d61fdfc4c2f4/original/medals.csv",
    "type": "csv",
    "file_config": {
        "delimiter": ";",
        "vars": {
            "0": {
                "tag": "year",
                "type": "int"
            },
            "1": {
                "tag": "city"
            },
            "2": {
                "tag": "sport"
            },
            "5": {
                "tag": "event",
                "type": "json"
            },
            "7": {
                "tag": "medal"
            },
            "8": {
                "tag": "no"
            }
        },
        "allow_quota": true,
        "order": "random",
        "skip_first_line": true,
        "skip_empty_line": true
    },
    "no_of_records": 2311,
    "size": 147343,
    "date_created": "2023-01-25T09:47:42.592256Z"
}
```

{% endtab %}

{% tab title="400: Bad Request Invalid Request Parameters" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```javascript
{
    "msg": "Detail..."
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

{% endtab %}
{% endtabs %}

## Get Test Data

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/testdata/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK List of Test Data" %}

```json
[
    {
        "id": "0696f680-96db-4b1a-b435-28238c2d7ecd",
        "name": "transactions2",
        "file": "https://URL/media/staging/testdata/d8beff19-9310-426b-9e21-a610ae956884/0696f680-96db-4b1a-b435-28238c2d7ecd/original/transactions.csv",
        "type": "csv",
        "file_config": {
            "vars": {
                "0": {
                    "tag": "api_key",
                    "type": "string"
                },
                "1": {
                    "tag": "amount",
                    "type": "string"
                },
                "2": {
                    "tag": "from",
                    "type": "string"
                },
                "3": {
                    "tag": "to",
                    "type": "string"
                }
            },
            "order": "random",
            "delimiter": ",",
            "allow_quota": false,
            "skip_empty_line": true,
            "skip_first_line": true
        },
        "no_of_records": 1000,
        "size": 52772,
        "date_created": "2023-02-20T18:59:54.037321Z"
    },
    {
        "id": "f6903569-1a14-4f86-b5c8-5b2e034d739c",
        "name": "test_data",
        "file": "https://URL/media/staging/testdata/d8beff19-9310-426b-9e21-a610ae956884/f6903569-1a14-4f86-b5c8-5b2e034d739c/original/test_data.csv",
        "type": "csv",
        "file_config": {
            "vars": {
                "0": {
                    "tag": "Username",
                    "type": "string"
                },
                "1": {
                    "tag": "City",
                    "type": "string"
                },
                "2": {
                    "tag": "Team",
                    "type": "string"
                },
                "3": {
                    "tag": "Payload",
                    "type": "json"
                },
                "4": {
                    "tag": "Age",
                    "type": "int"
                }
            },
            "order": "random",
            "delimiter": ",",
            "allow_quota": false,
            "skip_empty_line": true,
            "skip_first_line": true
        },
        "no_of_records": 99,
        "size": 1177,
        "date_created": "2023-02-20T18:59:14.151061Z"
    }
]
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```javascript
{
    // Response
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

{% endtab %}
{% endtabs %}

## Retrieve details of the Test Data

<mark style="color:blue;">`GET`</mark> `https://api.ddosify.com/v1/testdata/<TEST_DATA_ID>/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="200: OK Test Data" %}

```json
{
    "id": "3a6bf234-38c5-4858-87e3-b3fdfb4ffcd2",
    "name": "test_data_success",
    "file": "https://URL/media/staging/testdata/d8beff19-9310-426b-9e21-a610ae956884/3a6bf234-38c5-4858-87e3-b3fdfb4ffcd2/original/test_data.csv",
    "type": "csv",
    "file_config": {
        "vars": {
            "0": {
                "tag": "Username",
                "type": "string"
            },
            "1": {
                "tag": "City",
                "type": "string"
            },
            "2": {
                "tag": "Team",
                "type": "string"
            },
            "3": {
                "tag": "Payload",
                "type": "json"
            },
            "4": {
                "tag": "Age",
                "type": "int"
            }
        },
        "order": "random",
        "delimiter": ",",
        "allow_quota": true,
        "skip_empty_line": true,
        "skip_first_line": true
    },
    "no_of_records": 99,
    "size": 1177,
    "date_created": "2023-02-20T20:48:45.864423Z"
}
```

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```javascript
{
    // Response
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

{% endtab %}
{% endtabs %}

## Delete the Test Data

<mark style="color:red;">`DELETE`</mark> `https://api.ddosify.com/v1/testdata/<TEST_DATA_ID>/`

#### Headers

| Name                                        | Type | Description  |
| ------------------------------------------- | ---- | ------------ |
| X-API-KEY<mark style="color:red;">\*</mark> | UUID | Your API KEY |

{% tabs %}
{% tab title="204: No Content " %}

{% endtab %}

{% tab title="403: Forbidden API key is not found or not valid" %}

```javascript
{
    // Response
}
```

{% endtab %}

{% tab title="429: Too Many Requests Concurrency Limit Exceeded" %}

{% endtab %}
{% endtabs %}

#### file\_config

Here is an example of **file\_config** for [Create Test Data endpoint](#create-test-data):&#x20;

```json
{
    "delimiter": ";",
    "vars": {
        "0": {
            "tag": "year"
        },
        "1": {
            "tag": "city"
        },
        "2": {
            "tag": "sport"
        },
        "5": {
            "tag": "event"
        },
        "7": {
            "tag": "medal"
        },
        "8": {
            "tag": "no"
        }
    },
    "allow_quota": true,
    "order": "random",
    "skip_first_line": true,
    "skip_empty_line": true
}
```

This configuration defines the settings for parsing a CSV file. Here's a breakdown of each of the options specified:

* `delimiter`: The delimiter is used to separate fields in the CSV file. In this case, the delimiter is `;`
* `vars`: A mapping of column numbers to variable names. Each key represents the column number (starting from 0), and the value is an object that specifies the variable name (tag). For example, the column at index 0 (the first column) will be mapped to the variable `year`, the column at index 1 will be mapped to the variable `city`, and so on.
* `allow_quota`: A boolean value that specifies whether or not the CSV file allows the use of quotes to enclose fields. In this case, it is set to true, indicating that quotes are allowed.
* `order`: Specifies the order in which the rows in the CSV file should be parsed. In this case, it is set to `random`, indicating that the rows should be parsed in random order. **Options**: `random`, `sequential`
* `skip_first_line`: A boolean value that specifies whether or not the first line of the CSV file should be skipped during parsing. In this case, it is set to true, indicating that the first line should be skipped.
* `skip_empty_line`: A boolean value that specifies whether or not empty lines should be skipped during parsing. In this case, it is set to true, indicating that empty lines should be skipped.


# Load Testing Examples

Ddosify Load Testing API Examples

Here are the examples of the Load Testing API with cURL and Python.&#x20;

{% hint style="info" %}
Change `<API_KEY>` with your API key. [More](/ddosify/api#get-your-api-key).
{% endhint %}

### Start a Load Test

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location 'https://api.ddosify.com/v1/load/test/' \
--header 'X-API-KEY: <API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
    "name": "Test 14",
    "config_data": {
        "steps": [
            {
                "id": 1,
                "url": "https://servdown.com",
                "name": "Home Page",
                "method": "POST",
                "others": {
                    "h2": false,
                    "disable-redirect": false,
                    "disable-compression": false
                },
                "headers": {
                    "Test-Header":"Test Value",
                    "Test-Header2":"Test Value2"
                    },
                "payload": "{\"id\": 24}",
                "timeout": 15
            },
            {
                "id": 2,
                "url": "https://app.servdown.com",
                "name": "Servdown App",
                "method": "GET",
                "others": {
                    "h2": false,
                    "disable-redirect": false,
                    "disable-compression": false
                },
                "timeout": 15
            }
        ],
        "proxy_config": {
            "US": 50,
            "DE": 50
        },
        "iteration_count": 1000,
        "load_type": "linear",
        "duration": 20
    }
}'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import json

url = "https://api.ddosify.com/v1/load/test/"

payload = json.dumps({
  "name": "Test 14",
  "config_data": {
    "steps": [
      {
        "id": 1,
        "url": "https://servdown.com",
        "name": "Home Page",
        "method": "POST",
        "others": {
          "h2": False,
          "disable-redirect": False,
          "disable-compression": False
        },
        "headers": {
          "Test-Header": "Test Value",
          "Test-Header2": "Test Value2"
        },
        "payload": "{\"id\": 24}",
        "timeout": 15
      },
      {
        "id": 2,
        "url": "https://app.servdown.com",
        "name": "Servdown App",
        "method": "GET",
        "others": {
          "h2": False,
          "disable-redirect": False,
          "disable-compression": False
        },
        "timeout": 15
      }
    ],
    "proxy_config": {
      "US": 50,
      "DE": 50
    },
    "iteration_count": 1000,
    "load_type": "linear",
    "duration": 20
  }
})
headers = {
  'X-API-KEY': '<API_KEY>',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

{% endtab %}
{% endtabs %}

### Retrieve the details of the Load Test Plan

{% tabs %}
{% tab title="cURL" %}

```bash
PLAN_ID=6d0a3cd4-a625-407c-9dc7-c7702b670550
curl --location 'https://api.ddosify.com/v1/load/plan/$PLAN_ID/' \
--header 'X-API-KEY: <API_KEY>'
```

{% endtab %}

{% tab title="Python" %}

```bash
import requests

plan_id="6d0a3cd4-a625-407c-9dc7-c7702b670550"
url = f"https://api.ddosify.com/v1/load/plan/{plan_id}/"

payload={}
headers = {
  'X-API-KEY': '<API_KEY>'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
```

{% endtab %}
{% endtabs %}

### Create Environment

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location 'https://api.ddosify.com/v1/environment/' \
--header 'X-API-KEY: <API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
    "name": "Test Environment Name 6",
    "vars": [
        {"key": "test_key_bool", "value": false},
        {"key": "test_key_string", "value": "test_value_2"},
        {"key": "test_key_number_int", "value": 15},
        {"key": "test_key_number_float", "value": 15.2},
        {"key": "test_key_array", "value": [14, 12, 15]}
    ] 
}'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import json

url = "https://api.ddosify.com/v1/environment/"

payload = json.dumps({
  "name": "Test Environment Name 6",
  "vars": [
    {
      "key": "test_key_bool",
      "value": False
    },
    {
      "key": "test_key_string",
      "value": "test_value_2"
    },
    {
      "key": "test_key_number_int",
      "value": 15
    },
    {
      "key": "test_key_number_float",
      "value": 15.2
    },
    {
      "key": "test_key_array",
      "value": [
        14,
        12,
        15
      ]
    }
  ]
})
headers = {
  'X-API-KEY': '<API_KEY>',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

{% endtab %}
{% endtabs %}

### Create Test Data

{% tabs %}
{% tab title="cURL" %}

```bash
curl --location 'https://api.ddosify.com/v1/testdata/' \
--header 'X-API-KEY: <API_KEY>' \
--form 'name="medals222"' \
--form 'file=@"/Users/test/medals.csv"' \
--form 'type="csv"' \
--form 'file_config="{
    \"delimiter\": \";\",
    \"vars\": {
        \"0\": {
            \"tag\": \"year\"
        },
        \"1\": {
            \"tag\": \"city\"
        },
        \"2\": {
            \"tag\": \"sport\"
        },
        \"5\": {
            \"tag\": \"event\"
        },
        \"7\": {
            \"tag\": \"medal\"
        },
        \"8\": {
            \"tag\": \"no\"
        }
    },
    \"allow_quota\": true,
    \"order\": \"random\",
    \"skip_first_line\": true,
    \"skip_empty_line\": true
}"'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://api.ddosify.com/v1/testdata/"

payload={'name': 'medals222',
'type': 'csv',
'file_config': '{
    "delimiter": ";",
    "vars": {
        "0": {
            "tag": "year"
        },
        "1": {
            "tag": "city"
        },
        "2": {
            "tag": "sport"
        },
        "5": {
            "tag": "event"
        },
        "7": {
            "tag": "medal"
        },
        "8": {
            "tag": "no"
        }
    },
    "allow_quota": true,
    "order": "random",
    "skip_first_line": true,
    "skip_empty_line": true
}'}
files=[
  ('file',('medals.csv',open('/Users/test/medals.csv','rb'),'text/csv'))
]
headers = {
  'X-API-KEY': '<API_KEY>'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)

```

{% endtab %}
{% endtabs %}

### Test Result

Here is an example of a load testing result from [test result](#result-of-load-test) endpoint:

<pre class="language-json" data-overflow="wrap"><code class="lang-json">{
    "test_url": "https://app.ddosify.com/load/report/9272cecd-b844-43bc-9702-469895f20d90",
<strong>    "results": {
</strong>        "steps": [
            {
                "id": 1,
                "error_dist": {},
                "fail_count": 0,
                "location_dist": {
                    "DE": {
                        "error_dist": {},
                        "fail_count": 0,
                        "location_dist": {},
                        "success_count": 500,
                        "response_times": {
                            "avg": 26,
                            "max": 63,
                            "min": 19,
                            "p80": 29,
                            "p90": 33,
                            "p95": 37,
                            "p99": 56,
                            "median": 24,
                            "stddev": 6
                        },
                        "iteration_count": 500,
                        "status_code_dist": {
                            "405": 500
                        }
                    },
                    "US": {
                        "error_dist": {},
                        "fail_count": 0,
                        "location_dist": {},
                        "success_count": 500,
                        "response_times": {
                            "avg": 172,
                            "max": 201,
                            "min": 162,
                            "p80": 175,
                            "p90": 178,
                            "p95": 181,
                            "p99": 193,
                            "median": 171,
                            "stddev": 5
                        },
                        "iteration_count": 500,
                        "status_code_dist": {
                            "405": 500
                        }
                    }
                },
                "success_count": 1000,
                "response_times": {
                    "avg": 99,
                    "max": 201,
                    "min": 19,
                    "p80": 172,
                    "p90": 175,
                    "p95": 178,
                    "p99": 189,
                    "median": 113,
                    "stddev": 73
                },
                "iteration_count": 1000,
                "status_code_dist": {
                    "405": 1000
                }
            },
            {
                "id": 2,
                "error_dist": {},
                "fail_count": 0,
                "location_dist": {
                    "DE": {
                        "error_dist": {},
                        "fail_count": 0,
                        "location_dist": {},
                        "success_count": 500,
                        "response_times": {
                            "avg": 48,
                            "max": 242,
                            "min": 35,
                            "p80": 51,
                            "p90": 57,
                            "p95": 70,
                            "p99": 131,
                            "median": 44,
                            "stddev": 17
                        },
                        "iteration_count": 500,
                        "status_code_dist": {
                            "200": 500
                        }
                    },
                    "US": {
                        "error_dist": {},
                        "fail_count": 0,
                        "location_dist": {},
                        "success_count": 500,
                        "response_times": {
                            "avg": 323,
                            "max": 807,
                            "min": 296,
                            "p80": 317,
                            "p90": 332,
                            "p95": 383,
                            "p99": 684,
                            "median": 307,
                            "stddev": 64
                        },
                        "iteration_count": 500,
                        "status_code_dist": {
                            "200": 500
                        }
                    }
                },
                "success_count": 1000,
                "response_times": {
                    "avg": 186,
                    "max": 807,
                    "min": 35,
                    "p80": 309,
                    "p90": 317,
                    "p95": 332,
                    "p99": 678,
                    "median": 269,
                    "stddev": 145
                },
                "iteration_count": 1000,
                "status_code_dist": {
                    "200": 1000
                }
            }
        ],
        "fail_count": 0,
        "location_dist": {
            "DE": {
                "fail_count": 0,
                "success_count": 500,
                "response_times": {
                    "avg": 37,
                    "max": 242,
                    "min": 19,
                    "p80": 46,
                    "p90": 52,
                    "p95": 59,
                    "p99": 96,
                    "median": 37,
                    "stddev": 17
                },
                "iteration_count": 500
            },
            "US": {
                "fail_count": 0,
                "success_count": 500,
                "response_times": {
                    "avg": 247,
                    "max": 807,
                    "min": 162,
                    "p80": 309,
                    "p90": 317,
                    "p95": 332,
                    "p99": 678,
                    "median": 249,
                    "stddev": 88
                },
                "iteration_count": 500
            }
        },
        "success_count": 1000,
        "response_times": {
            "avg": 142,
            "max": 807,
            "min": 19,
            "p80": 303,
            "p90": 309,
            "p95": 317,
            "p99": 400,
            "median": 163,
            "stddev": 122
        },
        "iteration_count": 1000
    }
}
</code></pre>

This load testing result shows the performance of a web application under load testing. The result is presented in JSON format and has `two` steps, each with `two` locations: `DE` and `US`.

The `summary` section gives an overview of the test results, which includes the success and fail count, response times, iteration count, and status code distribution for each step and location. The `location_dist` section shows the response times for each location, and the `response_times` section shows the average, maximum, minimum, and percentile response times for each step and location.

In general, the load testing result indicates that the web application's performance varies significantly across locations. Because the target server is located in Frankfurt (Germany), the response times in the US are generally higher than in DE, which indicates that the application is slower for users in the US. The `status_code_dist` shows that all requests in the test returned a status code of 405 in step 1 and 200 in step 2.

The `test_url` gives the Ddosify Cloud test URL for detailed reporting using charts and tables.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FYZ7ZVRraeVAOy5RGIEEz%2Fimage.png?alt=media&amp;token=d16ca24c-bb5d-4ea0-b483-be018e123a35" alt=""><figcaption><p>Ddosify Cloud Test Report</p></figcaption></figure>


# Self-Hosted

Ddosify Platform has two versions:

* Cloud (available at [here](https://app.ddosify.com/))
* Self-Hosted (installation at [here](https://github.com/ddosify/ddosify/tree/master/selfhosted))

While you can directly start to use [Ddosify Cloud](https://app.ddosify.com/) without any overhead or installation, you can also use Ddosify in-house and host it yourself using Ddosify Self-Hosted.&#x20;

It has two editions:

* Community
* Enterprise

While Community Edition allows you to monitor your Kubernetes clusters and use distributed mode for performance testing, Enterprise Edition allows you to do much more. For more information, you can compare the editions [here](https://github.com/ddosify/ddosify?tab=readme-ov-file#comparison-of-ddosify-cloud-self-hosted-ee-self-hosted-ce).


# Install eBPF Agent (Alaz) on Self-Hosted

To start monitoring your Kubernetes Cluster, you need to create a new Cluster on the Ddosify Self-Hosted platform. To achieve this, navigate to the [Clusters page](https://app.ddosify.com/clusters) and click the Add Cluster button. After providing a unique name for the Cluster, you will be navigated to the Observability page, where you will see the [Service Map](/ddosify/kubernetes-monitoring/service-map), [Metrics Dashboard](/ddosify/kubernetes-monitoring/metrics) and [Distributed Tracing](/ddosify/kubernetes-monitoring/distributed-tracing) for this Cluster.&#x20;

But before that, you have to install and run our [open-source eBPF agent (Alaz)](https://github.com/ddosify/alaz) as a DaemonSet in your Kubernetes Cluster. Follow the below instructions to set up a new cluster successfully.

First, you need to expose your Self-Hosted application URL so that Alaz could write data to it. For this purpose, you can use tools such as [ngrok](https://ngrok.com/) or [Cloudflare Tunnels](https://www.cloudflare.com/products/tunnel/). Here, we will use ngrok.

1. **Expose the application URL to the public**

   1. For this, you can follow the first 2 steps in this post to configure ngrok: [https://ngrok.com/docs/getting-started/](https://ngrok.com/docs/getting-started/?os=macos).
   2. Then run&#x20;

      ```
      ngrok http http://localhost:8014
      ```
   3. This will take your terminal into a session. In this session, copy the URL in the "Forwarding" row. In the below example image, the URL [`https://aa3a-31-223-64-94.ngrok-free.app`](https://aa3a-31-223-64-94.ngrok-free.app) points traffic to the URL `http://localhost:8014`. Copy the first URL.&#x20;

   <figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FiI5Nfr25Set78rUDQUVa%2Fimage.png?alt=media&amp;token=1f57c7a0-3c2c-4b39-a8e0-9d6c8ac7a8af" alt="" width="563"><figcaption><p>ngrok terminal session</p></figcaption></figure>
2. **Install Alaz**&#x20;
   1. Open the cluster you want to monitor
   2. Click on the Set Up Cluster button&#x20;
   3. A pop-up will open and show you how to install Alaz via Kubectl or Helm:

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FiStICknDgraWFYXUB2CN%2Fimage.png?alt=media&amp;token=4fe8f454-0c19-4939-bcad-bf8d1c3e0c21" alt="" width="563"><figcaption><p>Self-Hosted Alaz Installation Instructions for Kubectl</p></figcaption></figure>

4. Here, you will see a line that only exists on Ddosify Self-Hosted just above the code block. Here, change the protocol and the URL according to your exposed URL. In our example, we set `http` to `https` and set our URL as `aa3a-31-223-64-94.ngrok-free.app`.&#x20;
5. The pop-ups now look like this:

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F3agL2GR4y85KMVg4jOMN%2Fimage.png?alt=media&amp;token=dbf405bf-9cdc-4ee0-9598-2f33474d0378" alt="" width="563"><figcaption><p>Modified Self-Hosted Alaz Installation Instructions for Kubectl</p></figcaption></figure>

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FKnj670DyghTPBm2KSKA5%2Fimage.png?alt=media&amp;token=09ccb9fc-cc8b-4382-90f2-ff1ef07b7672" alt="" width="563"><figcaption><p>Modified Self-Hosted Alaz Installation Instructions for Helm</p></figcaption></figure>

6. Now you can execute these commands to install Alaz. For more details about them, you can check [here](/ddosify/kubernetes-monitoring/install-ebpf-agent-alaz).&#x20;

{% hint style="success" %}
If you require assistance with setting up Alaz, you can join our[ Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# Upgrading to Self-Hosted Enterprise

There are two plans for Ddosify Self-Hosted: **Enterprise** and **Community** Edition. While Community Edition allows you to execute load/latency tests and monitor your Kubernetes clusters **up to 1 node**, Enterprise Edition additionally allows you to&#x20;

* Set up alerts (up to 25)
* Create teams
* Monitor your Kubernetes clusters **up to 20 nodes**

To use Ddosify Self-Hosted Enterprise Edition, first, you should upgrade your plan from Ddosify Cloud. To upgrade your plan, follow these steps:\
\
1\. Click on your user icon in the upper right corner\
2\. Select "Pricing" from the dropdown menu\
3\. Click on the "Self Hosted" tab\
4\. You will be taken to the upgrade page where you can select your desired plan.

<figure><img src="https://lh7-us.googleusercontent.com/vRsPGtUc5Eckyxg1UrIW3Ul_K5qw5vpMCQxvHaIz8PBCyfEVwPDiqn3XABz9wYYmUnWfgxyOG_LAQ0DuygfUCairZ0Uq-KyGkfePbyM7MoipHUIMzcY_h0FkC5IPQbowIooBoo2l32mwKiFkN5mep2Q" alt=""><figcaption><p>Self-Hosted pricing page</p></figcaption></figure>

For more details on changing your subscription, you can check the [docs](https://app.gitbook.com/o/jN3rtZ38DU58INyTNPm7/s/ugegoRCn84wtxrIelgft/~/changes/105/ddosify/getting-started/pricing).

After that, the Ddosify Self-Hosted pricing page should look like this:

<figure><img src="https://lh7-us.googleusercontent.com/Lgk9sMlrQsJId2N9G0EoBEa6g2CJ5N4nA-AcPVwnV-ZKFYdfY0vQa-kfH4DxO0yv1RsB1LIjabsjZtjLvVK9ExabhhQYXiZLpgv6ycWTrNdid3cNvtQHhkOq_NPZWirI_OUJN1BqmctPPZ4McY_gjlk" alt=""><figcaption><p>Self-Hosted pricing page after the upgrade</p></figcaption></figure>

You can also check your subscription status from the dashboard in Ddosify Cloud:

<figure><img src="https://lh7-us.googleusercontent.com/feAPhjxqPLDLi3DMi__NCSQmqtR9TUvs_JOc2HRN68LO3BSuRV9z-dT_YyT5TlXUfDkrc0rmLa_L6KnN9rC-WMk3ro5yER-Zeey4c_8PQkxuv0wG-EjXR9J9dT1JH5JDLBg4tc6_rD_ZOYWsSBVhnsc" alt="" width="563"><figcaption><p>Subscription information in the dashboard</p></figcaption></figure>

Here, you can see that the Self-Hosted subscription is not activated. To do so, set up your Self-Hosted application. For more details on setting up Ddosify Self-Hosted, you can check [here](https://github.com/ddosify/ddosify/tree/master/selfhosted).

To activate Ddosify Self-Hosted Enterprise, you can do the following:

1. Open Ddosify Self-Hosted. You will see the dashboard:

<figure><img src="https://lh7-us.googleusercontent.com/atlyOM2YFCOC26hIspiRQAVgE05r3pZI6hTq_fAh9D8dVlBxGERKR28I1UfuBCB1U6X3-C5adCuBYTixTJRKhJB7_wAFa82jpZLWcQQf1NzLk6MnkttuGJdfdw5XHor_95T_k7Fc1ofmMaUnilLe5bY" alt=""><figcaption><p>Ddosify Self-Hosted Community Edition Dashboard</p></figcaption></figure>

2. Click on the “Upgrade to Enterprise Edition” on the upper right corner. Here, you will see instructions on how to validate your license key.

<figure><img src="https://lh7-us.googleusercontent.com/LgcAf7Wru1FE_9HyLGOl06zFZNVqUMPp3E4Bvhlcg-5UPOwiBF3st0_FbboABlO1SFnCLSpNDz3H8xZ3ILgzA8f7pB50TvB60sVXbWyHoeJBqiMWrTDNT2q6PuptE1cF3TV1AtmLE4jQ3R0Mg7MX2Qc" alt="" width="375"><figcaption><p>Pop-up for Ddosify Self-Hosted Enterprise Edition Upgrade</p></figcaption></figure>

3. Go to Ddosify Cloud and open the account settings (which appears when you click on your account on the upper right corner). Below, you will see this:

<figure><img src="https://lh7-us.googleusercontent.com/83yAQz9tEC-i4azRsaPfJ3to5x2rD5vrDqnoYdYtgD2onM-S6wZ18fxQtV2bVZrq_rBAlowOVFmmvUjNLh49C32ptooA0mcPcEmBZ80GeNJj0PbvOBGp3bYkfB8sD-k_p7M3u43Fy_O7xFGcmJcmXAk" alt="" width="375"><figcaption><p>Ddosify Self-Hosted license key section</p></figcaption></figure>

4. Click on “Create License Key”. This will create a license key for you. If you wish, you can use the button next to it to revoke it and create a new license key. This allows you to upgrade Ddosify Self-Hosted again if you want to re-deploy it.
5. Go ahead and copy this license key to the pop-up that appeared in Ddosify Self-Hosted. After you click on “Approve”, your license key is validated and then you will be redirected to the login page. After you log in, you can start to use Ddosify Self-Hosted Enterprise Edition.

<figure><img src="https://lh7-us.googleusercontent.com/tFc5YMRDXCUIgmRlI0XwS-EKN_5so2mhaojfKN0VnLY4zsSaMZ1rFyDpX-W3PkR5aiqIA_4xlzdGMYMUQcNVJjFvVkhO3JVt3vINQ4RWe4AdOe2hWdLdT5jaUz8VQGOMAwqrGp_v8XfcwAhdslnJXu4" alt=""><figcaption><p>Ddosify Self-Hosted Enterprise Edition dashboard</p></figcaption></figure>

{% hint style="info" %}
**Note:** If you paste your Self-Hosted license key while **not being subscribed to Self-Hosted Enterprise on Ddosify Cloud**, you can still use distributed mode on Ddosify Self-Hosted Community Edition but you **can’t use Enterprise** features. If you wish to upgrade to Self-Hosted Enterprise Edition after this, you can first upgrade your plan on Ddosify Cloud. Then when you click on “Upgrade to Enterprise Edition” on Ddosify Self-Hosted, a **pop-up will appear**. Then, the license key you’ve already entered will be checked again after you click on “Check Subscription”. If your Cloud plan is Self-Hosted Enterprise, your license key will be validated and you will be redirected to the login page. After you login, you can start to use Ddosify Self-Hosted Enterprise Edition.
{% endhint %}

<figure><img src="https://lh7-us.googleusercontent.com/CXHPuf7GY_AuiHfrbDESxOL8zf7rHeu7-Nb8G_3TXVv5M16MFoACz5t1kfHwHJZk-OHAmAPWqLnNkRNl7F7laNTb3kqP_psRZGxgjfm3Eo_YQY0KWfQXKba07ZMAzDl2jWwRKi7lo9yKpxeCYSFEwEo" alt="" width="375"><figcaption><p>License key re-validation pop-up</p></figcaption></figure>

{% hint style="success" %}
If you require assistance with activating Ddosify Self-Hosted Enterprise Edition, you can join our[ Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# Self-Hosted Slack Integration

You can use Slack to get notified about anomalies in your Kubernetes cluster using alerts.&#x20;

While Ddosify Cloud allows you to integrate your Slack workspace into Ddosify seamlessly, you need to follow some steps to do the same on Ddosify Self-Hosted. Here’s how you can do so:

{% hint style="info" %}
**Note:** This doc is only applicable to Ddosify Self-Hosted Enterprise Edition. Ddosify Self-Hosted Community Edition does not support alerts and integrations.
{% endhint %}

#### Creating A Slack App

To create a Slack integration for Ddosify Self-Hosted, you need to create a Slack application. Go to [Slack Apps](https://api.slack.com/apps). You need to sign in to your Slack workspace.

1. Click on “Create New App”.

<figure><img src="https://lh7-us.googleusercontent.com/crUN1pNj5F78Nai9TbUn6TE2j270QCjcrxJ3fpu5DjOpaw0rOoVyCJBSuupPh_3S2O3eFsl4U6IeOPXlhH1RjXMu6XhnzH8IiI75b77_NKPsJqD-GNu4VqgtmkOucboltdkgEJ50TKGcC4xZCPoViag" alt="" width="375"><figcaption><p>Slack app creation</p></figcaption></figure>

2. Choose “From scratch”.

<figure><img src="https://lh7-us.googleusercontent.com/Kq2KEqkWboFKKckDXxQX4bDZyP25bf1guAV9l_i7PwwS-eyXy8_LW91gRKMmZeOBbNKsitzCXM1dTsgbpHiX2KeJlQzOsmFUIpijdLQIVj2MGq4aAPuJo8QQtZurCjfHKeCMUjM7h0EdcivHMLZxsk0" alt="" width="375"><figcaption><p>Slack app creation</p></figcaption></figure>

3. Give it a name (you can type in Ddosify) and choose a workspace you already logged in.
4. Click on “Create App”.
5. Go to “OAuth & Permissions” from the tabs on the left.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fbs9wKVUuPnl1kuR1Mflu%2Fimage.png?alt=media&amp;token=064949f1-6725-492b-a928-20d5ef8154d4" alt="" width="133"><figcaption><p>Slack app management tabs</p></figcaption></figure>

6. Scroll down to “Scopes”.

<figure><img src="https://lh7-us.googleusercontent.com/hLc0kjzAmovl_tnoPe6HsOZaMUNd2L4bnRR_cPS6NGJK8LRctRhVyFWfBb8M80RhcOx67YudNx1NS7bzeY3c0EIPjziZHU-pvJ5Jv6PPaq0xru8nSldtzBdAJA3dT4mUsh2RnCfiSzK9Cpk4gEnECHE" alt="" width="375"><figcaption><p>Empty bot token scopes</p></figcaption></figure>

7. Click on “Add an OAuth Scope” in the “Bot Token Scopes” part.
8. Add the following permissions:

* channels:join
* channels:read
* chat:write
* groups:read
* im:read
* mpim:read

9. After that, your “Bot Token Scopes” should look like this:

<figure><img src="https://lh7-us.googleusercontent.com/MqWscNAnktzslyVM8HWlNe2nnx5cBf1fQZYI1YJE9yj44ixH_67DlqwnFwRUCi_keCaeBuRB-62JrZWmnkcObEBnjLLOMiYi9z14j28pAtAj6ycSmlBE1MpkKVAj8ABTaftYXloe9UF9Rf9odWnb59Q" alt="" width="375"><figcaption><p>Correct bot token scopes</p></figcaption></figure>

10. Then click on “Install to Workspace” under the section “OAuth Tokens for Your Workspace”

<figure><img src="https://lh7-us.googleusercontent.com/0xJtxOAvoui1EUPsUvxAgOy3tF8OpGFTIOJUUljJ8tdnIxwSiih9TsxZZpH56pT75ssMRO1EWcbYWvVeWg0OIkWnsfjBMBSi85FoQIyD0hvyi1jRMEhXvaI1bomHosyNj5YJEkoGRgAlmEZlRfbxIV0" alt="" width="375"><figcaption><p>The button to add the slack app to workspace</p></figcaption></figure>

11. You will be redirected to a Slack page asking for permissions on your selected workspace. Click on “Allow” to continue.

<figure><img src="https://lh7-us.googleusercontent.com/PE816FVgLeuChpQ0dk3m59HZZHiYenU_PQbrgZSxGvwJyon_njixEYzNco-5lou-WxXdy9TWtx3P_1XdGK-pX-PoxRHTuXZuOC8VYTQlNt8NACk00JvGuQ9WLnyNjFewtjU1U24JZR_a81w0xxbQK5Y" alt="" width="375"><figcaption><p>Slack workspace permission page</p></figcaption></figure>

12. Then, in the “OAuth Tokens for your Workspace” section, you will see a “Bot User OAuth Token”. Copy it and paste it on Slack integration creation in Ddosify.

<figure><img src="https://lh7-us.googleusercontent.com/25TL3_ONqV6cdyYI-Zn_VfWvcGuKJ7Xz2JCr0AjI9OyjFcgI7kxWix8iVk6xG-CfE1WxQhooBrOiXrKx5nlKmEwRC-RA2IHLcKiuLfUnkd3WW0iDvCY_Yh_dvGja0ZDBtWTuf7DTRPf1grVOwTSPgQo" alt="" width="375"><figcaption><p>An example bot user OAuth token</p></figcaption></figure>

Congratulations! :tada: You've successfully configured your Slack app. Now there remain only a few steps to connect it to Ddosify.

#### Setting Up The Slack App in Ddosify

1. After you create your Slack application, go to the integrations section in Ddosify Self-Hosted EE. You can find it here:

<figure><img src="https://lh7-us.googleusercontent.com/7jJ9nuckEcrBAsU6pw3VKr_TdBkrGqNtT0L6qzoBwfatiaPymvTrdahQe-rRvJ4LLnRe-IVvAWkHPwi6fzMmb4n2VX47zlLXKOsEJEfj8yxuMrYcwNqqsYjwDyp_zGpWa5zZ8Ilw7_AepbLkyqjMfb4" alt="" width="188"><figcaption><p>Ddosify Self-Hosted pages</p></figcaption></figure>

2. After that, click on “Add Integration”. A pop-up will show up:

<figure><img src="https://lh7-us.googleusercontent.com/AlEmbJPTZfRGmcM-H1Wta9MS2w4GnlywGva8ifnitspdUqPj1_axM4CmArLW3WhtvY_E9Go8nEg7OAKbpeJhzG92XV38Vvd_r2wa6PVMSfa6nTpPuPL85oYgaiLzeU2n6xYasRLhZmXBgnLHpQPO9Xk" alt="" width="563"><figcaption><p>Slack app pop-up</p></figcaption></figure>

2. Here, provide a name for your integration, paste the Bot User OAuth Token you copied from the earlier step, and click on “Make Integration”. This will take you to the channel selection page.&#x20;

{% hint style="info" %}
**Note:** If your Bot Token is correct, you will be able to see the channels present in your Slack workspace. If your token is invalid, this channel dropdown will be stuck at loading. In that case, you can delete the integration and retry.
{% endhint %}

<figure><img src="https://lh7-us.googleusercontent.com/KsRbo-HObw0jFlIlXkB-zxlXQSDzK1e89QR7ZkP1is5WaClywts2s0heQg5wZfanuj--51O8zWBDrwP_-8smwpcH9f0DiJp3WacDOiahXkTB-IK3Of_5Xy6Dfv0JNVGIjvAnDnpjxd6rpxIa5LQ2mcI" alt="" width="375"><figcaption><p>Slack channel selection dropdown</p></figcaption></figure>

3. After you choose a channel and click on “Save Channel”, your slack app will join that channel and will be able to send messages there.&#x20;
4. Once successful, you can test your integration by clicking “Test Integration”. If you are able to see the test message sent to your selected Slack channel, that means you've successfully set up your Slack app and you can start to use this integration in your alerts.

<figure><img src="https://lh7-us.googleusercontent.com/sVMiW-s_yH6x2VJfMsyoZUapZoNbfk9mRGWG1OEJwluF7eQE8fa_zbfhGG6mtFBIQsVFvMamZm6vB2COYODJ_v86o_MZsACVEve4d3R3CHY8orr-HI5R4R5Rl73S44L5B2gY1ysc8DukK2GPo2tCx-k" alt=""><figcaption><p>Test integration button</p></figcaption></figure>

This is what you will see if your integration works successfully:

<figure><img src="https://lh7-us.googleusercontent.com/h8es_Lf23WAAOldZKZ1TVhQ3ajeWoB80dyHsOCpVxa2mCjmpLgAEQvD_ZXgpi7sjVn4EsaPNY0m4Y4SODeFNG-tUKq8QydCrNYfGYzGk1EXyOic30W1N0LHzGUW6ooR90hL8B6blorkWGEfTKZ94nZw" alt="" width="563"><figcaption><p>Example Slack test message</p></figcaption></figure>

{% hint style="success" %}
If you require assistance with setting up Slack integration for Ddosify Self-Hosted, you can join our[ Discord](https://discord.com/invite/9KdnrSUZQg) or send an email to <support@ddosify.com>.
{% endhint %}


# Learning Center

Discover detailed resources about Kubernetes, Performance/Load Testing, Observability, eBPF, DevOps and more on the [Ddosify Blog](https://ddosify.com/blog/).

* [Kubernetes Articles](#kubernetes-articles)
* [Performance / Load Testing Articles](#performance-load-testing-articles)
* [eBPF (Extended Berkeley Packet Filter) Articles](#ebpf-extended-berkeley-packet-filter-articles)
* [Additional Articles](#additional-articles)

### Kubernetes Articles

<table data-card-size="large" data-column-title-hidden data-view="cards" data-full-width="false"><thead><tr><th></th><th data-hidden></th><th data-hidden></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-type="content-ref"></th></tr></thead><tbody><tr><td><a href="https://ddosify.com/blog/how-to-securely-expose-your-kubernetes-application-using-nginx-ingress/"><strong>How to Securely Expose Your Kubernetes Application using NGINX Ingress</strong></a></td><td></td><td></td><td><a href="https://ddosify.com/blog/how-to-securely-expose-your-kubernetes-application-using-nginx-ingress/">https://ddosify.com/blog/how-to-securely-expose-your-kubernetes-application-using-nginx-ingress/</a></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FUaKh1aksMa6UFi7yEEy7%2F00.jpg?alt=media&amp;token=e896298c-6519-4d0a-b7f8-a879ee003072">00.jpg</a></td><td></td></tr><tr><td><a href="https://ddosify.com/blog/kubernetes101-introduction-to-kubernetes-and-kubernetes-architecture/"><strong>Kubernetes 101 - Introduction &#x26; Architecture</strong></a></td><td></td><td></td><td><a href="https://ddosify.com/blog/kubernetes101-introduction-to-kubernetes-and-kubernetes-architecture/">https://ddosify.com/blog/kubernetes101-introduction-to-kubernetes-and-kubernetes-architecture/</a></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F4QfiObwoCAbbKNpli9YC%2F00.jpg?alt=media&amp;token=6a096474-e1ee-4a37-a51c-78e845a3d6df">00.jpg</a></td><td></td></tr><tr><td><a href="https://ddosify.com/blog/how-to-detect-slow-sql-queries/"><strong>Detect Slow SQL Queries on Kubernetes Before Your Customers Do</strong></a></td><td></td><td></td><td><a href="https://ddosify.com/blog/how-to-detect-slow-sql-queries/">https://ddosify.com/blog/how-to-detect-slow-sql-queries/</a></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FCexMWoEyG3wOY4Fm1zbn%2F00.jpg?alt=media&amp;token=87f66285-3d18-4eec-b6be-7e996ee6a242">00.jpg</a></td><td></td></tr><tr><td><a href="https://ddosify.com/blog/five-tips-to-help-you-monitor-your-kubernetes-cluster/"><strong>​​5 Tips To Help You Monitor Your Kubernetes Cluster</strong></a></td><td></td><td></td><td><a href="https://ddosify.com/blog/five-tips-to-help-you-monitor-your-kubernetes-cluster/">https://ddosify.com/blog/five-tips-to-help-you-monitor-your-kubernetes-cluster/</a></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FJ01K84nievbUYxMT28PB%2F00.png?alt=media&amp;token=94ee81e3-34a6-432c-9e05-f775fa76126f">00.png</a></td><td></td></tr><tr><td><a href="https://ddosify.com/blog/effortless-kubernetes-monitoring-using-ebpf/"><strong>Effortless Kubernetes Monitoring and Bottleneck Detection using eBPF 🐝</strong></a></td><td></td><td></td><td><a href="https://ddosify.com/blog/effortless-kubernetes-monitoring-using-ebpf/">https://ddosify.com/blog/effortless-kubernetes-monitoring-using-ebpf/</a></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FPJy09yUm4NzCc6FshoJg%2F00_Effortless_Kubernetes_Monitoring_and_Bottleneck_Detection_using_eBPF.png?alt=media&amp;token=b9ea2b99-d21f-4686-923f-c58438526380">00_Effortless_Kubernetes_Monitoring_and_Bottleneck_Detection_using_eBPF.png</a></td><td></td></tr></tbody></table>

### Performance / Load Testing Articles

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-hidden></th><th data-hidden></th><th data-hidden data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><a href="https://ddosify.com/blog/preparing-your-ecommerce-website-for-black-friday-success/"><strong>Preparing Your E-commerce Website for Black Friday Success</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FI97LpVY5lR4Z3l40nwQG%2F00.png?alt=media&amp;token=ac0eb186-6a01-423e-9189-4a68f0dc1402">00.png</a></td><td><a href="https://ddosify.com/blog/preparing-your-ecommerce-website-for-black-friday-success/">https://ddosify.com/blog/preparing-your-ecommerce-website-for-black-friday-success/</a></td></tr><tr><td><a href="https://ddosify.com/blog/django-restframework-throttling-with-apikey/"><strong>Django Rest Framework Throttling with API Key</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F0PIiQncFa8LjTggOwB50%2Fdjango_rest_framework_blog_preview.jpg?alt=media&amp;token=54d08f0a-45fd-4fa8-960c-04e596212c6e">django_rest_framework_blog_preview.jpg</a></td><td><a href="https://ddosify.com/blog/django-restframework-throttling-with-apikey/">https://ddosify.com/blog/django-restframework-throttling-with-apikey/</a></td></tr><tr><td><a href="https://ddosify.com/blog/load-testing-a-fintech-exchange-api-with-csv-test-data-import/"><strong>Load Testing a Fintech API with CSV Test Data Import</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FQRvs7dS0oTWYguQ4Jy0F%2Fload-testing-a-fintech-api-preview.png?alt=media&amp;token=692ad130-db07-4456-a867-265be48d6664">load-testing-a-fintech-api-preview.png</a></td><td><a href="https://ddosify.com/blog/load-testing-a-fintech-exchange-api-with-csv-test-data-import/">https://ddosify.com/blog/load-testing-a-fintech-exchange-api-with-csv-test-data-import/</a></td></tr><tr><td><a href="https://ddosify.com/blog/performance-benchmarking-popular-js-web-frameworks-expressjs-vs-koajs-vs-fastify/"><strong>Performance Benchmarking Popular JS Web Frameworks - Express.js vs Koa.js vs Fastify</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FLAPj8Iw1iFRMe8IQ6oMf%2Fpreview.jpeg?alt=media&amp;token=9caef87e-9f8f-4616-8072-392b15dff147">preview.jpeg</a></td><td><a href="https://ddosify.com/blog/performance-benchmarking-popular-js-web-frameworks-expressjs-vs-koajs-vs-fastify/">https://ddosify.com/blog/performance-benchmarking-popular-js-web-frameworks-expressjs-vs-koajs-vs-fastify/</a></td></tr><tr><td><a href="https://ddosify.com/blog/testing-the-performance-of-user-authentication-flow/"><strong>Testing the Performance of User Authentication Flow</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FTH3GBH0Aa5O3OFgRn13H%2Fauth_performance_testing_preview.png?alt=media&amp;token=709f9343-885f-4226-9e86-933bd507feaa">auth_performance_testing_preview.png</a></td><td><a href="https://ddosify.com/blog/testing-the-performance-of-user-authentication-flow/">https://ddosify.com/blog/testing-the-performance-of-user-authentication-flow/</a></td></tr><tr><td><a href="https://medium.com/ddosify/cold-start-comparison-of-aws-lambda-and-cloudflare-workers-a3f9021ee60a"><strong>Cold Start Comparison of AWS Lambda, Cloudflare Workers and AWS Cloudfront Function</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FEfFqdBsDHhWRwDy0dwxC%2Fcold_start_comparison.jpg?alt=media&amp;token=a9f9801b-0420-4b22-a629-63fcb7d5cd8e">cold_start_comparison.jpg</a></td><td><a href="https://medium.com/ddosify/cold-start-comparison-of-aws-lambda-and-cloudflare-workers-a3f9021ee60a">https://medium.com/ddosify/cold-start-comparison-of-aws-lambda-and-cloudflare-workers-a3f9021ee60a</a></td></tr><tr><td><a href="https://ddosify.com/blog/a-comprehensive-guide-to-using-postman-collections-for-effective-api-endpoint-load-testing/"><strong>A Comprehensive Guide to Using Postman Collections for Effective API Endpoint Load Testing</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F08VQo2l7rs6NP1X95PgE%2F00.jpg?alt=media&amp;token=1f2dbc05-86a1-4b7d-a0b9-2aab6c55d8bc">00.jpg</a></td><td><a href="https://ddosify.com/blog/a-comprehensive-guide-to-using-postman-collections-for-effective-api-endpoint-load-testing/">https://ddosify.com/blog/a-comprehensive-guide-to-using-postman-collections-for-effective-api-endpoint-load-testing/</a></td></tr></tbody></table>

### eBPF (Extended Berkeley Packet Filter) Articles

<table data-card-size="large" data-column-title-hidden data-view="cards"><thead><tr><th></th><th data-hidden></th><th data-hidden></th><th data-hidden data-type="files"></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><a href="https://ddosify.com/blog/exploring-function-tracing-with-ebpf-and-uprobes/"><strong>Exploring Function Tracing with eBPF and Uprobes - Episode 1</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FyupIi3iphX8qzB3Sczr2%2F00.jpg?alt=media&amp;token=a6759b90-8ef4-4020-ba5d-9e89d60def98">00.jpg</a></td><td><a href="https://ddosify.com/blog/exploring-function-tracing-with-ebpf-and-uprobes/">https://ddosify.com/blog/exploring-function-tracing-with-ebpf-and-uprobes/</a></td></tr><tr><td><a href="https://ddosify.com/blog/effortless-kubernetes-monitoring-using-ebpf/"><strong>Effortless Kubernetes Monitoring and Bottleneck Detection using eBPF 🐝</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FPaQyUz1Ol5fVPrBE8Vwl%2F00_Effortless_Kubernetes_Monitoring_and_Bottleneck_Detection_using_eBPF.png?alt=media&amp;token=784539fc-6b62-4bb2-aa00-9a157917e4e0">00_Effortless_Kubernetes_Monitoring_and_Bottleneck_Detection_using_eBPF.png</a></td><td><a href="https://ddosify.com/blog/effortless-kubernetes-monitoring-using-ebpf/">https://ddosify.com/blog/effortless-kubernetes-monitoring-using-ebpf/</a></td></tr><tr><td><a href="https://ddosify.com/blog/unveiling-ebpf-verifier-errors/"><strong>Unveiling eBPF Verifier Errors - Episode 1</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fl2HhfCyspKAMJXzaYhjn%2F00.jpg?alt=media&amp;token=e8a8aab0-9b9e-4ff2-a82f-9b88255d905c">00.jpg</a></td><td><a href="https://ddosify.com/blog/unveiling-ebpf-verifier-errors/">https://ddosify.com/blog/unveiling-ebpf-verifier-errors/</a></td></tr></tbody></table>

### Additional Articles

<table data-card-size="large" data-column-title-hidden data-view="cards"><thead><tr><th></th><th data-hidden></th><th data-hidden></th><th data-hidden data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><a href="https://ddosify.com/blog/10-performance-comparison-of-string-operations-in-python/"><strong>10 Performance Comparison of String Operations in Python</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FNnRGYpA0yo33JyiDQil0%2Fpreview.jpeg?alt=media&amp;token=77205eed-3dfe-4cc7-a4f3-5f221f5c3748">preview.jpeg</a></td><td><a href="https://ddosify.com/blog/10-performance-comparison-of-string-operations-in-python/">https://ddosify.com/blog/10-performance-comparison-of-string-operations-in-python/</a></td></tr><tr><td><a href="https://ddosify.com/blog/latency-driven-new-era/"><strong>A New Era Driven by Low Latency</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F1hCLYJuFYr95xKLuGVqc%2Flatency-driven-new-era-cover-img.png?alt=media&amp;token=34a9191f-1ff8-4a96-be70-59000b5ed1b5">latency-driven-new-era-cover-img.png</a></td><td><a href="https://ddosify.com/blog/latency-driven-new-era/">https://ddosify.com/blog/latency-driven-new-era/</a></td></tr><tr><td><a href="https://ddosify.com/blog/ddosify-latency-testing-github-action/"><strong>Ddosify Latency Testing GitHub Action</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FfhpyMt753gGBdff5E1g7%2Flatency-testing-cover.jpg?alt=media&amp;token=910436f9-68a7-40ca-9b88-47bceeeeba76">latency-testing-cover.jpg</a></td><td><a href="https://ddosify.com/blog/ddosify-latency-testing-github-action/">https://ddosify.com/blog/ddosify-latency-testing-github-action/</a></td></tr><tr><td><a href="https://ddosify.com/blog/ten-frontend-performance-monitoring-tools-in-2023/"><strong>10 Frontend Performance Monitoring Tools in 2023</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F0H1Ext1nESFv3sKG3hRI%2Fcover.png?alt=media&amp;token=fe23a250-15ee-448b-9fdd-be3dba202f90">cover.png</a></td><td><a href="https://ddosify.com/blog/ten-frontend-performance-monitoring-tools-in-2023/">https://ddosify.com/blog/ten-frontend-performance-monitoring-tools-in-2023/</a></td></tr><tr><td><a href="https://ddosify.com/blog/introduction-to-software-supply-chain-using-docker-scout/"><strong>Introduction to Software Supply Chain using Docker Scout</strong></a></td><td></td><td></td><td></td><td><a href="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FsKNE0Ot9m6oqPtwU8OgZ%2F00.jpg?alt=media&amp;token=e7868e58-bffa-4803-8157-c7506ac14177">00.jpg</a></td><td><a href="https://ddosify.com/blog/introduction-to-software-supply-chain-using-docker-scout/">https://ddosify.com/blog/introduction-to-software-supply-chain-using-docker-scout/</a></td></tr></tbody></table>


# AWS (Amazon Web Services) Marketplace

**Ddosify Performance Testing Community Edition** is a versatile, high-performance testing tool designed for both public and private endpoints within your AWS infrastructure. It is self-hosted, providing complete control over your testing environment, seamlessly integrating with AWS for an optimal blend of scalability and security. Its strength lies in its roots, built upon a robust open-source load engine that you can explore at <https://github.com/ddosify/ddosify>.

You can deploy [Ddosify Self Hosted](https://github.com/ddosify/ddosify/blob/master/selfhosted/README.md) on your AWS (Amazon Web Services) account as an EC2 instance and perform performance testing on your private endpoints easily.&#x20;

### Deployment

Ddosify Performance Testing Community Edition is available on [AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-mwvnujtgjedjy?sr=0-1\&ref_=beagle\&applicationId=AWSMPContessa). Click **Continue to Subscribe** button.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F3Kgb2m5r819yTKwmdTZO%2Fimage.png?alt=media&amp;token=0479fdda-90b4-4e03-b53f-b28f0bab3ca2" alt=""><figcaption><p>Ddosify Performance Testing Community Edition on <a href="https://aws.amazon.com/marketplace/pp/prodview-mwvnujtgjedjy?sr=0-1&#x26;ref_=beagle&#x26;applicationId=AWSMPContessa">AWS Marketplace</a></p></figcaption></figure>

Click **Accept Terms** button.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FiUFG7ttTClFDR0yP0V8l%2Fimage.png?alt=media&amp;token=661a1d3e-3337-4de8-bae4-5d3c1e2c5c3c" alt=""><figcaption></figcaption></figure>

After a few minutes, the application will be ready to launch. After the application is ready, Click **Continue to Configuration** button.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FI9jaVM0cNWfXH1j8xII0%2Fimage.png?alt=media&amp;token=dcdcac02-ac1a-4be5-a513-96decf34b246" alt=""><figcaption></figcaption></figure>

Select any [AWS Region](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/) to launch the EC2 instance. Ddosify supports all of the AWS regions. In this example, Zurich is selected as the region. Click **Continue to Launch** button.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FMbC86g3i7W8DlYygOacG%2Fimage.png?alt=media&amp;token=69c3bd36-c997-4858-8d87-e8c88999a4a5" alt=""><figcaption></figcaption></figure>

You can see the Usage Instructions of Ddosify. Make sure to:&#x20;

* Select EC2 Instance Type (c5.xlarge, c5.2xlarge). c5.2xlarge is recommended.
* Select or Create VPC and Subnet.
* Create New Based On Seller Settings security groups. Give it a Name, Description and click the Save button.
  * 8014 is used for application access.&#x20;
  * 22 is used for SSH access to the EC2 instance.
* Select or Create Key Pairs.

Click the **Launch** button.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FfwQ14qIu4Q8mhG2wY05q%2Fimage.png?alt=media&amp;token=346d1c9d-c2a4-4d7f-be0c-5dab0675632f" alt=""><figcaption></figcaption></figure>

Now you can see your Subscriptions on [AWS Subscriptions Page](https://us-east-1.console.aws.amazon.com/marketplace/home#/subscriptions). Click the **Manage** button.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FKypT7R9W389SnxoCWtGs%2Fimage.png?alt=media&amp;token=b96a06c3-6ced-4382-9d45-854258abc011" alt=""><figcaption></figcaption></figure>

### Access the Application

Click the **View instances** button to see the deployed EC2 instance.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FakWpUFWDSerc2s6NlzwL%2Fimage.png?alt=media&amp;token=4c7abe30-2e8e-4f95-8f89-f070b34c1309" alt=""><figcaption></figcaption></figure>

You can see the Instance ID for Ddosify. Click the **Access software** link to access Ddosify Performance Testing Community Edition.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fv29iSSuJ71JMhfi7C0Jh%2Fimage.png?alt=media&amp;token=cee2a226-f203-4974-9518-2f2e54f98b7c" alt=""><figcaption></figcaption></figure>

Congratulations! 🎉 Ddosify Performance Testing Community Edition has been successfully deployed on your AWS account. You have complete control over the Ddosify EC2 instance and it will be billed directly to your AWS account.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FNqZ504sHm9VYrxf3S3UC%2Fimage.png?alt=media&amp;token=e81aa985-3df7-4672-ab7b-a5827c775c7f" alt=""><figcaption></figcaption></figure>

### Performance Testing on AWS Private Endpoint

Let's say we have an internal **nginx** server running on port **8090** and we want to conduct performance testing without making any ports accessible to the outside world. Fortunately, we have deployed Ddosify Performance Testing Community Edition on our AWS account so that we can restrict access to only Ddosify EC2 on the Security Groups.

On the target EC2 instance (nginx:8090) security groups, add an Inbound Rule:

* **Type:** Custom TCP
* **Port Range:** 8090
* **Source:** Custom - ddosify\_aws\_marketplace\_sg... (Ddosify EC2 Instance Security Group)
* **Description:** Allow access from Ddosify Performance Testing Community Edition&#x20;

Click the **Save rules** button.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FXJ1FG2y31SBxDyvNGick%2Fimage.png?alt=media&amp;token=ab5e4ad5-9184-4edc-8a6e-efff423f1e2c" alt=""><figcaption></figcaption></figure>

Copy the target EC2 instance (nginx:8090) private IPv4 Address from the EC2 detail.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2FnoBIDFCkha2v4j9d58jE%2Fimage.png?alt=media&amp;token=7442994e-38f0-4b0f-9a33-8f35c6e6b581" alt=""><figcaption></figcaption></figure>

[Open](#access-the-application) Ddosify Performance Testing Community Edition and Click the **New Load Test** button.

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fp1VKp2BmCCUVkrEMdnPk%2Fimage.png?alt=media&amp;token=ae20629f-9de5-4941-b34a-c2690b4b611f" alt=""><figcaption></figcaption></figure>

Type **<http://172.31.9.73:8090>** as the target and Click Debug button.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2F6rECibeyWI0EaCBPHJNl%2Fimage.png?alt=media&amp;token=402a5e50-e4b8-4d3a-b468-4cfe56df41d2" alt=""><figcaption></figcaption></figure>

As you can see, Ddosify successfully accessed the private nginx server by sending a GET request. Close the Debug modal and click Next. Then Configure the Load. Click Next and type a Test Name and click the Start Instant Test button.&#x20;

<figure><img src="https://2539979715-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FugegoRCn84wtxrIelgft%2Fuploads%2Fdipf0HcVtkAnmCGtKwgf%2Fimage.png?alt=media&amp;token=a87bf1b6-d9b5-4be4-bdcd-3bab8c810d2b" alt=""><figcaption></figcaption></figure>

Ddosify performed a successful performance testing to a private endpoint with 1200 iterations for 1 minute.


