{"id":19669804,"url":"https://github.com/baverman/hisser","last_synced_at":"2026-03-02T07:02:34.986Z","repository":{"id":32858340,"uuid":"117445072","full_name":"baverman/hisser","owner":"baverman","description":"Fast TSDB backend for graphite","archived":false,"fork":false,"pushed_at":"2024-05-17T11:03:24.000Z","size":444,"stargazers_count":15,"open_issues_count":2,"forks_count":3,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-01-28T11:42:30.984Z","etag":null,"topics":["carbon","graphite","python","tsdb","whisper"],"latest_commit_sha":null,"homepage":"","language":"Python","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/baverman.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","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":"2018-01-14T16:06:04.000Z","updated_at":"2025-11-01T16:40:41.000Z","dependencies_parsed_at":"2023-10-20T18:18:55.072Z","dependency_job_id":"a193aa5c-bb5b-4f5b-b198-83ff90f6bead","html_url":"https://github.com/baverman/hisser","commit_stats":{"total_commits":93,"total_committers":1,"mean_commits":93.0,"dds":0.0,"last_synced_commit":"ca820e40ab6e19517e90455e96239aa00e951740"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/baverman/hisser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baverman%2Fhisser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baverman%2Fhisser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baverman%2Fhisser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baverman%2Fhisser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/baverman","download_url":"https://codeload.github.com/baverman/hisser/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baverman%2Fhisser/sbom","scorecard":{"id":227413,"data":{"date":"2025-08-11","repo":{"name":"github.com/baverman/hisser","commit":"04fc60a03982b7d310cff34f94ecffe5693e385f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.5,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","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":"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":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: hisser/regexp.so:1"],"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":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":"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":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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: containerImage not pinned by hash: ci/Dockerfile.test:2","Warn: containerImage not pinned by hash: docker/Dockerfile:3","Warn: containerImage not pinned by hash: docker/Dockerfile:11","Warn: containerImage not pinned by hash: docker/Dockerfile:29","Warn: pipCommand not pinned by hash: ci/Dockerfile.test:5","Warn: pipCommand not pinned by hash: ci/Dockerfile.test:7","Warn: pipCommand not pinned by hash: docker/Dockerfile:18","Warn: pipCommand not pinned by hash: docker/Dockerfile:21","Warn: pipCommand not pinned by hash: docker/Dockerfile:24","Info:   0 out of   4 containerImage dependencies pinned","Info:   0 out of   5 pipCommand 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":"Vulnerabilities","score":0,"reason":"23 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-190 / GHSA-2gwj-7jmv-h26r","Warn: Project is vulnerable to: PYSEC-2022-1 / GHSA-53qw-q765-4fww","Warn: Project is vulnerable to: PYSEC-2021-98 / GHSA-68w8-qjq3-2gfm","Warn: Project is vulnerable to: PYSEC-2022-20 / GHSA-6cw3-g6wv-c2xv","Warn: Project is vulnerable to: GHSA-7xr5-9hcq-chf9","Warn: Project is vulnerable to: PYSEC-2022-2 / GHSA-8c5j-9r9f-c6w8","Warn: Project is vulnerable to: GHSA-8x94-hmjh-97hq","Warn: Project is vulnerable to: PYSEC-2022-19 / GHSA-95rw-fx8r-36v6","Warn: Project is vulnerable to: PYSEC-2020-34 / GHSA-fr28-569j-53c4","Warn: Project is vulnerable to: PYSEC-2021-9 / GHSA-fvgf-6h6h-3322","Warn: Project is vulnerable to: PYSEC-2022-3 / GHSA-jrh2-hc4r-7jwx","Warn: Project is vulnerable to: PYSEC-2020-33 / GHSA-m6gj-h9gm-gw44","Warn: Project is vulnerable to: PYSEC-2021-99 / GHSA-p99v-5w3c-jqq9","Warn: Project is vulnerable to: PYSEC-2021-8 / GHSA-qm57-vhq3-3fwf","Warn: Project is vulnerable to: GHSA-rrqc-c2jx-6jgv","Warn: Project is vulnerable to: PYSEC-2021-7 / GHSA-rxjp-mfm9-w4wr","Warn: Project is vulnerable to: PYSEC-2021-439 / GHSA-v6rh-hp5x-86rv","Warn: Project is vulnerable to: PYSEC-2022-191 / GHSA-w24h-v9qh-8gxj","Warn: Project is vulnerable to: PYSEC-2021-6 / GHSA-xgxc-v2qg-chmh","Warn: Project is vulnerable to: GHSA-3c5x-4hvx-qrrr","Warn: Project is vulnerable to: GHSA-m973-4vpc-x43c","Warn: Project is vulnerable to: GHSA-q99p-78hp-xg5c","Warn: Project is vulnerable to: GHSA-vcph-37mh-fqrh"],"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-17T04:05:18.653Z","repository_id":32858340,"created_at":"2025-08-17T04:05:18.654Z","updated_at":"2025-08-17T04:05:18.654Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29994618,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T01:47:34.672Z","status":"online","status_checked_at":"2026-03-02T02:00:07.342Z","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":["carbon","graphite","python","tsdb","whisper"],"created_at":"2024-11-11T17:01:16.404Z","updated_at":"2026-03-02T07:02:34.961Z","avatar_url":"https://github.com/baverman.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Hisser\n======\n\n|travis| |coverage| |pyver|\n\n.. |travis| image:: https://travis-ci.org/baverman/hisser.svg?branch=master\n   :target: https://travis-ci.org/baverman/hisser\n\n.. |coverage| image:: https://img.shields.io/badge/coverage-100%25-brightgreen.svg\n\n.. |pyver| image:: https://img.shields.io/badge/python-3.5%2C_3.6-blue.svg\n\n\nTime series database, backend for graphite, fast alternative to carbon + whisper.\n\nFeatures:\n\n* Low disk usage (IOPS) for metric store, it depends from actual data\n  volumes instead of a number of metrics (in case of whisper). Hisser\n  was designed to process million of metrics.\n\n* Fast queries. Optimized query parsing and response rendering (~3x\n  boost comparing with vanilla graphite-web).\n\n* Tag support.\n\n* Drop-in replacement for whisper + carbon.\n\n* Smart ``alias`` function which can expand ``{tag}`` and ``{0}`` (name part)\n  variables.\n\n* 100% test coverage.\n\n\n.. contents:: **Table of Contents**\n\n\nConfiguration\n-------------\n\nDefault options and documentation for them can be read in\n`default config`_.\n\n.. _default config: hisser/defaults.py\n\nYou can create custom configuration file and use ``--config`` cli option or\nuse ``HISSER_*`` environment variables to override default values.\nFor example ``HISSER_DATA_DIR`` will set ``DATA_DIR`` configuration\nparameter.\n\n\nRun\n---\n\nSimplest way is to use official `docker image`::\n\n   docker run --rm -u $(id -u):$(id -g) -p 2003:2003 -p 8080:8080 -v /path/to/data:/data baverman/graphite-hisser\n\nPort `2003` is a graphite protocol. `8080` is graphite API, you can point\ngrafana to it. In production you don't need 8080 port accessible from\nexternal network. In this case you should use separate docker network\nand map 2003 port only or use ``--network host`` and specify ``GRAPHITE_BIND=127.0.0.1:8080``\nenvvar.\n\nIMPORTANT! To use tag support with grafana you need grafana 5.x and set graphite\nversion ``1.1.x`` in storage settings.\n\nNote: for grafana you can use tiny `grafana image`_.\n\n.. _docker image: https://hub.docker.com/r/baverman/graphite-hisser/\n.. _grafana image: https://hub.docker.com/r/baverman/grafana/\n\n\nInternals\n---------\n\nHisser is a very simple metric storage. All heavy work is done by `lmdb`_.\nMetrics are organized into blocks (lmdb databases). Each block\ncontains all metrics and their data for particular amount of time. Blocks\nwith same resolution are grouped under corresponding directory:\n\nExample data layout:\n\n::\n\n   data_dir/\n   ├── 300  # resolution (1 data point every 5-minute)\n   │   ├── 1533990300.519.hdb   # timestamp-of-block-start.number-of-points.hdb\n   │   ├── 1534621800.191.hdb\n   │   ├── 1534679100.48.hdb\n   │   └── blocks.state         # lock file\n   ├── 60   # resolution (1 data point every minute)\n   │   ├── 1534621920.700.hdb\n   │   ├── 1534663920.320.hdb\n   │   ├── 1534683120.160.hdb\n   │   ├── 1534692720.40.hdb\n   │   ├── 1534695120.11.hdb\n   │   ├── 1534695900.6.hdb\n   │   └── blocks.state\n   └── metric.index       # metric name and tag index\n\n\nThis layout allows to dump data from memory buffer very efficiently (whisper\nneeds one io-operation per metric and can kneel a host with several hundreds of\nmetrics).\n\nIf points in memory exceed ``BUFFER_FLUSH_SIZE`` it will be\nflushed into separate block::\n\n   +----------+----------+----------+\n   |  block1  |  block2  |  block3  |  resolution 60\n   +----------+----------+----------+\n\nFrom time to time small blocks are merged into greater one::\n\n   +---------------------+----------+\n   |       block12       |  block3  |  resolution 60\n   +---------------------+----------+\n\nAnd from time to time big blocks are downsampled into blocks with lower\nresolution::\n\n   +---------------------+----------+\n   |       block12       |  block3  |  resolution 60\n   +---------------------+----------+\n              |\n              v\n        +----------+\n        | block12' |  resolution 300\n        +----------+\n\nYes, it is very simple.\n\n.. _lmdb: http://www.lmdb.tech/doc/\n\n\nFAQ\n---\n\n1. But there is a better alternative to whisper. InfluxDB!\n\n   Yes, InfluxDB is a way better than whisper. But is has some drawbacks\n   comparing to hisser.\n\n   * Requires more data space.\n   * Consumes more IOPS, memory and CPU.\n   * Needs manual retention configuration.\n   * Slower to query.\n   * Implicit metric grouping can lead to confusing graphs in grafana.\n     You have to limit groups to explicit tag values or do ``group by\n     $tag``.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaverman%2Fhisser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbaverman%2Fhisser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaverman%2Fhisser/lists"}