{"id":17886315,"url":"https://github.com/vaslabs/talos","last_synced_at":"2025-06-24T09:37:41.728Z","repository":{"id":33375423,"uuid":"153780890","full_name":"vaslabs/talos","owner":"vaslabs","description":"Lawful circuit breakers for Scala. Akka and monix circuit breaker implementations with monitoring.","archived":false,"fork":false,"pushed_at":"2021-12-13T15:37:30.000Z","size":33060,"stargazers_count":9,"open_issues_count":26,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-18T11:48:29.280Z","etag":null,"topics":["akka","akka-circuit-breaker","bulkhead","circuit-breaker","circuitbreaker","gateway","kamon","monitoring","monix","monix-circuit-breaker","scala"],"latest_commit_sha":null,"homepage":"https://talos.vaslabs.org/index.html","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vaslabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-10-19T12:40:38.000Z","updated_at":"2022-12-26T22:45:06.000Z","dependencies_parsed_at":"2022-07-15T15:17:21.402Z","dependency_job_id":null,"html_url":"https://github.com/vaslabs/talos","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaslabs%2Ftalos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaslabs%2Ftalos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaslabs%2Ftalos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaslabs%2Ftalos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vaslabs","download_url":"https://codeload.github.com/vaslabs/talos/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244971672,"owners_count":20540830,"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":["akka","akka-circuit-breaker","bulkhead","circuit-breaker","circuitbreaker","gateway","kamon","monitoring","monix","monix-circuit-breaker","scala"],"created_at":"2024-10-28T13:04:12.781Z","updated_at":"2025-03-22T14:30:49.581Z","avatar_url":"https://github.com/vaslabs.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# talos [![Build Status](https://travis-ci.com/vaslabs/talos.svg?branch=master)](https://travis-ci.com/vaslabs/talos) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.vaslabs.talos/taloscore_2.12/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.vaslabs.talos/taloscore_2.12) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/d0dbf73a127c4eff9a5e62d9fa628cbd)](https://app.codacy.com/app/vaslabs/talos?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=vaslabs/talos\u0026utm_campaign=Badge_Grade_Dashboard) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/ae86edbdde884633a0417d851e4fcc9a)](https://www.codacy.com/app/vaslabs/talos?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=vaslabs/talos\u0026utm_campaign=Badge_Coverage) [![Docker hub](https://img.shields.io/badge/Api%20gateway-1.0.0-blue.svg)](https://hub.docker.com/r/vaslabs/talos-gateway/) [![Scala Steward badge](https://img.shields.io/badge/Scala_Steward-helping-blue.svg?style=flat\u0026logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAMAAAARSr4IAAAAVFBMVEUAAACHjojlOy5NWlrKzcYRKjGFjIbp293YycuLa3pYY2LSqql4f3pCUFTgSjNodYRmcXUsPD/NTTbjRS+2jomhgnzNc223cGvZS0HaSD0XLjbaSjElhIr+AAAAAXRSTlMAQObYZgAAAHlJREFUCNdNyosOwyAIhWHAQS1Vt7a77/3fcxxdmv0xwmckutAR1nkm4ggbyEcg/wWmlGLDAA3oL50xi6fk5ffZ3E2E3QfZDCcCN2YtbEWZt+Drc6u6rlqv7Uk0LdKqqr5rk2UCRXOk0vmQKGfc94nOJyQjouF9H/wCc9gECEYfONoAAAAASUVORK5CYII=)](https://scala-steward.org)\n\nTalos is enforcing some theory from literature concerning circuit breakers in the form of typeclasses and laws.\n\nRead more around the theory [here](https://vaslabs.github.io/talos/laws/index.html)\n\n\nThe main deliverable of Talos is fine grained monitoring.\n\n## Usage\nTalos is modularised. You can twist it and pick the dependencies that fit your need. But let's go step by step.\n\n```scala\nlibraryDependencies += \"org.vaslabs.talos\" %% \"taloscore\" % \"2.1.0\"\nlibraryDependencies += \"org.vaslabs.talos\" %% \"talosakkasupport\" % \"2.1.0\"\nlibraryDependencies += \"org.vaslabs.talos\" %% \"taloskamon\" % \"2.1.0\"\n```\nThe events library provides a way to stream events on what's happening in the circuit breakers. E.g. combining with the talosakkasupport you can do:\n```scala\nimport akka.actor.typed.{ActorSystem, ActorRef}\nimport akka.actor.typed.scaladsl.adapter._\nimport akka.pattern.CircuitBreaker\nimport cats.effect.IO\nimport talos.circuitbreakers.TalosCircuitBreaker\nimport talos.circuitbreakers.akka._\n\nimport scala.concurrent.duration._\n\ndef createCircuitBreaker(name: String = \"testCircuitBreaker\")\n                      (implicit system: ActorSystem[_]): AkkaCircuitBreaker.Instance = {\n    AkkaCircuitBreaker(\n      name,\n      CircuitBreaker(\n        system.scheduler.toClassic,\n        5,\n        2 seconds,\n        5 seconds\n      )\n    )\n}\n\n\n```\n\n\nIf you have an existing solution based on Akka circuit breaker and you can extract the circuit breaker like this.\n```scala\n    val akkaCB: CircuitBreaker = talosCircuitBreaker.circuitBreaker.unsafeRunSync()\n```\n\nOtherwise you can use the TalosCircuitBreaker typeclass directly\n```scala\n    val action: IO[Unit] = talosCircuitBreaker.protect(IO(println(\"Running inside the circuit breaker\")))\n    action.unsafeRunSync()\n```\n\nTalos also supports the CircuitBreaker from [monix](https://vaslabs.github.io/talos/monix/monix.html)\n\n\n### Complete usage example\n\nHow to code can be found here:\nhttps://github.com/vaslabs/talos/blob/master/examples/src/main/scala/talos/examples/ExampleApp.scala\n\n### Laws\nIf you wish to implement your own TalosCircuitBreaker typeclasses you can test them against the laws library:\n```scala\nlibraryDependencies += \"org.vaslabs.talos\" %% \"taloslaws\" % \"2.1.0\" % Test\n```\n\n\n## Run the demo\n\n- Spin up the docker images provided: \n\n```bash\ncd examples\ndocker-compose up\n```\n\nYou can see the kamon status [here](http://localhost:5266) and the prometheus metrics are exposed \n[here](http://localhost:9095) .\n\n### How Tos\n1. Setup docker to work with Kamon: Look at build.sbt, find dockerCommonSettings\n2. Setup logging: Look in the example module in the resources for the logback.xml file.\n\n\n\n## Architecture\n\n![alt text](https://docs.google.com/drawings/d/e/2PACX-1vRKebbVROyBITii1GHHigPvGbFt0QdEIzk5oT1mZa16VN30MYH4wvhqd14Qllp_1SIz3wcqDdAP5Kx6/pub?w=960\u0026h=720)\n\nNote: The hystrix reporter is no longer supported (last supported version 1.0.0)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaslabs%2Ftalos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvaslabs%2Ftalos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaslabs%2Ftalos/lists"}