{"id":23038661,"url":"https://github.com/prosimcorp/rabbit-stalker","last_synced_at":"2026-03-20T00:18:21.461Z","repository":{"id":163471575,"uuid":"638223606","full_name":"prosimcorp/rabbit-stalker","owner":"prosimcorp","description":"Kubernetes operator to restart workloads under some conditions coming from RabbitMQ","archived":false,"fork":false,"pushed_at":"2024-08-13T13:30:29.000Z","size":187,"stargazers_count":33,"open_issues_count":0,"forks_count":4,"subscribers_count":4,"default_branch":"main","last_synced_at":"2024-08-13T16:09:53.555Z","etag":null,"topics":["gjson","kubernetes-operator","rabbitmq"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/prosimcorp.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-09T10:40:49.000Z","updated_at":"2024-08-13T13:27:41.000Z","dependencies_parsed_at":"2024-04-22T20:32:47.083Z","dependency_job_id":"8498ee40-3710-4e42-9c08-d71591d5d8ba","html_url":"https://github.com/prosimcorp/rabbit-stalker","commit_stats":null,"previous_names":["prosimcorp/rabbit-stalker"],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prosimcorp%2Frabbit-stalker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prosimcorp%2Frabbit-stalker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prosimcorp%2Frabbit-stalker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prosimcorp%2Frabbit-stalker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prosimcorp","download_url":"https://codeload.github.com/prosimcorp/rabbit-stalker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":229856706,"owners_count":18134923,"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":["gjson","kubernetes-operator","rabbitmq"],"created_at":"2024-12-15T18:20:05.340Z","updated_at":"2026-03-20T00:18:21.410Z","avatar_url":"https://github.com/prosimcorp.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rabbit-stalker\n\n\u003cimg src=\"https://github.com/prosimcorp/rabbit-stalker/raw/main/docs/img/logo.png\" width=\"100\"\u003e\n\nKubernetes Operator to get status related to specific queues on RabbitMQ. Depending on \nsome condition, it's able to restart or delete a Kubernetes workload\n\n![Kubernetes](https://img.shields.io/badge/Kubernetes-%3E%3D%201.18-brightgreen)\n![GitHub Release](https://img.shields.io/github/v/release/prosimcorp/rabbit-stalker)\n![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/prosimcorp/rabbit-stalker)\n[![Go Report Card](https://goreportcard.com/badge/github.com/prosimcorp/rabbit-stalker)](https://goreportcard.com/report/github.com/prosimcorp/rabbit-stalker)\n![image pulls](https://img.shields.io/badge/+2k-brightgreen?label=image%20pulls)\n![GitHub License](https://img.shields.io/github/license/prosimcorp/rabbit-stalker)\n\n![GitHub User's stars](https://img.shields.io/github/stars/prosimcorp?label=Prosimcorp%20Stars)\n![GitHub followers](https://img.shields.io/github/followers/prosimcorp?label=Prosimcorp%20Followers)\n\n----\n\n\u003e **ATTENTION:** From v1.1.0+ bundled Kubernetes deployment manifests are built and uploaded to the releases.\n\u003e We do this to keep them atomic between versions. Due to this, `deploy` directory will be removed from repository.\n\u003e Please, read [related section](#deployment)\n\n\u003e Hello there! a little advise: we crafted this wonderful project at [DocPlanner Tech](https://www.docplanner.tech/).\n\u003e We moved it to ProsimCorp to assure the continuity of the project. Are you willing to contribute?\n\n## Description\nThis project was motivated by a failure. Most famous PHP/Python libraries can establish connection with AMQP servers\nlike RabbitMQ. At some point, the connection is randomly broken, but the libraries are not throwing an exception to handle the\nfailure reconnecting, so in the end, a queue does not have consumers and the application does not know it \n(yes! like zombie workers)\n\nThis problem can be solved in many ways, but one of the solutions (from the infra team perspective) can be just \ngetting the credentials, doing some requests to RabbitMQ admin API, and depending on the number of consumers, just\nrestart the related workload. \n\nThis is exactly what this operator does, but with vitamins:\n* Includes [GJSON](https://github.com/tidwall/gjson) on conditions to look for a particular field in the huge JSON given by RabbitMQ\n* It supports giving credentials (or not) to access RabbitMQ\n* Support restarting several workload types: `Deployment` `DaemonSet` `StatefulSet` `Argo Rollout`\n\nAny discussion can be done on issues. Most interesting questions will be included on our [FAQ section](./README.md#faq-frequently-asked-questions)\n\n\u003e Hey, little hint here! you can debug GJSON patterns using the official [debugging website](https://gjson.dev/)\n\n## Getting Started\nYou’ll need a Kubernetes cluster to run against. You can use [KIND](https://sigs.k8s.io/kind) to get a local cluster for testing, or run against a remote cluster.\n**Note:** Your controller will automatically use the current context in your kubeconfig file (i.e. whatever cluster `kubectl cluster-info` shows).\n\n### Knowing the spec\nIn this section we will show you some examples that maybe helps you. Anyway, the complete working example \n[is located here](./config/samples)\n\n```yaml\napiVersion: rabbit-stalker.prosimcorp.com/v1alpha1\nkind: WorkloadAction\nmetadata:\n  name: workloadaction-sample\nspec:\n  synchronization:\n    time: 10s\n\n  # Configuration parameters to be able to connect with RabbitMQ\n  rabbitConnection:\n    url: \"https://your-server.rmq.cloudamqp.com\"\n    queue: \"your-queue-here\"\n    useRegex: true\n\n    # (Optional) Vhost can be set (or not) when searching queues using regex patterns,\n    # (Mandatory) Vhost is required for searches based on exact queue names.\n    vhost: \"shared\"\n\n    # (Optional) Credentials to authenticate against endpoint.\n    # If set, both are required\n    credentials:\n      username:\n        secretRef:\n          name: testing-secret\n          key: RABBITMQ_USERNAME\n\n          # (Optional) Getting credentials from other namespace is possible too\n          # When namespace is not defined, the same where this WorkloadAction CR is running will be used\n          namespace: default\n      password:\n        secretRef:\n          name: testing-secret\n          key: RABBITMQ_PASSWORD\n\n  # (Optional) Additional sources to get information from.\n  # This sources can be used on condition.value\n  additionalSources:\n    - apiVersion: apps/v1\n      kind: Deployment\n      name: testing-workload\n      namespace: default\n\n  # This is the condition that will trigger the execution of the action.\n  condition:\n    # The 'key' field admits dot notation, and it's covered by gjson\n    # Ref: https://github.com/tidwall/gjson\n    key: \"test\"\n\n    # Additional sources from 'additionalSources' field can be used here to craft complex values using the pattern:\n    # [index]{{ gjson }}\n    value: \"something\"\n\n  # Action to do with the workload when the condition is met\n  action: \"restart\"\n\n  # The workload affected by the action\n  workloadRef:\n    # It's possible to use core resources from Kubernetes\n    apiVersion: apps/v1\n    kind: Deployment\n    name: testing-workload\n    namespace: default\n\n    # Some custom resources can be used too\n    # apiVersion: argoproj.io/v1alpha1\n    # kind: Rollout\n    # name: testing-workload-argo-rollout\n    # namespace: default\n```\n\n#### Queue names/regex\n\nLet's start talking about how to look for queues inside your RabbitMQ. The first approach is just to define a static\nname for the `queue` and `vhost`. This will perform the action over the workload when the condition is met, as simple\nas follows:\n\n```yaml\napiVersion: rabbit-stalker.prosimcorp.com/v1alpha1\nkind: WorkloadAction\nmetadata:\n  name: workloadaction-sample\nspec:\n  # ...\n  rabbitConnection:\n    url: \"https://your-server.rmq.cloudamqp.com\"\n    vhost: \"shared\"\n    queue: \"your-queue-here\"\n    useRegex: false\n```\n\nBut what happens if you have some monolithic application that handle several queues at the same time? if several queues\nare managed by the same application instance (or pod inside Kubernetes), it's possible that your queues' names are defined\nfollowing a pattern that can be represented by a REGEX expression. In that case, you can use the following feature:\n\n```yaml\napiVersion: rabbit-stalker.prosimcorp.com/v1alpha1\nkind: WorkloadAction\nmetadata:\n  name: workloadaction-sample\nspec:\n  # ...\n  rabbitConnection:\n    url: \"https://your-server.rmq.cloudamqp.com\"\n    vhost: \"shared\"\n    queue: |-\n      ^your_monolith_prefix.(cz|es|it|pl|tr|pt|de)_incoming_events$\n    useRegex: true\n```\n\n\u003e ATTENTION! If the condition is met for some of them, the action will be immediately executed over the workload\n\n#### Conditions\n\nWhat can you do with the condition? As we said, it admits GJSON for dot notation, so basically, you can look for any\nfield inside the RabbitMQ response. As an example, take the following sample JSON\n\n\u003cdetails\u003e\n  \u003csummary\u003eClick me\u003c/summary\u003e\n\n  ```json\n    {\n      \"consumer_details\": [\n        {\n          \"arguments\": {},\n          \"channel_details\": {\n            \"connection_name\": \"xxx.xxx.xxx.xxx:51102 -\u003e xx.xx.xx.xxx:5671\",\n            \"name\": \"xxx.xxx.xxx.xxx:51102 -\u003e xx.xx.xx.xxx:5671 (1)\",\n            \"node\": \"rabbit@fancy-monk-sample-01\",\n            \"number\": 1,\n            \"peer_host\": \"xxx.xxx.xxx.xxx\",\n            \"peer_port\": 51102,\n            \"user\": \"sample-app\"\n          },\n          \"ack_required\": true,\n          \"active\": true,\n          \"activity_status\": \"up\",\n          \"consumer_tag\": \"xx\",\n          \"exclusive\": false,\n          \"prefetch_count\": 30,\n          \"queue\": {\n            \"name\": \"sample-app-queue\",\n            \"vhost\": \"shared\"\n          }\n        },\n        {\n          \"arguments\": {},\n          \"channel_details\": {\n            \"connection_name\": \"xxx.xxx.xxx.xxx:24752 -\u003e xx.xx.xx.xxx:5671\",\n            \"name\": \"xxx.xxx.xxx.xxx:51102 -\u003e xx.xx.xx.xxx:5671 (1)\",\n            \"node\": \"rabbit@fancy-monk-sample-03\",\n            \"number\": 1,\n            \"peer_host\": \"xxx.xxx.xxx.xxx\",\n            \"peer_port\": 24752,\n            \"user\": \"sample-app\"\n          },\n          \"ack_required\": true,\n          \"active\": true,\n          \"activity_status\": \"up\",\n          \"consumer_tag\": \"xx\",\n          \"exclusive\": false,\n          \"prefetch_count\": 30,\n          \"queue\": {\n            \"name\": \"sample-app-queue\",\n            \"vhost\": \"shared\"\n          }\n        }\n      ],\n      \"arguments\": {\n        \"x-dead-letter-exchange\": \"sample-app-toxic\"\n      },\n      \"auto_delete\": false,\n      \"backing_queue_status\": {\n        \"avg_ack_egress_rate\": 0.07669378573657928,\n        \"avg_ack_ingress_rate\": 0.14652897050941927,\n        \"avg_egress_rate\": 0.14652897050941927,\n        \"avg_ingress_rate\": 0.14652897050941927,\n        \"delta\": [\n          \"delta\",\n          \"undefined\",\n          0,\n          0,\n          \"undefined\"\n        ],\n        \"len\": 0,\n        \"mirror_seen\": 0,\n        \"mirror_senders\": 15,\n        \"mode\": \"default\",\n        \"next_seq_id\": 14376198,\n        \"q1\": 0,\n        \"q2\": 0,\n        \"q3\": 0,\n        \"q4\": 0,\n        \"target_ram_count\": \"infinity\"\n      },\n      \"consumer_capacity\": 1,\n      \"consumer_utilisation\": 1,\n      \"consumers\": 2,\n      \"deliveries\": [],\n      \"durable\": true,\n      \"effective_policy_definition\": {\n        \"ha-mode\": \"exactly\",\n        \"ha-params\": 2,\n        \"ha-sync-mode\": \"automatic\"\n      },\n      \"exclusive\": false,\n      \"exclusive_consumer_tag\": null,\n      \"garbage_collection\": {\n        \"fullsweep_after\": 65535,\n        \"max_heap_size\": 0,\n        \"min_bin_vheap_size\": 46422,\n        \"min_heap_size\": 233,\n        \"minor_gcs\": 2\n      },\n      \"head_message_timestamp\": null,\n      \"idle_since\": \"1995-01-01 23:28:09\",\n      \"incoming\": [],\n      \"memory\": 22824,\n      \"message_bytes\": 0,\n      \"message_bytes_paged_out\": 0,\n      \"message_bytes_persistent\": 0,\n      \"message_bytes_ram\": 0,\n      \"message_bytes_ready\": 0,\n      \"message_bytes_unacknowledged\": 0,\n      \"message_stats\": {\n        \"ack\": 14364988,\n        \"ack_details\": {\n          \"rate\": 0\n        },\n        \"deliver\": 14373410,\n        \"deliver_details\": {\n          \"rate\": 0\n        },\n        \"deliver_get\": 14373410,\n        \"deliver_get_details\": {\n          \"rate\": 0\n        },\n        \"deliver_no_ack\": 0,\n        \"deliver_no_ack_details\": {\n          \"rate\": 0\n        },\n        \"get\": 0,\n        \"get_details\": {\n          \"rate\": 0\n        },\n        \"get_empty\": 0,\n        \"get_empty_details\": {\n          \"rate\": 0\n        },\n        \"get_no_ack\": 0,\n        \"get_no_ack_details\": {\n          \"rate\": 0\n        },\n        \"publish\": 12085075,\n        \"publish_details\": {\n          \"rate\": 0\n        },\n        \"redeliver\": 4659,\n        \"redeliver_details\": {\n          \"rate\": 0\n        }\n      },\n      \"messages\": 0,\n      \"messages_details\": {\n        \"rate\": 0\n      },\n      \"messages_paged_out\": 0,\n      \"messages_persistent\": 0,\n      \"messages_ram\": 0,\n      \"messages_ready\": 0,\n      \"messages_ready_details\": {\n        \"rate\": 0\n      },\n      \"messages_ready_ram\": 0,\n      \"messages_unacknowledged\": 0,\n      \"messages_unacknowledged_details\": {\n        \"rate\": 0\n      },\n      \"messages_unacknowledged_ram\": 0,\n      \"name\": \"sample-app\",\n      \"node\": \"rabbit@fancy-monk-sample-01\",\n      \"operator_policy\": null,\n      \"policy\": \"HA\",\n      \"recoverable_slaves\": [\n        \"rabbit@fancy-monk-sample-03\"\n      ],\n      \"reductions\": 20884973878,\n      \"reductions_details\": {\n        \"rate\": 0\n      },\n      \"single_active_consumer_tag\": null,\n      \"slave_nodes\": [\n        \"rabbit@fancy-monk-sample-03\"\n      ],\n      \"state\": \"running\",\n      \"synchronised_slave_nodes\": [\n        \"rabbit@fancy-monk-sample-03\"\n      ],\n      \"type\": \"classic\",\n      \"vhost\": \"shared\"\n    }\n  ```\n\u003c/details\u003e\n\nSimple conditions are fine, so the next example will cover the case where you have 0 (zero) consumers\nand need to restart the application because of zombie processes previously mentioned:\n\n```yaml\napiVersion: rabbit-stalker.prosimcorp.com/v1alpha1\nkind: WorkloadAction\nmetadata:\n  name: workloadaction-sample\nspec:\n  # ...\n  condition:\n    key: consumers\n    value: \"0\"\n```\n\nIt's even possible to reach values from inside of arrays. But take care with it, the operator\ndoes not iterate on arrays. Instead, it looks for a specific string to compare the condition. \nFor doing the trick on GJSON, it's possible to set conditions in the way it returns a string as follows:\n\n```yaml\napiVersion: rabbit-stalker.prosimcorp.com/v1alpha1\nkind: WorkloadAction\nmetadata:\n  name: workloadaction-sample\nspec:\n  # ...\n  condition:\n    \n    # This will iterate on the array, but will retrieve the first match only\n    key: |-\n      consumer_details.#(channel_details.node==rabbit@fancy-monk-sample-01).channel_details.node\n      \n    # which is exactly this, so the condition is met\n    value: \"rabbit@fancy-monk-sample-01\"\n```\n\nAnyway, if you decide to get an array, then be sure you fit correctly the value on the condition to match:\n\n```yaml\napiVersion: rabbit-stalker.prosimcorp.com/v1alpha1\nkind: WorkloadAction\nmetadata:\n  name: workloadaction-sample\nspec:\n  # ...\n  condition:\n    \n    # This will return the whole array\n    key: |-\n      consumer_details.#.channel_details.node\n\n    # Again, is exactly this, so the condition is met\n    value: |\n      [\"rabbit@fancy-monk-sample-01\",\"rabbit@fancy-monk-sample-03\"]\n```\n\nAs a last trick, let's say you need to evaluate a condition where comparing if a number is greater/lower than your value.\nBy the moment this operation is not supported by the operator, but we plan to add this feature in a future release. \nThe awesome point is that supporting gjson for conditions is really helpful, so you can craft an equivalent:\n\n ```yaml\napiVersion: rabbit-stalker.prosimcorp.com/v1alpha1\nkind: WorkloadAction\nmetadata:\n  name: workloadaction-sample\nspec:\n  # ...\n  condition:\n    \n    # This will return the number ONLY if the number is higher than 8, other way it will return an empty string\n    key: |-\n      consumers|@values|#(\u003e8)\n\n    # What about comparing an empty string against another empty string? Exactly, you will meet the condition.\n    # This means for lower values than 8, the operator will restart the deployment\n    value: \"\"\n```\n\nUntil now, we have talked about the capabilities of the field `condition.key`, but `condition.value` is really \npowerful too. If `additionalSources` is filled, the content of these sources is available to craft complex values.\nAll you need to do, is to use the pattern `[\u003clist-index\u003e]{{ \u003cGJSON-expression\u003e }}` inside the `condition.value` field\nto use some value coming from a source.\n\n\u003e Hey! Sources is a list composed by `workloadRef` + `additionalSources`. This means position [0] is reserved for \n\u003e the target workload and higher positions starting from [1] will be filled with additionalSources\n\nLet's see an example:\n\n```yaml\napiVersion: rabbit-stalker.prosimcorp.com/v1alpha1\nkind: WorkloadAction\nmetadata:\n  name: workloadaction-sample\nspec:\n  # ...\n  condition:\n    \n    # string literal example\n    key: rabbit@fancy-monk-sample-01\n\n    # This will take the value of an annotation named 'node' coming from workloadRef object\n    value: \"[0]{{ metadata.annotations.node }}\"\n```\n\nYou can craft a value adding some string literals at any side of the pattern used to search. The structure will be \nreplaced by the value found in the source:\n\n```yaml\napiVersion: rabbit-stalker.prosimcorp.com/v1alpha1\nkind: WorkloadAction\nmetadata:\n  name: workloadaction-sample\nspec:\n  # ...\n  condition:\n    \n    # string literal example\n    key: rabbit@fancy-monk-sample-01\n\n    # This will take the value of an annotation named 'node' coming from the resource in first position at sources list.\n    # Imagine the value for this annotation is '1'\n    # The '[0]{{ metadata.annotations.node }}' string will be replaced before the comparison, so the final value will \n    # be 'rabbit@fancy-monk-sample-01'\n    value: \"rabbit@fancy-monk-sample-0[0]{{ metadata.annotations.node }}\"\n```\n\nAs final feature you can use the patterns as many times as needed to build the final string:\n\n```yaml\napiVersion: rabbit-stalker.prosimcorp.com/v1alpha1\nkind: WorkloadAction\nmetadata:\n  name: workloadaction-sample\nspec:\n  # ...\n  condition:\n    \n    # string literal example\n    key: rabbit@fancy-monk-sample-03\n\n    # This will take the value from multiples sources in the source list\n    # The final value will be 'rabbit@fancy-monk-sample-03' for example\n    value: \"rabbit@[1]{{ cluster.name }}-0[0]{{ metadata.annotations.node }}\"\n```\n\n### Running on the cluster\n\n#### Easy way (recommended)\n\nWe have designed the deployment of this project to allow remote deployment using Kustomize. This way it is possible\nto use it with a GitOps approach, using tools such as ArgoCD or FluxCD. Just make a Kustomization manifest referencing\nthe tag of the version you want to deploy as follows:\n\n```yaml\napiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n- https://github.com/prosimcorp/rabbit-stalker/releases/download/v1.1.0/bundle.yaml\n```\n\n\u003e Notice you can change `v1.1.0` to match some specific release, for example: `v1.x.x`\n\n\u003e 🧚🏼 **Hey, listen! If you prefer to deploy using Helm, go to the [Helm registry](https://github.com/prosimcorp/helm-charts)**\n\n#### Hard way\n\nThis way is for passionate learners, but not recommended in production (too manual intervention 🛠️).  \n\nUnder the hood, this is executing `kubectl apply -f \u003csome-directories\u003e`\n\n1. Install Instances of Custom Resources:\n\n```sh\nkubectl apply -f config/samples/\n```\n\n2. Build and push your image to the location specified by `IMG`:\n\n```sh\nmake docker-build docker-push IMG=ghcr.io/prosimcorp/rabbit-stalker:tag\n```\n\n3. Deploy the controller to the cluster with the image specified by `IMG`:\n\n```sh\nmake deploy IMG=ghcr.io/prosimcorp/rabbit-stalker:tag\n```\n\n### Uninstall CRDs\nTo delete the CRDs from the cluster:\n\n```sh\nmake uninstall\n```\n\n### Undeploy controller\nUnDeploy the controller from the cluster:\n\n```sh\nmake undeploy\n```\n\n## Contributing\nThis project is done on top of [Kubebuilder](https://github.com/kubernetes-sigs/kubebuilder), so read about that project\nbefore collaborating. Of course, we are open to external collaborations for this project. For doing it you must fork the\nrepository, make your changes to the code and open a PR. The code will be reviewed and tested (always)\n\n\u003e We are developers and hate bad code. For that reason we ask you the highest quality on each line of code to improve\n\u003e this project on each iteration.\n\n### How it works\nThis project aims to follow the Kubernetes [Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/).\n\nIt uses [Controllers](https://kubernetes.io/docs/concepts/architecture/controller/),\nwhich provide a reconcile function responsible for synchronizing resources until the desired state is reached on the cluster.\n\n### Test It Out\n1. Install the CRDs into the cluster:\n\n```sh\nmake install\n```\n\n2. Run your controller (this will run in the foreground, so switch to a new terminal if you want to leave it running):\n\n```sh\nmake run\n```\n\n**NOTE:** You can also run this in one step by running: `make install run`\n\n### Modifying the API definitions\nIf you are editing the API definitions, generate the manifests such as CRs or CRDs using:\n\n```sh\nmake manifests\n```\n\n**NOTE:** Run `make --help` for more information on all potential `make` targets\n\nMore information can be found via the [Kubebuilder Documentation](https://book.kubebuilder.io/introduction.html)\n\n## FAQ (Frequently Asked Questions)\n\n### Which API endpoints are supported?\nBy the moment, only `/api/queues/vhost/name` is supported. This is because it's the most interesting for our use case.\nBut we will add capabilities to let you choose the endpoint in next releases.\n\n[huge list of RabbitMQ Admin API endpoints](https://rawcdn.githack.com/rabbitmq/rabbitmq-server/v3.11.15/deps/rabbitmq_management/priv/www/api/index.html)\n\n## License\n\nCopyright 2023.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprosimcorp%2Frabbit-stalker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprosimcorp%2Frabbit-stalker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprosimcorp%2Frabbit-stalker/lists"}