{ "info": { "author": "Oleksiy Kuzmenko", "author_email": "oleksiy.kuzmenko@undp.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: No Input/Output (Daemon)", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: System :: Monitoring" ], "description": "# MsGraphExporter\n\n[![Python 3.6+](https://img.shields.io/badge/Python-3.6+-blue.svg)][PythonRef] [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)][BlackRef] [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)][MITRef]\n[![ReadTheDocs](https://readthedocs.org/projects/msgraphexporter/badge/?version=latest)][DocsRef] [![Build Status](https://dev.azure.com/undp/MsGraphExporter/_apis/build/status/MsGraphExporter_Github?branchName=develop)][BuildStatusRef]\n\n[PythonRef]: https://docs.python.org/3.6/\n[BlackRef]: https://github.com/ambv/black\n[MITRef]: https://opensource.org/licenses/MIT\n[DocsRef]: https://msgraphexporter.readthedocs.io/en/latest/\n[BuildStatusRef]: https://dev.azure.com/undp/MsGraphExporter/_build/latest?definitionId=21&branchName=develop\n\n`MsGraphExporter` is an application that performs periodic export of time-domain data like Azure AD user signins from [Microsoft Graph API][MsGraphApiDoc] into a buffer key-value store (currently supports [Redis][RedisRef]) for subsequent processing. It uses [Celery][CeleryProjectRef] task queue for parallel processing, [gevent][GeventRef] greenlets for concurrent uploads, relies on the [Graph API pagination][MsGraphApiPage] to control memory footprint and respects [Graph API throttling][MsGraphApiThrottle]. The application could be deployed as a single-container worker or as a set of multiple queue-specific workers for high reliability and throughput.\n\n[MsGraphApiDoc]: https://docs.microsoft.com/en-us/graph/overview\n[MsGraphApiPage]: https://docs.microsoft.com/en-us/graph/paging\n[MsGraphApiThrottle]: https://docs.microsoft.com/en-us/graph/throttling\n\n## Getting Started\n\nFollow these instructions to use the application.\n\n### Installing\n\n`MsGraphExporter` is distributed through the [Python Package Index][PyPIRef] as [ms-graph-exporter][PyPIProjRef]. Run the following command to:\n\n[PyPIRef]: https://pypi.org\n[PyPIProjRef]:https://pypi.org/project/ms-graph-exporter/\n\n* install a specific version\n\n ```sh\n pip install \"ms-graph-exporter==0.1\"\n ```\n\n* install the latest version\n\n ```sh\n pip install \"ms-graph-exporter\"\n ```\n\n* upgrade to the latest version\n\n ```sh\n pip install --upgrade \"ms-graph-exporter\"\n ```\n\n* install optional DEV dependencies like `pytest` framework and plugins necessary for performance and functional testing\n\n ```sh\n pip install \"ms-graph-exporter[test]\"\n ```\n\n`MsGraphExporter` is also distributed as the Alpine-based docker container and published on [Docker Hub][DockerHubRef] as [undp/ms-graph-exporter][DockerHubProjRef].\n\n[DockerHubRef]: https://hub.docker.com/\n[DockerHubProjRef]: https://hub.docker.com/r/undp/ms-graph-exporter\n\n`Service Principal` credentials with correct access rights to `Graph API` must be defined for `docker/docker-compose.yaml`example deployment to work. Following `.env` file should be placed at the root of the project folder, or following ENV variables defined in other way:\n\n```sh\nGRAPH_CLIENT_ID=\nGRAPH_CLIENT_SECRET=\nGRAPH_TENANT=\n```\n\nThen, docker deployment could be initiated with:\n\n```sh\ndocker-compose --file docker/docker-compose.yaml up\n```\n\n### Requirements\n\n* Python >= 3.6\n\n## Built using\n\n* [Celery][CeleryProjectRef] - Distributed task queue\n* [gevent][GeventRef] - concurrent data upload to [Redis][RedisRef]\n* [redis-py][RedisPyGithub] - Python interface to [Redis][RedisRef]\n\n[RedisRef]: https://redis.io/\n[CeleryProjectRef]:http://www.celeryproject.org/\n[GeventRef]: http://www.gevent.org\n[RedisPyGithub]: https://github.com/andymccurdy/redis-py\n\n## Versioning\n\nWe use [Semantic Versioning Specification][SemVer] as a version numbering convention.\n\n[SemVer]: http://semver.org/\n\n## Release History\n\nFor the available versions, see the [tags on this repository][RepoTags]. Specific changes for each version are documented in [CHANGELOG.md][ChangelogRef].\n\nAlso, conventions for `git commit` messages are documented in [CONTRIBUTING.md][ContribRef].\n\n[RepoTags]: https://github.com/undp/MsGraphExporter/tags\n[ChangelogRef]: CHANGELOG.md\n[ContribRef]: CONTRIBUTING.md\n\n## Authors\n\n* **Oleksiy Kuzmenko** - [OK-UNDP@GitHub][OK-UNDP@GitHub] - *Initial design and implementation*\n\n[OK-UNDP@GitHub]: https://github.com/OK-UNDP\n\n## Acknowledgments\n\n* Hat tip to all individuals shaping design of this project by sharing their knowledge in articles, blogs and forums.\n\n## License\n\nUnless otherwise stated, all authors (see commit logs) release their work under the [MIT License][MITRef]. See [LICENSE.md][LicenseRef] for details.\n\n[LicenseRef]: LICENSE.md\n\n## Contributing\n\nThere are plenty of ways you could contribute to this project. Feel free to:\n\n* submit bug reports and feature requests\n* outline, fix and expand documentation\n* peer-review bug reports and pull requests\n* implement new features or fix bugs\n\nSee [CONTRIBUTING.md][ContribRef] for details on code formatting, linting and testing frameworks used by this project.\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/undp/MsGraphExporter", "keywords": "development,monitoring,microsoft graph", "license": "MIT", "maintainer": "Oleksiy Kuzmenko", "maintainer_email": "oleksiy.kuzmenko@undp.org", "name": "ms-graph-exporter", "package_url": "https://pypi.org/project/ms-graph-exporter/", "platform": "", "project_url": "https://pypi.org/project/ms-graph-exporter/", "project_urls": { "Documentation": "https://msgraphexporter.readthedocs.io/en/latest/", "Homepage": "https://github.com/undp/MsGraphExporter", "Repository": "https://github.com/undp/MsGraphExporter" }, "release_url": "https://pypi.org/project/ms-graph-exporter/0.1.0rc4/", "requires_dist": [ "adal (>=1.2,<2.0)", "celery (>=4.3,<5.0)", "celery-redbeat (>=0.13,<0.14)", "gevent (>=1.4,<2.0)", "pyyaml (>=3.13,<4.0)", "redis (>=3.3,<4.0)", "typing (>=3.7,<4.0)", "requests (>=2.20,<3.0)", "recommonmark (>=0.5.0,<0.6.0); extra == \"docs\"", "sphinx (>=2.2,<3.0); extra == \"docs\"", "sphinx-rtd-theme (>=0.4,<0.5)", "sphinx-autodoc-typehints (>=1.8,<2.0); extra == \"docs\"", "pytest (>=5.1,<6.0); extra == \"test\"", "pytest-benchmark[aspect] (>=3.2,<4.0); extra == \"test\"", "pytest-cov (>=2.7,<3.0); extra == \"test\"", "pytest-dockerc (>=1.0,<2.0); extra == \"test\"", "pytest-instafail (>=0.4,<0.5); extra == \"test\"", "pytest-lazy-fixture (>=0.5,<0.6); extra == \"test\"", "pytest-random-order (>=1.0,<2.0); extra == \"test\"" ], "requires_python": ">=3.6,<4.0", "summary": "A distributed Celery application to export time-domain data periodically from Microsoft Graph API into a buffer key-value store.", "version": "0.1.0rc4" }, "last_serial": 5952785, "releases": { "0.1.0rc2.dev201909283": [ { "comment_text": "", "digests": { "md5": "a98403611cd96639a2197e3edbedd7c0", "sha256": "a0da4256636cb8ff20a9f2e3121e161edb38ef6c0ed2314d8db7504ba3926a11" }, "downloads": -1, "filename": "ms_graph_exporter-0.1.0rc2.dev201909283-py3-none-any.whl", "has_sig": false, "md5_digest": "a98403611cd96639a2197e3edbedd7c0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 50402, "upload_time": "2019-09-28T20:06:36", "url": "https://files.pythonhosted.org/packages/f7/83/d2375c47fdb5de5969e5d6e3a708583942212a19f34a7456918ba3066d5f/ms_graph_exporter-0.1.0rc2.dev201909283-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fa6ba741946145236d70e054a56b9642", "sha256": "4d29ecdd7bbd6742fc022a1e30f23628aabaf445c00f351cc2302a5f9f0ce913" }, "downloads": -1, "filename": "ms-graph-exporter-0.1.0rc2.dev201909283.tar.gz", "has_sig": false, "md5_digest": "fa6ba741946145236d70e054a56b9642", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 33839, "upload_time": "2019-09-28T20:06:34", "url": "https://files.pythonhosted.org/packages/b6/d8/e1f26dac7c8c4ab9c2ff7edd16504d8b889b454e7b2a689d99f93e8039e5/ms-graph-exporter-0.1.0rc2.dev201909283.tar.gz" } ], "0.1.0rc3": [ { "comment_text": "", "digests": { "md5": "526d0a7162bd905c1a214d0f2cf7ddd5", "sha256": "a78904c4514c72574007bf69cc16ab8964dde4bbe6d33e67a965670f7977e5f1" }, "downloads": -1, "filename": "ms_graph_exporter-0.1.0rc3-py3-none-any.whl", "has_sig": false, "md5_digest": "526d0a7162bd905c1a214d0f2cf7ddd5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 51103, "upload_time": "2019-09-30T03:14:13", "url": "https://files.pythonhosted.org/packages/cc/00/d7e826907ce974a903d6e5dd95e149f044ec5e17a2724a865219b20f2a67/ms_graph_exporter-0.1.0rc3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fa9e15b046f315e2a0eb600a929640bf", "sha256": "ea64bd5798431a7562f84cde0f84b1458730097cb0fd67ebce0dd325e3869eba" }, "downloads": -1, "filename": "ms-graph-exporter-0.1.0rc3.tar.gz", "has_sig": false, "md5_digest": "fa9e15b046f315e2a0eb600a929640bf", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 34461, "upload_time": "2019-09-30T03:14:08", "url": "https://files.pythonhosted.org/packages/9c/a8/fbc891cab57a8edfda91252bd27c6558899970e01feb5c9c9881110ed117/ms-graph-exporter-0.1.0rc3.tar.gz" } ], "0.1.0rc4": [ { "comment_text": "", "digests": { "md5": "6e173bfe1196b2409581ace41f568ee1", "sha256": "c4e801850768a47815e0057dc7becc31f42a4c00f6f88cbdc8ffb41340920260" }, "downloads": -1, "filename": "ms_graph_exporter-0.1.0rc4-py3-none-any.whl", "has_sig": false, "md5_digest": "6e173bfe1196b2409581ace41f568ee1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 49890, "upload_time": "2019-10-10T02:41:30", "url": "https://files.pythonhosted.org/packages/a9/6d/7e1d06471dca3e74b1e0a76d44100b6e0b363f628a8f705b23003747e5a6/ms_graph_exporter-0.1.0rc4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e6e798e0b6c04de550dbae179ff4301c", "sha256": "b925ae03d1fb90162cb5408c31952254d841f2ea87eb7bd68e601f806bb602d9" }, "downloads": -1, "filename": "ms-graph-exporter-0.1.0rc4.tar.gz", "has_sig": false, "md5_digest": "e6e798e0b6c04de550dbae179ff4301c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 33760, "upload_time": "2019-10-10T02:41:28", "url": "https://files.pythonhosted.org/packages/49/b0/488966933e2e520acc6db82de54a62d3ea22c0bb134d4c9075e8dd9ef8ec/ms-graph-exporter-0.1.0rc4.tar.gz" } ], "0.1.0rc4.dev201910092": [ { "comment_text": "", "digests": { "md5": "b8bfc78fdde0d00ab8f7046a2b2c6add", "sha256": "de5d16aa4d092fca26c2412fb75afa91a1e332089a830c4fab74d0d208c3cb12" }, "downloads": -1, "filename": "ms_graph_exporter-0.1.0rc4.dev201910092-py3-none-any.whl", "has_sig": false, "md5_digest": "b8bfc78fdde0d00ab8f7046a2b2c6add", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 49934, "upload_time": "2019-10-09T21:38:24", "url": "https://files.pythonhosted.org/packages/12/55/002fd1cc85eb544e72968a03760a65662ca61f79741dd72b330fa388f7ec/ms_graph_exporter-0.1.0rc4.dev201910092-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "63763e32ab4e25a7a4967f8582543b1e", "sha256": "5018467be675ddced5de36de0c40940369f70f9dec536a052923480a58d2b175" }, "downloads": -1, "filename": "ms-graph-exporter-0.1.0rc4.dev201910092.tar.gz", "has_sig": false, "md5_digest": "63763e32ab4e25a7a4967f8582543b1e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 33759, "upload_time": "2019-10-09T21:38:22", "url": "https://files.pythonhosted.org/packages/22/10/b195e0ee7c7e07f6b360790f35cfc56a94ada663659a3513491a0f2b7e57/ms-graph-exporter-0.1.0rc4.dev201910092.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6e173bfe1196b2409581ace41f568ee1", "sha256": "c4e801850768a47815e0057dc7becc31f42a4c00f6f88cbdc8ffb41340920260" }, "downloads": -1, "filename": "ms_graph_exporter-0.1.0rc4-py3-none-any.whl", "has_sig": false, "md5_digest": "6e173bfe1196b2409581ace41f568ee1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 49890, "upload_time": "2019-10-10T02:41:30", "url": "https://files.pythonhosted.org/packages/a9/6d/7e1d06471dca3e74b1e0a76d44100b6e0b363f628a8f705b23003747e5a6/ms_graph_exporter-0.1.0rc4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e6e798e0b6c04de550dbae179ff4301c", "sha256": "b925ae03d1fb90162cb5408c31952254d841f2ea87eb7bd68e601f806bb602d9" }, "downloads": -1, "filename": "ms-graph-exporter-0.1.0rc4.tar.gz", "has_sig": false, "md5_digest": "e6e798e0b6c04de550dbae179ff4301c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 33760, "upload_time": "2019-10-10T02:41:28", "url": "https://files.pythonhosted.org/packages/49/b0/488966933e2e520acc6db82de54a62d3ea22c0bb134d4c9075e8dd9ef8ec/ms-graph-exporter-0.1.0rc4.tar.gz" } ] }