{"id":15056964,"url":"https://github.com/lumbrjx/obzev0","last_synced_at":"2025-04-10T05:08:49.085Z","repository":{"id":241582297,"uuid":"805544540","full_name":"lumbrjx/obzev0","owner":"lumbrjx","description":"Chaos engineering tool written in C/Go to test the resilience of TCP/UDP-based applications within Kubernetes environments, simulating various network conditions and failures to ensure the reliability of the overall system.","archived":false,"fork":false,"pushed_at":"2024-09-13T16:32:17.000Z","size":7795,"stargazers_count":47,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-10T05:08:41.619Z","etag":null,"topics":["c","channels","chaos-engineering","devops","ebpf","golang","helm","http","kubernetes","latency","metrics","multithreading","network","optimization","prometheus","proxy","resiliency","tcp","testing","testing-tools"],"latest_commit_sha":null,"homepage":"https://lumbrjx.github.io/obzev0/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lumbrjx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-24T20:16:45.000Z","updated_at":"2025-03-10T22:49:18.000Z","dependencies_parsed_at":"2024-09-14T06:18:26.043Z","dependency_job_id":"a27bbd84-c726-4496-9adb-12aa215ba4e7","html_url":"https://github.com/lumbrjx/obzev0","commit_stats":null,"previous_names":["ehoriz0n/obzev0","ehoriz0n/ton-618","lumbrjx/obzev0"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lumbrjx%2Fobzev0","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lumbrjx%2Fobzev0/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lumbrjx%2Fobzev0/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lumbrjx%2Fobzev0/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lumbrjx","download_url":"https://codeload.github.com/lumbrjx/obzev0/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248161269,"owners_count":21057555,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","channels","chaos-engineering","devops","ebpf","golang","helm","http","kubernetes","latency","metrics","multithreading","network","optimization","prometheus","proxy","resiliency","tcp","testing","testing-tools"],"created_at":"2024-09-24T21:59:17.250Z","updated_at":"2025-04-10T05:08:49.059Z","avatar_url":"https://github.com/lumbrjx.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eobzev0 : Chaos Engineering Tool\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\nObzev0 is a chaos engineering tool designed to help you test the resilience of your systems by simulating real-world failures. It allows you to define and execute chaos experiments to uncover weaknesses in your infrastructure and applications.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/tn.jpg\" /\u003e\n\u003c/p\u003e\n\n## Tech Stack\n\n- **Language:** Go (for the controller and gRPC server), C (for the eBPF program).\n- **Frameworks/Libraries:** Kubernetes client-go (for interacting with the Kubernetes API), gRPC (for communication between components), eBPF (for kernel space programming).\n- **Monitoring:** Prometheus and Grafana for monitoring and visualization.\n## Architecture\n\nObzev0 is built using a microservices architecture, with the following components:\n\n- **Controller:** Responsible for watching Custom Resource Definitions (CRDs) representing chaos scenarios and dispatching work to the DaemonSet.\n- **DaemonSet:** Runs on every node in the Kubernetes cluster and acts as a gRPC server. It executes the chaos scenarios and communicates with the eBPF program in the kernel space.\n- **eBPF Program:** Written in C, it runs in the kernel space and is responsible for monitoring and manipulating network traffic for performance monitoring.\n\n## Features\n\n### Latency Injection\n- Simulate network latency by adding configurable delays to incoming and outgoing requests\n- Customize delay duration for each service to test specific latency thresholds\n\n### Packet Manipulation\n- Introduce packet loss with configurable drop rates\n- Corrupt specific packets to test handling of incomplete or malformed data\n- Apply packet manipulation rules for defined periods\n\n### Traffic Monitoring with eBPF\n- Track network traffic on specific interfaces using eBPF programs\n- Collect detailed metrics on packet flow, dropped packets, and corrupted packets\n\n### Self-cleaning TCP Proxy for Testing\n- Route traffic through a transparent TCP proxy to apply latency and packet manipulation\n- Configure different target services for testing under various network conditions\n\n### Dynamic Configuration\n- Manage chaos experiments through a simple gRPC interface\n- Enable or disable individual services based on testing needs\n\n### Metrics Exposure to Prometheus\n- Expose critical chaos engineering metrics to Prometheus for monitoring and alerting\n- View and analyze metrics such as latency impact, packet loss, and traffic anomalies over time\n\n## Installation\n\n### Prerequisites\n- Go 1.17+\n- Helm and Kubernetes (for cloud-native environments)\n- Prometheus (for collecting chaos engineering metrics)\n\n### Install with Helm\n\n1. Add the Helm repository:\n```bash\nhelm repo add obzev0 https://lumbrjx.github.io/obzev0/chart\nhelm repo update\n```\n\n2. Install Obzev0:\n```bash\nhelm install obzev0 obzev0/obzev0\n```\n\n### Install obzevMini (for non-Kubernetes environments)\n\nDownload the binary:\n```bash\ncurl -o obzevMini https://raw.githubusercontent.com/lumbrjx/obzev0/main/cmd/cli/obzev0mini\nchmod +x obzevMini\n```\n\n### Build from Source\n\n1. Clone the repository:\n```bash\ngit clone https://github.com/lumbrjx/obzev0.git\ncd obzev0\n```\n\n2. For Helm and Kubernetes:\n   - Build the DaemonSet:\n     ```bash\n     make build-daemon TAG=\u003ctag\u003e\n     ```\n   - Build the controller:\n     ```bash\n     make build-controller TAG=\u003ctag\u003e\n     ```\n   - Package Helm chart:\n     ```bash\n     make package-chart\n     ```\nMake sure to give your docker image the \"latest\" tag and push it to a container registry.\n\n3. For obzevMini:\n   - Build the binary:\n     ```bash\n     make build-cli\n     ```\n\n## Usage\n\n### Helm\n\n1. Install the chart:\n```bash\nhelm install \u003crelease-name\u003e obzev0/obzev0\n```\n\n2. Grant controller permissions:\n```bash\nkubectl create clusterrolebinding permissive-binding \\\n  --clusterrole=cluster-admin \\\n  --serviceaccount=controller-system:controller-controller-manager\n```\n\n3. Label nodes:\n   - Control plane:\n     ```bash\n     kubectl label nodes \u003cnode-name\u003e node-role.kubernetes.io/control-plane=\"\"\n     ```\n   - Worker nodes:\n     ```bash\n     kubectl label nodes \u003cnode-name\u003e node-role.kubernetes.io/worker=\"\"\n     ```\n\n4. Apply Custom Resource:\n\nThe chart folder already contains a Custom Resource and you still can define your own one. here's the [CR file](https://github.com/lumbrjx/obzev0/blob/main/chart/templates/obzev0resource.yaml) and apply the changes by running:\n\n```bash\nkubectl apply -f path/to/CR/file\n```\n\n### run locally with kind\n\nafter clonning the repo you can run the following command and have everything done for you:\n\n```bash\nmake all TAG=latest\n```\nit will use a simple dummy express server you can access it [here](https://github.com/lumbrjx/obzev0/blob/main/expressdep.yaml) and the [service](https://github.com/lumbrjx/obzev0/blob/main/expresssvc.yaml)\n\n\n### obzevMini\n\n1. Launch the Daemon Docker container:\n```bash\ndocker run -p 50051:50051 lumbrjx/obzev0-grpc-daemon:latest\n```\n\n2. Initialize configuration:\n```bash\nobzevMini init -Addr=127.0.0.1:50051 -dist=path/to/destination/folder/\n```\n\n3. Apply configuration:\n```bash\nobzevMini apply -path=path/to/configuration/file\n```\n\n## Contributing\n\nWe welcome contributions to Obzev0! Whether you're fixing bugs, adding features, or improving documentation, your contributions are valuable.\n\nFor questions or discussions, contact the project maintainers at kaibitayeb01@gmail.com.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flumbrjx%2Fobzev0","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flumbrjx%2Fobzev0","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flumbrjx%2Fobzev0/lists"}