{"id":13582171,"url":"https://github.com/grafana/metrictank","last_synced_at":"2025-12-30T03:42:18.132Z","repository":{"id":26938581,"uuid":"30401116","full_name":"grafana/metrictank","owner":"grafana","description":"metrics2.0 based, multi-tenant timeseries store for Graphite and friends.","archived":true,"fork":false,"pushed_at":"2023-08-23T15:17:14.000Z","size":38915,"stargazers_count":622,"open_issues_count":34,"forks_count":106,"subscribers_count":161,"default_branch":"master","last_synced_at":"2024-05-21T13:05:29.573Z","etag":null,"topics":["deprecated","graphite","metrics","monitoring","unmaintained"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/grafana.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2015-02-06T07:44:12.000Z","updated_at":"2024-04-22T17:30:53.000Z","dependencies_parsed_at":"2023-10-05T05:40:21.311Z","dependency_job_id":null,"html_url":"https://github.com/grafana/metrictank","commit_stats":{"total_commits":5454,"total_committers":67,"mean_commits":81.40298507462687,"dds":0.6989365603226989,"last_synced_commit":"6d15fe1d382fa6a48a3d3f006a4b25dccb5d1952"},"previous_names":["raintank/raintank-metric","raintank/metrictank"],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grafana%2Fmetrictank","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grafana%2Fmetrictank/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grafana%2Fmetrictank/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grafana%2Fmetrictank/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grafana","download_url":"https://codeload.github.com/grafana/metrictank/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234892715,"owners_count":18902907,"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":["deprecated","graphite","metrics","monitoring","unmaintained"],"created_at":"2024-08-01T15:02:28.143Z","updated_at":"2025-10-01T19:30:36.315Z","avatar_url":"https://github.com/grafana.png","language":"Go","funding_links":[],"categories":["7. Storage","Monitoring","Go"],"sub_categories":["Time Series Database"],"readme":"\u003cimg src=\"docs/assets/metrictank-logo.png\" height=\"150px\" alt=\"Metrictank logo\"\u003e\n\n# UNMAINTAINED\n\nAs of August 2023, Grafana is no longer maintaining this repository. Our primary compatibility with Graphite is provided by [carbonapi](https://github.com/go-graphite/carbonapi), using [Mimir](https://github.com/grafana/mimir) as our backing database.\n\n# Grafana Metrictank\n\n[![Circle CI](https://circleci.com/gh/grafana/metrictank.svg?style=shield)](https://circleci.com/gh/grafana/metrictank)\n[![Go Report Card](https://goreportcard.com/badge/github.com/grafana/metrictank)](https://goreportcard.com/report/github.com/grafana/metrictank)\n[![GoDoc](https://godoc.org/github.com/grafana/metrictank?status.svg)](https://godoc.org/github.com/grafana/metrictank)\n\n## Introduction\n\nGrafana Metrictank is a multi-tenant timeseries platform that can be used as a backend or replacement for Graphite.\nIt provides long term storage, high availability, efficient storage, retrieval and processing for large scale environments.\n\n[Grafana Labs](http://grafana.com) has been running Metrictank in production since December 2015.\nIt currently requires an external datastore like Cassandra or Bigtable, and we highly recommend using Kafka to support clustering, as well\nas a clustering manager like Kubernetes. This makes it non-trivial to operate, though Grafana Labs has an on-premise product\nthat makes this process much easier.\n\n## Features\n\n* 100% open source\n* Heavily compressed chunks (inspired by the [Facebook gorilla paper](http://www.vldb.org/pvldb/vol8/p1816-teller.pdf)) dramatically lower cpu, memory, and storage requirements and get much greater performance out of Cassandra than other solutions.\n* Writeback RAM buffers and chunk caches, serving most data out of memory.\n* Multiple rollup functions can be configured per serie (or group of series). E.g. min/max/sum/count/average, which can be selected at query time via consolidateBy().\nSo we can do consolidation (combined runtime+archived) accurately and correctly,\n[unlike most other graphite backends like whisper](https://grafana.com/blog/2016/03/03/25-graphite-grafana-and-statsd-gotchas/#runtime.consolidation)\n* Flexible tenancy: can be used as single tenant or multi tenant. Selected data can be shared across all tenants.\n* Input options: carbon, metrics2.0, kafka.\n* Guards against excessively large queries. (per-request series/points restrictions)\n* Data backfill/import from whisper\n* Speculative Execution means you can use replicas not only for High Availability but also to reduce query latency.\n* Write-Ahead buffer based on Kafka facilitates robust clustering and enables other analytics use cases.\n* Tags and Meta Tags support\n* Render response metadata: performance statistics, series lineage information and rollup indicator visible through Grafana\n* Index pruning (hide inactive/stale series)\n* Timeseries can change resolution (interval) over time, they will be merged seamlessly at read time. No need for any data migrations.\n\n## Relation to Graphite\n\nThe goal of Metrictank is to provide a more scalable, secure, resource efficient and performant version of Graphite that is backwards compatible, while also adding some novel functionality.\n(see Features, above)\n\nThere's 2 main ways to deploy Metrictank:\n* as a backend for Graphite-web, by setting the `CLUSTER_SERVER` configuration value.\n* as an alternative to a Graphite stack. This enables most of the additional functionality.  Note that Metrictank's API is not quite on par yet with Graphite-web:  some less commonly used functions are not implemented natively yet, in which case Metrictank relies on a graphite-web process to handle those requests. See [our graphite comparison page](docs/graphite.md) for more details.\n\n## Limitations\n\n* No performance/availability isolation between tenants per instance. (only data isolation)\n* Minimum computation locality: we move the data from storage to processing code, which is both metrictank and graphite.\n* Can't overwrite old data. We support reordering the most recent time window but that's it. (unless you restart MT)\n\n## Interesting design characteristics (feature or limitation... up to you)\n\n* Upgrades / process restarts requires running multiple instances (potentially only for the duration of the maintenance) and possibly re-assigning the primary role.\nOtherwise data loss of current chunks will be incurred.  See [operations guide](https://github.com/grafana/metrictank/blob/master/docs/operations.md)\n* clustering works best with an orchestrator like kubernetes. MT itself does not automate master promotions. See [clustering](https://github.com/grafana/metrictank/blob/master/docs/clustering.md) for more.\n* Only float64 values. Ints and bools currently stored as floats (works quite well due to the gorilla compression),\n* Only uint32 unix timestamps in second resolution.   For higher resolution, consider [streaming directly to grafana](https://grafana.com/blog/2016/03/31/using-grafana-with-intels-snap-for-ad-hoc-metric-exploration/)\n* We distribute data by hashing keys, like many similar systems. This means no data locality (data that will be often used together may not live together)\n\n## Docs\n\n### installation, configuration and operation.\n\n* [Overview](https://github.com/grafana/metrictank/blob/master/docs/overview.md)\n* [Quick start using docker](https://github.com/grafana/metrictank/blob/master/docs/quick-start-docker.md)\n  ([more docker information](docs/docker.md))\n* [Installation guides](https://github.com/grafana/metrictank/blob/master/docs/installation.md)\n* [Configuration](https://github.com/grafana/metrictank/blob/master/docs/config.md)\n* [Memory server](https://github.com/grafana/metrictank/blob/master/docs/memory-server.md)\n* [Compression tips](https://github.com/grafana/metrictank/blob/master/docs/compression-tips.md)\n* [Cassandra](https://github.com/grafana/metrictank/blob/master/docs/cassandra.md)\n* [Kafka](https://github.com/grafana/metrictank/blob/master/docs/kafka.md)\n* [Inputs](https://github.com/grafana/metrictank/blob/master/docs/inputs.md)\n* [Metrics](https://github.com/grafana/metrictank/blob/master/docs/metrics.md)\n* [Operations](https://github.com/grafana/metrictank/blob/master/docs/operations.md)\n* [Startup](https://github.com/grafana/metrictank/blob/master/docs/startup.md)\n* [Tools](https://github.com/grafana/metrictank/blob/master/docs/tools.md)\n\n### features in-depth\n\n* [Clustering](https://github.com/grafana/metrictank/blob/master/docs/clustering.md)\n* [Consolidation](https://github.com/grafana/metrictank/blob/master/docs/consolidation.md)\n* [Multi-tenancy](https://github.com/grafana/metrictank/blob/master/docs/multi-tenancy.md)\n* [HTTP api](https://github.com/grafana/metrictank/blob/master/docs/http-api.md)\n* [Graphite](https://github.com/grafana/metrictank/blob/master/docs/graphite.md)\n* [Metadata](https://github.com/grafana/metrictank/blob/master/docs/metadata.md)\n* [Tags](https://github.com/grafana/metrictank/blob/master/docs/tags.md)\n* [Data importing](https://github.com/grafana/metrictank/blob/master/docs/data-importing.md)\n\n### Other\n\n* [Governance](https://github.com/grafana/metrictank/blob/master/GOVERNANCE.md)\n* [Development and contributing](https://github.com/grafana/metrictank/blob/master/docs/CONTRIBUTING.md)\n* [Community](https://github.com/grafana/metrictank/blob/master/docs/community.md)\n* [Roadmap](https://github.com/grafana/metrictank/issues/1319)\n* [Faq](https://github.com/grafana/metrictank/blob/master/docs/faq.md)\n\n## Releases and versioning\n\n* [releases and changelog](https://github.com/grafana/metrictank/releases)\n* we aim to keep `master` stable and vet code before merging to master\n* We're pre-1.0 but adopt semver for our `0.MAJOR.MINOR` format. The rules are simple:\n  * MAJOR version for incompatible API or functionality changes\n  * MINOR version when you add functionality in a backwards-compatible manner, and\n\n  We don't do patch level releases since minor releases are frequent enough.\n\n\nLicense\n=======\n\nCopyright 2016-2019 Grafana Labs\n\nThis software is distributed under the terms of the GNU Affero General Public License.\n\nSome specific packages have a different license:\n* schema : [apache2](schema/LICENSE)\n* expr: [2-clause BSD](expr/LICENSE)\n* mdata/chunk/tsz: [2-clause BSD](mdata/chunk/tsz/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrafana%2Fmetrictank","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrafana%2Fmetrictank","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrafana%2Fmetrictank/lists"}