{ "info": { "author": "Teofilo Sibileau", "author_email": "teo.sibileau@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# Grafane\n\nA very opinionated influxdb client that uses the [official python client](https://github.com/influxdata/influxdb-python) and is very much inspired in grafana's query builder.\n\n## Setup\n\n```\npip install grafane\n```\n\nIn order to query influxdb this library expects the following environment variables to be set:\n\n\n+ `INFLUXDB_HOST`: Defaults to **0.0.0.0**\n+ `INFLUXDB_PORT`: Defaults to **8086**\n+ `INFLUXDB_DB`: Defaults to **metrics**\n+ `INFLUXDB_USER`: Defaults to **admin**\n+ `INFLUXDB_USER_PASSWORD`: Defaults to **admin123**\n\n## Drop measurement\n\n```\nc = Grafane(metric='test')\nc.drop_measurement() # Drops test from influxdb\n```\n## Write\n\nWith:\n\n```python\npoints = [\n {\n 'fields': {\n 'value': 1.2,\n 'value2': 1.3,\n },\n 'tags': {\n 'tag1': 'value1',\n 'tag2': 'value2'\n }\n },\n {\n 'fields': {\n 'value': 1.86,\n 'value2': 2.3,\n },\n 'tags': {\n 'tag1': 'value2',\n 'tag2': 'value1'\n }\n },\n {\n 'fields': {\n 'value': 1.4,\n 'value2': 1.1,\n },\n 'tags': {\n 'tag1': 'value3',\n 'tag2': 'value2'\n }\n },\n {\n 'fields': {\n 'value': 1.8,\n 'value2': 1.95,\n },\n 'tags': {\n 'tag1': 'value1',\n 'tag2': 'value2'\n }\n },\n]\n```\n\nYou can do either do multiple single queries:\n\n```python\nfrom grafane import Grafane\nc = Grafane(metric='generic') # Metric defaults to generic\nfor p in points:\n\tc.report(p['fields'], p['tags'])\n```\n\nOr a single query with multiple points:\n\n```python\nc.report_points(points)\n```\n\nif you don't provide `time` for a point it defaults to:\n\n```python\n>>> datetime.utcnow().replace(tzinfo=pytz.utc)\ndatetime.datetime(2019, 2, 8, 19, 32, 38, 788003, tzinfo=)\n```\n\n## Read\n\n### Select\n\n![](docs/select.png)\n\n```python\nIn [6]: c.select(fields='value') \n\nIn [7]: c.execute_query() \nOut[7]: \n[{'time': '2019-02-10T20:37:13.786477056Z', 'value': 1.2},\n {'time': '2019-02-10T20:37:13.786508032Z', 'value': 1.86},\n {'time': '2019-02-10T20:37:13.786518016Z', 'value': 1.4},\n {'time': '2019-02-10T20:37:13.786535936Z', 'value': 1.8}]\n```\n\n### Select multiple fields\n\n![](docs/select_multiple.png)\n\n```python\nIn [16]: c.select(fields=['value', 'value2']) \n\nIn [17]: c.execute_query() \nOut[17]: \n[{'time': '2019-02-10T20:42:37.22864512Z', 'value': 1.2, 'value2': 1.3},\n {'time': '2019-02-10T20:42:37.228871936Z', 'value': 1.86, 'value2': 2.3},\n {'time': '2019-02-10T20:42:37.228883968Z', 'value': 1.4, 'value2': 1.1},\n {'time': '2019-02-10T20:42:37.22889216Z', 'value': 1.8, 'value2': 1.95}]\n```\n\n### Select w/ aggregation\n\n![](docs/select_w_aggregation.png)\n\n```python\nIn [18]: c.select(fields='value', aggregation='sum') \n\nIn [19]: c.execute_query() \nOut[19]: [{'time': '1970-01-01T00:00:00Z', 'sum': 6.26}]\n\n```\n\n### Select multiple fields w/ aggregation\n\n![](docs/select_multiple_w_aggregation.png)\n\n```python\nIn [20]: c.select(fields=['value', 'value2'], aggregation=['sum', 'mean']) \n\nIn [21]: c.execute_query() \nOut[21]: [{'time': '1970-01-01T00:00:00Z', 'sum': 6.26, 'mean': 1.6625}]\n```\n\n### Group aggregated results in time blocks\n\n![](docs/select_group_by_timeblock.png)\n\n```python\nIn [22]: c.select(fields=['value', 'value2'], aggregation=['sum', 'mean']) \n\nIn [23]: c.time_block('1m') \n\nIn [24]: c.execute_query() \nOut[24]: \n[{'time': '2019-02-10T20:42:00Z', 'sum': 6.26, 'mean': 1.6625},\n {'time': '2019-02-10T20:43:00Z', 'sum': None, 'mean': None},\n {'time': '2019-02-10T20:44:00Z', 'sum': None, 'mean': None},\n {'time': '2019-02-10T20:45:00Z', 'sum': None, 'mean': None},\n {'time': '2019-02-10T20:46:00Z', 'sum': None, 'mean': None},\n {'time': '2019-02-10T20:47:00Z', 'sum': None, 'mean': None}]\n```\n\nWhen grouping time blocks, in order to avoid empty rows you need to fill results with **None**\n\n![](docs/select_group_by_timeblock_filled_w_none.png)\n\n```python\nIn [29]: c.select(fields=['value', 'value2'], aggregation=['sum', 'mean']) \n\nIn [30]: c.time_block('1m') \n\nIn [31]: c.fill_with('none') \n\nIn [32]: c.execute_query() \nOut[32]: [{'time': '2019-02-10T20:42:00Z', 'sum': 6.26, 'mean': 1.6625}]\n```\n\n### Group aggregated results by tag values\n\n![](docs/group_by.png)\n\n```python\nIn [34]: c.select(fields=['value', 'value2'], aggregation=['sum', 'mean']) \n\nIn [35]: c.group_by('tag1') \n\nIn [36]: c.execute_query() \nOut[36]: \n[{'tags': {'tag1': 'value1'},\n 'time': '1970-01-01T00:00:00Z',\n 'sum': 3,\n 'mean': 1.625},\n {'tags': {'tag1': 'value2'},\n 'time': '1970-01-01T00:00:00Z',\n 'sum': 1.86,\n 'mean': 2.3},\n {'tags': {'tag1': 'value3'},\n 'time': '1970-01-01T00:00:00Z',\n 'sum': 1.4,\n 'mean': 1.1}] \n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://gitlab.com/drkloc/grafane", "keywords": "", "license": "Creative Commons Attribution-Noncommercial-Share Alike license", "maintainer": "", "maintainer_email": "", "name": "Grafane", "package_url": "https://pypi.org/project/Grafane/", "platform": "", "project_url": "https://pypi.org/project/Grafane/", "project_urls": { "Homepage": "https://gitlab.com/drkloc/grafane" }, "release_url": "https://pypi.org/project/Grafane/0.6/", "requires_dist": [ "certifi (==2018.11.29)", "chardet (==3.0.4)", "idna (==2.8)", "influxdb (==5.2.1)", "python-dateutil (==2.8.0)", "pytz (==2018.9)", "requests (==2.21.0)", "six (==1.12.0)", "urllib3 (==1.24.1)" ], "requires_python": "", "summary": "", "version": "0.6" }, "last_serial": 4807498, "releases": { "0.5": [ { "comment_text": "", "digests": { "md5": "beeaacb291abaa85c2c36c37bba5c118", "sha256": "5a81b3072cf9b685f09760a620483bf98fbc4aed6a53802f821be46b4c123550" }, "downloads": -1, "filename": "Grafane-0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "beeaacb291abaa85c2c36c37bba5c118", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6969, "upload_time": "2019-02-11T19:28:33", "url": "https://files.pythonhosted.org/packages/20/38/a58beca43f0aa6818409c3686b2c80db1345cb54e3eea75300f67bc28053/Grafane-0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0bc10fdb4745c85bdc9f8a99ca2e0b0f", "sha256": "3d590ad16a619ec4a5c5bcb2915bdba2d11b2342ef26a3949ab3ee67076fa503" }, "downloads": -1, "filename": "Grafane-0.5.tar.gz", "has_sig": false, "md5_digest": "0bc10fdb4745c85bdc9f8a99ca2e0b0f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6583, "upload_time": "2019-02-11T19:28:35", "url": "https://files.pythonhosted.org/packages/e5/6b/152e570e17de96d5536626b991c26da124379c6eb729f32af3ba0498c4e6/Grafane-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "47e7f3a2a8ae53f8602e9a881fe9b397", "sha256": "8e5483c40f720fe82688132c6c35864d2f526be105a44f6d2f6b7f888a03c7ef" }, "downloads": -1, "filename": "Grafane-0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "47e7f3a2a8ae53f8602e9a881fe9b397", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6982, "upload_time": "2019-02-11T19:32:14", "url": "https://files.pythonhosted.org/packages/39/a8/1aa78c3248620d5d5038a2c203882d7b73d9b5f7735ddbb4b5e181bdb972/Grafane-0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "020783a7b0b9ccf59ba98f0237163a1b", "sha256": "d0539dce5ff4bd4756a312f2e918eff86c677c8f2d09ef599639840cf9e6a818" }, "downloads": -1, "filename": "Grafane-0.6.tar.gz", "has_sig": false, "md5_digest": "020783a7b0b9ccf59ba98f0237163a1b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6614, "upload_time": "2019-02-11T19:32:17", "url": "https://files.pythonhosted.org/packages/75/75/b1ab04960ec75ac8e38659b7f1790e4302b4d9fc33d29e0238103db0c0c7/Grafane-0.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "47e7f3a2a8ae53f8602e9a881fe9b397", "sha256": "8e5483c40f720fe82688132c6c35864d2f526be105a44f6d2f6b7f888a03c7ef" }, "downloads": -1, "filename": "Grafane-0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "47e7f3a2a8ae53f8602e9a881fe9b397", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6982, "upload_time": "2019-02-11T19:32:14", "url": "https://files.pythonhosted.org/packages/39/a8/1aa78c3248620d5d5038a2c203882d7b73d9b5f7735ddbb4b5e181bdb972/Grafane-0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "020783a7b0b9ccf59ba98f0237163a1b", "sha256": "d0539dce5ff4bd4756a312f2e918eff86c677c8f2d09ef599639840cf9e6a818" }, "downloads": -1, "filename": "Grafane-0.6.tar.gz", "has_sig": false, "md5_digest": "020783a7b0b9ccf59ba98f0237163a1b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6614, "upload_time": "2019-02-11T19:32:17", "url": "https://files.pythonhosted.org/packages/75/75/b1ab04960ec75ac8e38659b7f1790e4302b4d9fc33d29e0238103db0c0c7/Grafane-0.6.tar.gz" } ] }