a simple tool to help you migrate your graphite metrics
metrics-migration a Python3 tool (async io), designed to help graphite users to migrate metrics in several ways.
- Migrate whole storage directory.
- Migrate specific whisper file (with new metric name).
- Allow schema change during Migration (Provide schema rule).
You can install aiographite globally with any Python package manager:
pip3 install metrics-migration
Whisper on pypi only supports python2, we should download whisper egg from github.
pip3 install https://github.com/graphite-project/whisper/tarball/feature/py3
Let's get started with several examples.
Example 1. A simple example to migrate a directory.
from migration.migration import Migration import asyncio loop = asyncio.get_event_loop() host = "127.0.0.1" port = 2003 directory = '/Users/yunx/Documents/PROJECTS/metrics-migration/examples' async def go(): migration_worker = Migration(directory, host, port, loop=loop) await migration_worker.connect_to_graphite() await migration_worker.run() await migration_worker.close_conn_to_graphite() def main(): loop.run_until_complete(go()) loop.close() if __name__ == '__main__': main()
Example 2. Migrate a whipser file with new metric.
from migration.migration import Migration import asyncio loop = asyncio.get_event_loop() host = "127.0.0.1" port = 2003 directory = '/Users/yunx/Documents/PROJECTS/metrics-migration/examples' storage_dir = '/Users/yunx/Documents/PROJECTS/metrics-migration' metric = "examples.committedPoints" new_metric = 'hello.world' async def go(): migration_worker = Migration(directory, host, port, loop=loop, debug=True) await migration_worker.connect_to_graphite() await migration_worker.send_one_wsp(storage_dir, metric, new_metric) await migration_worker.close_conn_to_graphite() def main(): loop.run_until_complete(go()) loop.close() if __name__ == '__main__': main()
Example 3. Have Multiple Directories to migrate ?
from migration.migration import Migration import asyncio loop = asyncio.get_event_loop() host = "127.0.0.1" port = 2003 directories_and_prefixes = [ ('/opt/graphite/metrics-migration/zon1', 'zon1'), ('/opt/graphite/metrics-migration/zon2', 'zon2'), ] async def go(): migration_worker = Migration(directory, host, port, loop=loop) await migration_worker.connect_to_graphite() for (directory, prefix) in directories_and_prefixes: wait migration_worker.run(directory=directory, prefix=prefix) await migration_worker.run() await migration_worker.close_conn_to_graphite() def main(): loop.run_until_complete(go()) loop.close() if __name__ == '__main__': main()
Example 4. async with context manager
from migration.migration import Migration import asyncio loop = asyncio.get_event_loop() host = "127.0.0.1" port = 2003 directory = '/Users/yunx/Documents/PROJECTS/metrics-migration/examples' async def go(): """ Use context manager """ async with Migration(directory, host, port, loop=loop, debug=True) as migration_worker: await migration_worker.run() def main(): loop.run_until_complete(go()) loop.close() if __name__ == '__main__': main()
Run unit tests.
./uranium test