{"id":18644189,"url":"https://github.com/indix/abel","last_synced_at":"2025-11-05T02:30:21.352Z","repository":{"id":146494341,"uuid":"92500527","full_name":"indix/abel","owner":"indix","description":"Business stats collection/aggregation ","archived":false,"fork":false,"pushed_at":"2018-02-07T09:15:34.000Z","size":19,"stargazers_count":1,"open_issues_count":3,"forks_count":0,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-12-27T11:20:27.195Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Scala","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/indix.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":"2017-05-26T10:35:28.000Z","updated_at":"2018-03-21T02:33:56.000Z","dependencies_parsed_at":"2023-07-14T05:15:28.648Z","dependency_job_id":null,"html_url":"https://github.com/indix/abel","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indix%2Fabel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indix%2Fabel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indix%2Fabel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indix%2Fabel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/indix","download_url":"https://codeload.github.com/indix/abel/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239449339,"owners_count":19640529,"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":[],"created_at":"2024-11-07T06:10:28.966Z","updated_at":"2025-11-05T02:30:21.319Z","avatar_url":"https://github.com/indix.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"Abel - Aggregate stats from anywhere\n------------------------------------\n\nHow it works\n------------\n\nAbel client emits metrics to a kafka (0.10) topic. Each metric has a *key* and a *value*. Every key has a name, tags and timestamp. \nA value is of aggregate type. Aggregate is anything which (sort of commutative semigroup) can be folded with another aggregate of same type.\n \nWhat abel consumer does is very simple, it regularly reads from kafka queue and merges all those metrics with same (exactly same) key and stores it to underlying rocksdb.\n\n\nTo use\n------\n\nAdd the library to build.sbt (published to sonatype) \n\n`\"com.indix\" %% \"abel-core\" % \"1.1.8\"`\n\nAnd the client emission of metrics looks like, \n\n``` \nval client = AbelClient(AbelConfig(\"\u003chost\u003e\", \"\u003ctopic\u003e\"))\nclient.send(Metric(Key(name = \"unique-upcs\"), UniqueCount(product.getUpc)))\n```\n\nAbel currently supports\n\n `Count` - Exact count of occurences\n \n `UniqueCount` - Approximate counts using HLL+\n \n `Average` - Exact average  \n \n `Pair` - Take 2 aggregates and club them together\n \n `By` - Take enumerable number of key and aggregate of same type (Very useful to capture aggregate for various statuses which are queried together)\n \nTo query \n\n`http://\u003cendpoint\u003e/metrics?name=\u003cname\u003e\u0026tags=\u003ctag1\u003e\u0026tags=\u003ctag2\u003e\u0026duration=\u003cduration\u003e\u0026startTime=\u003cstartTime\u003e\u0026endTime=\u003cendTime\u003e`\n\nIf the metric is emitted with tags, it has to be queried with tags (Work in progress to add explosion rules to also aggregate without tags)\n\nTODO:\n----\n\n- Support for percentiles with QDigest.\n- Auto rollups for coarser timestamps.\n- Integrate with distributed KV store.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findix%2Fabel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Findix%2Fabel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findix%2Fabel/lists"}