{"id":19704693,"url":"https://github.com/datastax/burnell","last_synced_at":"2025-10-14T08:14:40.999Z","repository":{"id":41873495,"uuid":"323942107","full_name":"datastax/burnell","owner":"datastax","description":"A proxy to Pulsar cluster","archived":false,"fork":false,"pushed_at":"2023-03-31T11:26:21.000Z","size":394,"stargazers_count":6,"open_issues_count":3,"forks_count":7,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-29T14:37:05.510Z","etag":null,"topics":["proxy","pulsar"],"latest_commit_sha":null,"homepage":"","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/datastax.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":"2020-12-23T15:49:41.000Z","updated_at":"2022-08-23T02:52:06.000Z","dependencies_parsed_at":"2024-06-21T19:13:33.607Z","dependency_job_id":"e7cb38ae-2d56-47b3-901e-b9c6b811939f","html_url":"https://github.com/datastax/burnell","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/datastax/burnell","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastax%2Fburnell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastax%2Fburnell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastax%2Fburnell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastax%2Fburnell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/datastax","download_url":"https://codeload.github.com/datastax/burnell/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastax%2Fburnell/sbom","scorecard":{"id":324807,"data":{"date":"2025-08-11","repo":{"name":"github.com/datastax/burnell","commit":"e2c47578a7f4a9433f15e95f23b404015afbe0bc"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":2,"reason":"Found 8/30 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/go.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/datastax/burnell/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/datastax/burnell/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/datastax/burnell/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/datastax/burnell/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/datastax/burnell/go.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:4","Warn: containerImage not pinned by hash: Dockerfile:22: pin your Docker image by updating alpine:3.14 to alpine:3.14@sha256:0f2d5c38dd7a4f4f733e688e3a6733cb5ab1ac6e3cb4603a5dd564e5bfb80eed","Warn: containerImage not pinned by hash: dockerfiles/logserver/Dockerfile:4","Warn: containerImage not pinned by hash: dockerfiles/logserver/Dockerfile:15: pin your Docker image by updating alpine to alpine@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1","Warn: goCommand not pinned by hash: Dockerfile:13","Warn: goCommand not pinned by hash: .github/workflows/go.yml:32","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 containerImage dependencies pinned","Info:   0 out of   2 goCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 13 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"28 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2023-2409 / GHSA-6294-6rgp-fr7r / GHSA-mhpq-9638-x6pw","Warn: Project is vulnerable to: GO-2025-3553 / GHSA-mh63-6h87-95cp","Warn: Project is vulnerable to: GO-2024-2947 / GHSA-v6v8-xj6m-xwqh","Warn: Project is vulnerable to: GO-2022-0968 / GHSA-gwc9-m7rh-j2ww","Warn: Project is vulnerable to: GO-2021-0356 / GHSA-8c26-wmh5-6g9v","Warn: Project is vulnerable to: GO-2024-2961","Warn: Project is vulnerable to: GO-2023-2402 / GHSA-45x7-px36-x8w8","Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77","Warn: Project is vulnerable to: GO-2022-0288","Warn: Project is vulnerable to: GO-2022-0969 / GHSA-69cg-p879-7622","Warn: Project is vulnerable to: GO-2022-1144 / GHSA-xrjj-mj9h-534m","Warn: Project is vulnerable to: GO-2023-1571 / GHSA-vvpx-j8f3-3w6h","Warn: Project is vulnerable to: GO-2023-1988 / GHSA-2wrh-6pvc-2jm9","Warn: Project is vulnerable to: GO-2023-2102 / GHSA-4374-p667-p6c8","Warn: Project is vulnerable to: GO-2023-2153 / GHSA-m425-mq94-257g / GHSA-qppj-fm5r-hxr3","Warn: Project is vulnerable to: GO-2024-2687 / GHSA-4v7x-pqxf-cx7m","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2025-3488 / GHSA-6v2p-p543-phr9","Warn: Project is vulnerable to: GO-2022-0493 / GHSA-p782-xgp4-8hr8","Warn: Project is vulnerable to: GO-2021-0113 / GHSA-ppp9-7jff-5vj2","Warn: Project is vulnerable to: GO-2022-1059 / GHSA-69ch-w2m2-3vjp","Warn: Project is vulnerable to: GO-2024-2611 / GHSA-8r3f-844c-mc37","Warn: Project is vulnerable to: GO-2022-0603 / GHSA-hp87-p4gw-j4gq","Warn: Project is vulnerable to: GO-2024-2748 / GHSA-33c5-9fx5-fvjm","Warn: Project is vulnerable to: GO-2021-0064 / GHSA-8cfg-vx93-jvxw"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T02:11:27.100Z","repository_id":41873495,"created_at":"2025-08-18T02:11:27.101Z","updated_at":"2025-08-18T02:11:27.101Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279018305,"owners_count":26086334,"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","status":"online","status_checked_at":"2025-10-14T02:00:06.444Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["proxy","pulsar"],"created_at":"2024-11-11T21:24:06.170Z","updated_at":"2025-10-14T08:14:40.976Z","avatar_url":"https://github.com/datastax.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Burnell\n\nBurnell is a proxy in a Pulsar cluster. It offers the following features:\n\n- [x] Generate Pulsar JWT that is compatible with Pulsar Java based authentication and authorization\n- [x] Authentication and authorization based on Pulsar JWT\n- [x] Proxy the entire set of [Pulsar Admin REST API](https://pulsar.apache.org/admin-rest-api/)\n- [x] Tenant based authorization over Pulsar Admin REST API\n- [x] Expose tenant Prometheus metrics on the brokers\n- [x] Interface to query function logs\n- [x] Provides statistics with pagination\n- [x] Pulsar Beam webhook and topic management REST API that enforces tenant based authorization\n- [x] Tenants and tenant's namespace usage metering, total bytes and message in and out\n- [x] Initializer mode to configure Pulsar Kubernetes cluster TLS keys and JWT\n- [x] Repair Pulsar Kubernetes cluster TLS keys and JWT\n- [x] It provides Pulsar websocket proxy that sets token in the http parameter to http header\n## Process running mode\n```\nburnell -mode proxy\nburnell -mode init\nburnell -mode healer\n```\nThe default process mode is `proxy`\n\n## Rest API\n\n### Generate JWT token\nTo generate a JWT token, a super user role's JWT must be specified in the `Authorization` header as `Bearer` token in the `GET` method with this route.\n\n```\n/subject/{user-subject}\n```\nPermitted characters for user subject are alphanumeric and hyphen.\n\nToken signing method and expiry duration can be passed as query parameters. The default settings are RS256 and no expiry.\n```\n/subject/{user-subject}?exp=\u003cduration\u003e\u0026alg=\u003csignMethod\u003e\n```\nThe supported duration is d, y, and [ns, us, µs, ms, s, m, h defined by Go time package](https://golang.org/pkg/time/#ParseDuration)\nThe supported signing method is specified [here]()\n\nGenerated JWT can be validated by Pulsar under the same encryption key scheme.\n\n### Tenant function log retrieval\nIt provides a rolling log crawler from the function worker.\n\n#### Function log retrieval endpoint and query parameters\nBy default, the endpoint will return the last few lines of the latest log.\n```\n/function-logs/{tenant}/{namespace}/{function-name}\n/function-logs/{tenant}/{namespace}/{function-name}/{instance}\n```\nDefault instance is 0 if not specified.\n\nExample -\n```\n/function-logs/ming-luo/namespace2/for-monitor-function\n```\n\nTo retrieve earlier logs or newer logs, use query parameters `backwardpos` or `forwardpos` that indicates the byte index in the log file. These values can be obtained from the response body of the last query, under these attributes `BackwardPosition` and `ForwardPosition`. We run an algorithm to return a few complete lines. It is important to use the exact positions in the response body to have those complete log lines. An arbitary position will result truncated logs.\n```\n/function-logs/{tenant}/{namespace}/{function-name}?backwardpos=45000\n```\nIt is client's responsibility to keep track of the log file traverse position in both backward and forward position. The number must be a positive number. 0 value of `backwardpos` or `forwardpos` resets the `backwardpos` to EOF of the log file that displays the last few lines.\n\nSince the algorithm always returns a few complete logs, the payload size can vary. Usually the size ranges from one or two kilobytes.\n```\n{\n    \"BackwardPosition\": 47987,\n    \"ForwardPosition\": 49427,\n    \"Logs\": \"[2020-03-30 12:31:57 +0000] [ERROR] log.py: Traceback (most recent call last):\\n[2020-03-30 12:31:57 +0000] [ERROR] log.py:   File \\\"/pulsar/instances/python-instance/python_instance_main.py\\\", line 211, in \u003cmodule\u003e\\n[2020-03-30 12:31:57 +0000] [ERROR] log.py: main()\\n[2020-03-30 12:31:57 +0000] [ERROR] log.py:   File \\\"/pulsar/instances/python-instance/python_instance_main.py\\\", line 192, in main\\n[2020-03-30 12:31:57 +0000] [ERROR] log.py: pyinstance.run()\\n[2020-03-30 12:31:57 +0000] [ERROR] log.py:   File \\\"/pulsar/instances/python-instance/python_instance.py\\\", line 189, in run\\n[2020-03-30 12:31:57 +0000] [ERROR] log.py: **consumer_args\\n\"\n}\n```\n\n#### Function worker Id per function instances\nTo troubleshoot function instance and its worker Id mapping, the `function-status` endpoint offers insights of such mapping and function status.\n```\n/function-status/{tenant}/{namespace}/{function-name}\n```\n\n### Tenant topics statistics collector\n\n#### Topic stats endpoint\nMETHOD: GET\n```\n/stats/topics/{tenant}?limit=10\u0026offset=0\n```\nA list of required topics can be specified in the request body. This feature is useful since this endpoint usually retrieves topics from a local cache that has 5 seconds polling interval, the mandatory list will directly query these topics against the broker admin REST endpoint.\n```\n{\"tenant\":\"ming-luo\",\"sessionId\":\"reserverd for snapshot iteration\",\"offset\":1,\"total\":1,\"data\":{\"persistent://ming-luo/namespace2/test-topic3\":{\"averageMsgSize\":0,\"backlogSize\":0,\"msgRateIn\":0,\"msgRateOut\":0,\"msgThroughputIn\":0,\"msgThroughputOut\":0,\"pendingAddEntriesCount\":0,\"producerCount\":0,\"publishers\":[],\"replication\":{},\"storageSize\":0,\"subscriptions\":{\"mysub\":{\"consumers\":[],\"msgBacklog\":0,\"msgRateExpired\":0,\"msgRateOut\":0,\"msgRateRedeliver\":0,\"msgThroughputOut\":0,\"numberOfEntriesSinceFirstNotAckedMessage\":1,\"totalNonContiguousDeletedMessagesRange\":0,\"type\":\"Exclusive\"}}}}}\n```\n\n### Grouping topics under namespace per tenant\n```\n/admin/v2/topics/{tenant}\n```\n\n### Tenant and namespace level usage metering\n#### Tenant usage metering endpoint\nReturns all tenants' usage metering data including the number of messages and total bytes in and out, and backlog size\nSuperuser token is required\n```\n/tenantsusage\n```\n#### Tenant usage metering endpoint\nReturns individual namespaces' usage metering data including the number of messages and total bytes in and out, and backlog size, under a tenant\nSuperuser token or tenant token is required\n```\n/namespacesusage/{tenant}\n```\n\n### Tenant CRUD\nIt provides tenant policy management. Tenant policy specifies message retention policy, feature codes, and limits for namespaces, producers and consumers.\n#### Resource endpoint\n```\n/k/tenant/{tenant}\n```\n`{tenant}`, tenant name, must be specified for all REST calls.\n\n#### Support HTTP Method \n`http.MethodGet, http.MethodDelete, http.MethodPost`\n\n#### Header\n\n`-H \"Authorization: Bearer $SUPERROLE_TOKEN\"`\nSuperrole token is required.\n\n#### Create a tenant with a plan \n\n```\n-X POST\n-H \"Authorization: Bearer $SUPERROLE_TOKEN\" \\\n--data '{\"PlanType\": \"free\"}'\n```\nExample:\n```\n$ curl -v -X POST -H \"Authorization: Bearer $MY_TOKEN\" -d '{\"planType\": \"free\"}' \"http://localhost:8964/k/tenant/ming-luo\"\n{\"name\":\"ming-luo\",\"tenantStatus\":1,\"org\":\"\",\"users\":\"\",\"planType\":\"free\",\"updatedAt\":\"2020-04-17T13:39:09.315634076-04:00\",\"policy\":{\"name\":\"free\",\"numOfTopics\":5,\"numOfNamespaces\":1,\"messageHourRetention\":48,\"messageRetention\":172800000000000,\"numofProducers\":3,\"numOfConsumers\":5,\"functions\":1,\"featureCodes\":\"\"},\"audit\":\"initial creation,\"}\n```\n#### Update a tenant with a plan\nUpdate can upgrade or downgrade plan or specify individual plan attributes and feature code.\n\n`policy.messageHourRetention` (integer) is the data retention period. `policy.messageRetention` is reserved internally for Golang retention in nano-seconds.\n\n```\n-X POST\n-H \"Authorization: Bearer $SUPERROLE_TOKEN\" \\\n--data '{\"PlanType\": \"free\", \"policy\":{\"name\":\"free\",\"numOfTopics\":5,\"numOfNamespaces\":1,\"messageRetention\":172800000000000,\"numofProducers\":3,\"numOfConsumers\":5,\"functions\":3,\"featureCodes\":\"broker-metrics\"}}'\n```\n```\n$ curl -v -X POST -H \"Authorization: Bearer $MY_TOKEN\" -d '{\"planType\": \"free\", \"org\": \"\", \"users\": \"\", policy\":{\"name\":\"free\",\"numOfTopics\":5,\"numOfNamespaces\":1,\"messageHourRetention\":120,\"numofProducers\":3,\"numOfConsumers\":5,\"functions\":5,\"featureCodes\":1},\"audit\":\"enable prometheus metrics\"}' \"http://localhost:8964/k/tenant/ming-luo\"\n{\"name\":\"ming-luo\",\"tenantStatus\":1,\"org\":\"\",\"users\":\"\",\"planType\":\"free\",\"updatedAt\":\"2020-04-17T13:44:40.494262281-04:00\",\"policy\":{\"name\":\"free\",\"numOfTopics\":5,\"numOfNamespaces\":1,\"messageHourRetention\":120,\"messageRetention\":432000000000000,\"numofProducers\":3,\"numOfConsumers\":5,\"functions\":5,\"featureCodes\":\"broker-metrics\"},\"audit\":\"initial creation,,enable prometheus metrics\"}\n```\n#### Get a tenant\n\n```\n-X GET\n-H \"Authorization: Bearer $SUPERROLE_TOKEN\" \\\n```\nExample:\n```\n$ curl -H \"Authorization: Bearer $MY_TOKEN\" \"http://localhost:8964/k/tenant/ming-luo\"\n{\"name\":\"ming-luo\",\"tenantStatus\":1,\"org\":\"\",\"users\":\"\",\"planType\":\"free\",\"updatedAt\":\"2020-04-17T13:39:09.315634076-04:00\",\"policy\":{\"name\":\"free\",\"numOfTopics\":5,\"numOfNamespaces\":1,\"messageHourRetention\":48,\"messageRetention\":172800000000000,\"numofProducers\":3,\"numOfConsumers\":5,\"functions\":1,\"featureCodes\":\"\"},\"audit\":\"initial creation,\"}\n```\n#### DELETE a tenant with a plan \n\n```\n-X DELETE\n-H \"Authorization: Bearer $SUPERROLE_TOKEN\" \\\n```\nExample:\n```\n$ curl -X DELETE -H \"Authorization: Bearer $MY_TOKEN\" \"http://localhost:8964/k/tenant/ming-luo\"\n{\"name\":\"ming-luo\",\"tenantStatus\":1,\"org\":\"\",\"users\":\"\",\"planType\":\"free\",\"updatedAt\":\"2020-04-17T13:39:09.315634076-04:00\",\"policy\":{\"name\":\"free\",\"numOfTopics\":5,\"numOfNamespaces\":1,\"messageHourRetention\":48,\"messageRetention\":172800000000000,\"numofProducers\":3,\"numOfConsumers\":5,\"functions\":1,\"featureCodes\":\"\"},\"audit\":\"initial creation,\"}\n```\n\n### Tenant based Prometheus Metrics\nExpose `\\pulsarmetrics` endpoint with Pulsar prometheus metrics pertaining to the tenant. The tenant is identified based on the Authorization token.\n\nIf a superuser token is supplied, all the federated prometheus metrics will be returned.\n\n#### Scrape job requirement\nScrape config offers `honor_labels: true` to honor the existing labels. It is optional because `exported_` labels can be used to identify metrics. But, the scrape job should set `honor_timestamps: true` to retain the original timestamp. Here is the [detail scrape config description](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)\n\n### Pulsar Admin Rest API Proxy\n\n#### Pulsar Admin REST API\n[Pulsar Admin REST API](https://pulsar.apache.org/admin-rest-api/) is mapped with the exact same routes under `\\admin\\v2` and `admin\\v3` for functions, sinks, and sources. The exception is `\\broker-stats`.\n\n`/admin/v2/broker-stats` response aggregates all brokers' statistics. It returns brokers in the order of broker name, therefore it individual broker json object similar to pagination.\n\n```\n-X GET\n-H \"Authorization: Bearer $SUPERROLE_TOKEN\"\n\"https://\u003cpulsar proxy server fqdn\u003e:8964/admin/v2/broker-stats/metrics?limit=2\u0026offset=0\"\n```\n\n`limit=0` will return all brokers in a single call. \n\nWithout limit and offset query parameters, it will return the very first broker in the order broker's alphanumeric order.\n\nThe new offset and total will be returned in the response body.\n\n```\n{\"total\":1,\"offset\":1,\"data\":[{\"broker\":\"10.244.1.221:8080\",\"data\":[{\"...\n```\n\n### Docker build\n\n```\ndocker build -t burnell .\n```\n\n### Docker for logcollector\n\n```\ndocker build -t burnell-logcollector -f ./dockerfiles/logserver/Dockerfile .\ndocker run --rm -it -p 4042:4042 -e \"LogServerPort=:4042\" --name burnell-logcollector burnell-logcollector:latest\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatastax%2Fburnell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdatastax%2Fburnell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatastax%2Fburnell/lists"}