{ "info": { "author": "Raul Gutierrez Segales", "author_email": "rgs@twitter.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: System :: Distributed Computing", "Topic :: System :: Networking" ], "description": "# ZKTraffic [![Build Status](https://travis-ci.org/twitter/zktraffic.svg?branch=master)](https://travis-ci.org/twitter/zktraffic) [![Coverage Status](https://coveralls.io/repos/twitter/zktraffic/badge.png)](https://coveralls.io/r/twitter/zktraffic) [![PyPI version](https://badge.fury.io/py/zktraffic.svg)](http://badge.fury.io/py/zktraffic)\n\n**Table of Contents**\n\n- [tl;dr](#tldr)\n- [Installing](#installing)\n- [What is ZKTraffic?](#what-is-zktraffic)\n- [Contributing and Testing](#contributing-and-testing)\n- [More tools!](#more-tools)\n- [OS X](#os-x)\n- [Dependencies](#dependencies)\n\n### tl;dr ###\n\nZooKeeper protocol analyzer and stats gathering daemon\n\n### Installing ###\n\nYou can install ZKTraffic via pip:\n\n.. code-block:: bash\n\n $ pip install zktraffic\n\nOr run it from source (if you have the dependencies installed, see below):\n\n.. code-block:: bash\n\n $ git clone https://github.com/twitter/zktraffic.git\n $ cd zktraffic\n $ sudo ZKTRAFFIC_SOURCE=1 bin/zk-dump --iface=eth0\n\nTo get a quick count of requests by path:\n\n.. code-block:: bash\n\n $ sudo ZKTRAFFIC_SOURCE=1 bin/zk-dump --iface=eth0 --count-requests 10000 --sort-by path\n / 1749\n /services/prod/search 846\n /configs/teleportation/features 843\n\nOr by type:\n\n.. code-block:: bash\n\n $ sudo ZKTRAFFIC_SOURCE=1 bin/zk-dump --iface=eth0 --count-requests 10000 --sort-by type\n GetChildrenRequest 9044\n ExistsRequest 958\n\nYou can also measure latencies by path (avg, p95 and p99):\n\n.. code-block:: bash\n\n $ sudo ZKTRAFFIC_SOURCE=1 bin/zk-dump --measure-latency 1000 --group-by path --aggregation-depth 2 --sort-by p99\n path avg p95 p99\n --------------- ----------- ---------- ----------\n /party/services 0.000199077 0.00048846 0.00267805\n /party 0.000349498 0.00136839 0.00201204\n /party/configs 0.000157728 0.00036664 0.00122663\n\nOr by type:\n\n.. code-block:: bash\n\n $ sudo ZKTRAFFIC_SOURCE=1 bin/zk-dump --measure-latency 1000 --group-by type --sort-by p99\n type avg p95 p99\n ---------------------- ----------- ----------- -----------\n CreateEphemeralRequest 0.000735009 0.000978041 0.0032404\n GetChildrenRequest 0.000182547 0.000453258 0.00220628\n ExistsRequest 0.000162728 0.000430155 0.000862937\n\nOr by client:\n\n.. code-block:: bash\n\n $ sudo ZKTRAFFIC_SOURCE=1 bin/zk-dump --measure-latency 1000 --group-by client --sort-by p99\n client avg p95 p99\n ---------------------- ----------- ----------- -----------\n 10.0.1.3:44308 0.000735009 0.000978041 0.0032404\n 10.0.1.6:34305 0.000182547 0.000453258 0.00220628\n 10.0.1.9:36110 0.000162728 0.000430155 0.000862937\n\nOr use the stats gathering daemon:\n\n.. code-block:: bash\n\n $ sudo ZKTRAFFIC_SOURCE=1 bin/zk-stats-daemon --iface=eth0 --http-port=9090\n\nOr you can build PEX files \u2014 from the source \u2014 for any of the available tools:\n\n.. code-block:: bash\n\n $ pip install pex\n\n # zk-dump\n $ pex -v -e zktraffic.cli.zk -o zk-dump.pex .\n\n # zk-stats-daemon\n $ pex -v -e zktraffic.cli.stats_daemon -o stats-daemon.pex .\n\n # zab-dump\n $ pex -v -e zktraffic.cli.zab -o zab-dump.pex .\n\n # fle-dump\n $ pex -v -e zktraffic.cli.fle -o fle-dump.pex .\n\nMore info about PEX [here](https://pex.readthedocs.org \"PEX\").\n\n### What is ZKTraffic? ###\n\nAn {iptraf,top}-esque traffic monitor for ZooKeeper. Right now it exports\nper-path (and global) stats. Eventually it'll be made to export per-user\nstats too.\n\nIt has a front-end, zk-dump, that can be used in interactive mode to dump traffic:\n\n```\n# need root or CAP_NET_ADMIN & CAP_NET_RAW\n$ sudo zk-dump --iface eth0\n21:08:05:991542 ConnectRequest(ver=0, zxid=0, timeout=10000, session=0x0, readonly=False, client=127.0.0.1:50049)\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u25ba21:08:06:013513 ConnectReply(ver=0, timeout=10000, session=0x148cf0aedc60000, readonly=False, client=127.0.0.1:50049)\n21:08:07:432361 ExistsRequest(xid=1, path=/, watch=False, size=14, client=127.0.0.1:50049)\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u25ba21:08:07:447353 ExistsReply(xid=1, zxid=31, error=0, client=127.0.0.1:50049)\n21:08:07:448033 GetChildrenRequest(xid=2, path=/, watch=False, size=14, client=127.0.0.1:50049)\n\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u25ba21:08:07:456169 GetChildrenReply(xid=2, zxid=31, error=0, count=1, client=127.0.0.1:50049)\n...\n```\n\nOr, it can work in daemon mode from which it exposes HTTP/JSON endpoints with\nstats that can be fed into your favourite data collection system:\n\n.. code-block:: bash\n\n $ sudo zk-stats-daemon.pex --app_daemonize --aggregation-depth=5\n\n # Wait for 1 min and:\n\n $ sleep 60 && curl http://localhost:7070/json/paths | python -mjson.tool\n {\n \"ConnectRequest\": 2,\n \"ConnectRequestBytes\": 90,\n \"CreateRequest/configs\": 2,\n \"CreateRequest/configs/server\": 2,\n \"CreateRequest/discovery\": 2,\n \"CreateRequest/discovery/hosts\": 2,\n \"CreateRequest/discovery/services\": 2,\n \"CreateRequestBytes/configs\": 110,\n \"CreateRequestBytes/configs/server\": 124,\n \"CreateRequestBytes/discovery\": 114,\n \"CreateRequestBytes/discovery/hosts\": 126,\n \"CreateRequestBytes/discovery/services\": 132,\n \"ExistsRequest/\": 1574,\n \"ExistsRequest/configs\": 3,\n \"ExistsRequest/configs/server\": 2,\n \"ExistsRequest/discovery\": 4,\n \"ExistsRequest/discovery/hosts\": 2,\n \"ExistsRequest/discovery/services\": 2,\n \"ExistsRequestBytes/\": 22036,\n \"ExistsRequestBytes/configs\": 63,\n \"ExistsRequestBytes/configs/server\": 56,\n \"ExistsRequestBytes/discovery\": 92,\n \"ExistsRequestBytes/discovery/hosts\": 58,\n \"ExistsRequestBytes/discovery/services\": 64,\n \"GetChildrenRequest/configs\": 1285,\n \"GetChildrenRequest/configs/server\": 1242,\n \"GetChildrenRequest/discovery\": 1223,\n \"GetChildrenRequest/discovery/hosts\": 1250,\n \"GetChildrenRequest/discovery/services\": 1222,\n \"GetChildrenRequest/zookeeper/config\": 1285,\n \"GetChildrenRequest/zookeeper/quota/limits\": 1228,\n \"GetChildrenRequest/zookeeper/quota/limits/by-path\": 1269,\n \"GetChildrenRequest/zookeeper/quota/limits/global\": 1230,\n \"GetChildrenRequest/zookeeper/quota/stats/by-path\": 1222,\n \"GetChildrenRequestBytes/discovery/hosts\": 36250,\n \"GetChildrenRequestBytes/discovery/services\": 39104,\n \"GetChildrenRequestBytes/zookeeper/config\": 38550,\n \"GetChildrenRequestBytes/zookeeper/quota/limits\": 44208,\n \"GetChildrenRequestBytes/zookeeper/quota/limits/by-path\": 55836,\n \"GetChildrenRequestBytes/zookeeper/quota/limits/global\": 52890,\n \"GetChildrenRequestBytes/zookeeper/quota/limits/slices\": 51815,\n \"GetChildrenRequestBytes/zookeeper/quota/stats\": 42630,\n \"GetChildrenRequestBytes/zookeeper/quota/stats/by-path\": 52546,\n \"GetChildrenRequestBytes/zookeeper/quota/stats/global\": 50568,\n \"reads/\": 2761,\n \"reads/configs\": 1288,\n \"reads/configs/server\": 1244,\n \"reads/discovery\": 1227,\n \"reads/discovery/hosts\": 1252,\n \"reads/discovery/services\": 1224,\n \"reads/zookeeper/config\": 1285,\n \"reads/zookeeper/quota/limits\": 1228,\n \"reads/zookeeper/quota/limits/by-path\": 1269,\n \"reads/zookeeper/quota/limits/global\": 1230,\n \"readsBytes/\": 38654,\n \"readsBytes/discovery/services\": 39168,\n \"readsBytes/zookeeper/config\": 38550,\n \"readsBytes/zookeeper/quota/limits\": 44208,\n \"readsBytes/zookeeper/quota/limits/by-path\": 55836,\n \"readsBytes/zookeeper/quota/limits/global\": 52890,\n \"readsBytes/zookeeper/quota/limits/slices\": 51815,\n \"readsBytes/zookeeper/quota/stats\": 42630,\n \"readsBytes/zookeeper/quota/stats/by-path\": 52546,\n \"readsBytes/zookeeper/quota/stats/global\": 50568,\n \"total/readBytes\": 655586,\n \"total/reads\": 21251,\n \"total/writeBytes\": 606,\n \"total/writes\": 10,\n \"writes/\": 0,\n \"writes/configs\": 2,\n \"writes/configs/server\": 2,\n \"writes/discovery\": 2,\n \"writes/discovery/hosts\": 2,\n \"writes/discovery/services\": 2,\n \"writesBytes/\": 0,\n \"writesBytes/configs\": 110,\n \"writesBytes/configs/server\": 124,\n \"writesBytes/discovery\": 114,\n \"writesBytes/discovery/hosts\": 126,\n \"writesBytes/discovery/services\": 132\n }\n\nOther relevant endpoints for stats are:\n\n* /json/ips: top-N per-ip stats\n* /json/auths: per-auth stats\n* /json/auths-dump: a full dump of known auths\n* /json/info: process uptime and introspection info\n* /threads: stacks for all threads\n\n### Contributing and Testing ###\n\nPlease see [CONTRIBUTING.md](CONTRIBUTING.md).\n\n### More tools! ###\n\nAlong with zk-dump and zk-stats-daemon, you can find fle-dump which allows you\nto inspect FastLeaderElection traffic (i.e.: the protocol by which ZooKeeper decides\nwho will lead and the mechanism by which the leader is subsequently discovered):\n\n.. code-block:: bash\n\n $ sudo fle-dump --iface eth0 -c\n Notification(\n timestamp=00:57:12:593254,\n src=10.0.0.1:32938,\n dst=10.0.0.2:3888,\n state=following,\n leader=3,\n zxid=0,\n election_epoch=0,\n peer_epoch=0,\n config=\n server.0=10.0.0.1:2889:3888:participant;0.0.0.0:2181\n server.1=10.0.0.2:2889:3888:participant;0.0.0.0:2181\n server.2=10.0.0.3:2889:3888:participant;0.0.0.0:2181\n server.3=10.0.0.4:2889:3888:participant;0.0.0.0:2181\n server.4=10.0.0.5:2889:3888:participant;0.0.0.0:2181\n version=10010d4d6\n )\n Notification(\n timestamp=00:57:12:595525,\n src=10.0.0.2:3888,\n dst=10.0.0.1:32938,\n state=looking,\n leader=1,\n zxid=4296326153,\n election_epoch=1,\n peer_epoch=1,\n config=\n server.0=10.0.0.1:2889:3888:participant;0.0.0.0:2181\n server.1=10.0.0.2:2889:3888:participant;0.0.0.0:2181\n server.2=10.0.0.3:2889:3888:participant;0.0.0.0:2181\n server.3=10.0.0.4:2889:3888:participant;0.0.0.0:2181\n server.4=10.0.0.5:2889:3888:participant;0.0.0.0:2181\n version=10010d4d6\n )\n ...\n\nNote: for initial messages to be visible you'll need the patch available\nat [ZOOKEEPER-2098](https://issues.apache.org/jira/browse/ZOOKEEPER-2098 \"ZOOKEEPER-2098\"),\nif you are using ZooKeeper prior to ZooKeeper 3.5.1-rc2.\n\nNote: if you are using Linux 3.14 or later, you'll need to disable [TCP Auto Corking](http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=f54b311142a92ea2e42598e347b84e1655caf8e3) by running `echo 0 > /proc/sys/net/ipv4/tcp_autocorking`.\n\nIf you are interested in debugging ZAB (ZooKeeper Atomic Broadcast protocol), you can use\nzab-dump:\n\n.. code-block:: bash\n\n $ sudo zab-dump --iface eth0\n\n Request(\n cxid=6,\n dst=10.0.0.1:2889,\n length=112,\n req_type=CreateRequest,\n session_id=0x34e4d23b0d70001,\n src=10.0.0.2:48604,\n timestr=22:54:31:995353,\n zxid=-1,\n )\n Proposal(\n cxid=6,\n dst=10.0.0.2:48603,\n length=110,\n session_id=0x34e4d23b0d70001,\n src=10.0.0.1:2889,\n timestr=22:54:31:995753,\n txn_time=1435816471995,\n txn_type=CreateRequest,\n txn_zxid=8589934619,\n zxid=8589934619,\n )\n Proposal(\n cxid=6,\n dst=10.0.0.1:48604,\n length=110,\n session_id=0x34e4d23b0d70001,\n src=10.0.0.1:2889,\n timestr=22:54:31:995755,\n txn_time=1435816471995,\n txn_type=CreateRequest,\n txn_zxid=8589934619,\n zxid=8589934619,\n )\n Proposal(\n cxid=6,\n dst=10.0.0.3:48605,\n length=110,\n session_id=0x34e4d23b0d70001,\n src=10.0.0.1:2889,\n timestr=22:54:31:995770,\n txn_time=1435816471995,\n txn_type=CreateRequest,\n txn_zxid=8589934619,\n zxid=8589934619,\n )\n Ack(\n dst=10.0.0.1:2889,\n length=20,\n src=10.0.0.1:48603,\n timestr=22:54:31:996068,\n zxid=8589934619,\n )\n Ack(\n dst=10.0.0.1:2889,\n length=20,\n src=10.0.0.1:48604,\n timestr=22:54:31:996316,\n zxid=8589934619,\n )\n Ack(\n dst=10.0.0.1:2889,\n length=20,\n src=10.0.0.1:48604,\n timestr=22:54:31:996318,\n zxid=8589934619,\n )\n Commit(\n dst=10.0.0.1:48603,\n length=20,\n src=10.0.0.1:2889,\n timestr=22:54:31:996193,\n zxid=8589934619,\n )\n Commit(\n dst=10.0.0.2:48604,\n length=20,\n src=10.0.0.1:2889,\n timestr=22:54:31:996195,\n zxid=8589934619,\n )\n Commit(\n dst=10.0.0.2:48605,\n length=20,\n src=10.0.0.1:2889,\n timestr=22:54:31:996442,\n zxid=8589934619,\n )\n\n### OS X ###\nAlthough no one has tried running this on OS X in production, it can be used for some parts of development and unit testing. If you are running on OS X, please run the following to install the correct dependencies:\n\n.. code-block:: bash\n\n $ pip install -r ./osx_requirements.txt\n\n### Dependencies ###\n* Python 2.7 (Py3K soon)\n* ansicolors\n* dpkt-fix\n* hexdump\n* psutil>=2.1.0\n* scapy==2.4.2\n* six\n* twitter.common.app\n* twitter.common.collections\n* twitter.common.exceptions\n* twitter.common.http\n* twitter.common.log\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/twitter/zktraffic", "keywords": "ZooKeeper Sniffer Stats", "license": "Apache", "maintainer": "", "maintainer_email": "", "name": "zktraffic", "package_url": "https://pypi.org/project/zktraffic/", "platform": "", "project_url": "https://pypi.org/project/zktraffic/", "project_urls": { "Homepage": "https://github.com/twitter/zktraffic" }, "release_url": "https://pypi.org/project/zktraffic/0.2.0/", "requires_dist": [ "ansicolors", "dpkt (==1.9.2)", "hexdump", "psutil (==5.6.1)", "scapy (==2.4.2)", "six (==1.12.0)", "tabulate", "twitter.common.app (==0.3.11)", "twitter.common.collections (==0.3.11)", "twitter.common.decorators (==0.3.11)", "twitter.common.exceptions (==0.3.11)", "twitter.common.http (==0.3.11)", "twitter.common.log (==0.3.11)", "dpkt (==1.9.2) ; extra == 'test'", "mock ; extra == 'test'", "nose ; extra == 'test'", "twitter.common.log ; extra == 'test'", "scapy (==2.4.2) ; extra == 'test'", "six (==1.12.0) ; extra == 'test'" ], "requires_python": "", "summary": "ZooKeeper protocol analyzer and stats gathering daemon", "version": "0.2.0" }, "last_serial": 5730758, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "5372fc437b11f8f9f4c8048f7d3269b3", "sha256": "5b8f6784d3801df5688df59fe36dca93e802bc8083d95c387c00d636ded376e9" }, "downloads": -1, "filename": "zktraffic-0.1.0.tar.gz", "has_sig": false, "md5_digest": "5372fc437b11f8f9f4c8048f7d3269b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27133, "upload_time": "2014-10-07T05:01:57", "url": "https://files.pythonhosted.org/packages/58/80/740955949283316136896f6903672069e44332dac9dc95bfc721e1034d01/zktraffic-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "44f44db44d61fc5486171f215d1b6dcd", "sha256": "ba498f6fbae92ad362dc8620f7faaa40218e1fe6208fbc77dc8c2e08f68dd35f" }, "downloads": -1, "filename": "zktraffic-0.1.1.tar.gz", "has_sig": false, "md5_digest": "44f44db44d61fc5486171f215d1b6dcd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33561, "upload_time": "2015-01-07T23:45:09", "url": "https://files.pythonhosted.org/packages/7a/a5/d7e69df3e0da84e7ff959186e56358b51d316f9a9c61cc541d246e540a62/zktraffic-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "c74e8182f7175a0ddcd8c4a61656277f", "sha256": "9ba4767e6187e7108f1c92a0c997d1e951f2c54ae62225ebe68e265398d75937" }, "downloads": -1, "filename": "zktraffic-0.1.2.tar.gz", "has_sig": false, "md5_digest": "c74e8182f7175a0ddcd8c4a61656277f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36354, "upload_time": "2015-02-18T06:03:19", "url": "https://files.pythonhosted.org/packages/bd/ef/b23f6a14ca425ee8591cf460fc0abba551bcb22c4d669b0ab4bb2d9852dc/zktraffic-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "b7be64231c4af70e6eb9de4ddc5016f2", "sha256": "56f4402e4a0ee80afdedfad2f4d8861910309ab60ddc1d5113a03e305b31c4b1" }, "downloads": -1, "filename": "zktraffic-0.1.3.tar.gz", "has_sig": false, "md5_digest": "b7be64231c4af70e6eb9de4ddc5016f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40361, "upload_time": "2015-06-04T18:22:02", "url": "https://files.pythonhosted.org/packages/50/11/1cd6941e3fca9d718b5d4be11f0795c49c6c2f58513a5d703a2da95036e0/zktraffic-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "876753b11e7731bc091ffa4fb0a67d89", "sha256": "0c6bac25cf6458a67a52f267434f5f516eadb67e78e7feffb4d50f230acf050c" }, "downloads": -1, "filename": "zktraffic-0.1.4.tar.gz", "has_sig": false, "md5_digest": "876753b11e7731bc091ffa4fb0a67d89", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39966, "upload_time": "2015-06-18T17:55:51", "url": "https://files.pythonhosted.org/packages/ef/a2/24258e1cef03b8db27bba01de1df0088b969d592b8335f6ff83645386f86/zktraffic-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "f118ff7bb954ec026ffd28bb7bfb6132", "sha256": "c6b7b8da6dfed035566e415f14b795de51af8304f360a74a77c75ef70b4cb364" }, "downloads": -1, "filename": "zktraffic-0.1.5.tar.gz", "has_sig": false, "md5_digest": "f118ff7bb954ec026ffd28bb7bfb6132", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40466, "upload_time": "2015-06-22T20:56:06", "url": "https://files.pythonhosted.org/packages/77/06/8d969d61ff4bcea377ec6d3159f5e1945449d7935ccc0c3fca69456ca6c4/zktraffic-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "4adb903d3e3711ac5d0e3708fe832406", "sha256": "9ff18f5e93798f534552a786f95429a8fd2ae8de79f9788c0f41deee2ff9bc6e" }, "downloads": -1, "filename": "zktraffic-0.1.6.tar.gz", "has_sig": false, "md5_digest": "4adb903d3e3711ac5d0e3708fe832406", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43542, "upload_time": "2015-07-10T23:34:09", "url": "https://files.pythonhosted.org/packages/91/f0/a4e29f1fb9aa4d62083f812004645615d55f23b8a31814266bb10f6bbb36/zktraffic-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "da8151db296f2fd1b26f7a72724d15bf", "sha256": "0a380aa63900b3f0053147d55f538a44d0cdee4c3e4fd8dd7bd19ea4d062d949" }, "downloads": -1, "filename": "zktraffic-0.1.7.tar.gz", "has_sig": false, "md5_digest": "da8151db296f2fd1b26f7a72724d15bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50500, "upload_time": "2015-12-03T22:56:08", "url": "https://files.pythonhosted.org/packages/a0/29/b7647cb80b19fa964db5035ad6ce68dbd8380298adbf2b96fd8d2bf1fa73/zktraffic-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "0eb630cbbd932646a91b504d9f382ec0", "sha256": "5c0a8e4de12b22e5608b62c576363d2a1cfafeacba2cef3856252d8a88c6e6fc" }, "downloads": -1, "filename": "zktraffic-0.1.8.tar.gz", "has_sig": false, "md5_digest": "0eb630cbbd932646a91b504d9f382ec0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50709, "upload_time": "2015-12-07T21:24:50", "url": "https://files.pythonhosted.org/packages/9c/d4/7f7befc7b7e5cde5dfa8614e1d8c2cd23e6d353743530bf3767ec97ccca9/zktraffic-0.1.8.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "88416aee31fd837708eb52a6e533ffef", "sha256": "5fade9f60be9a1ef6c85359095819d14ae85c7a45a431dbf2ed6a74ae597f758" }, "downloads": -1, "filename": "zktraffic-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "88416aee31fd837708eb52a6e533ffef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 82310, "upload_time": "2019-08-26T13:05:41", "url": "https://files.pythonhosted.org/packages/fa/9d/6ba9d35dd3db8df43dfe2a9424675e16ca11094c3604300dc8eb618daa5e/zktraffic-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "199a02ab7dcd55ee4cac3e24b45f7a88", "sha256": "32f50b399c7e439b091fe9025cab090bb87a3756bcaa4ec67c1908197aa75568" }, "downloads": -1, "filename": "zktraffic-0.2.0.tar.gz", "has_sig": false, "md5_digest": "199a02ab7dcd55ee4cac3e24b45f7a88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50901, "upload_time": "2019-08-26T13:05:43", "url": "https://files.pythonhosted.org/packages/4e/0c/3a8f57ac79d453814cbfb7947ca7058c432ee02d047c5af72e68c59171f0/zktraffic-0.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "88416aee31fd837708eb52a6e533ffef", "sha256": "5fade9f60be9a1ef6c85359095819d14ae85c7a45a431dbf2ed6a74ae597f758" }, "downloads": -1, "filename": "zktraffic-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "88416aee31fd837708eb52a6e533ffef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 82310, "upload_time": "2019-08-26T13:05:41", "url": "https://files.pythonhosted.org/packages/fa/9d/6ba9d35dd3db8df43dfe2a9424675e16ca11094c3604300dc8eb618daa5e/zktraffic-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "199a02ab7dcd55ee4cac3e24b45f7a88", "sha256": "32f50b399c7e439b091fe9025cab090bb87a3756bcaa4ec67c1908197aa75568" }, "downloads": -1, "filename": "zktraffic-0.2.0.tar.gz", "has_sig": false, "md5_digest": "199a02ab7dcd55ee4cac3e24b45f7a88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50901, "upload_time": "2019-08-26T13:05:43", "url": "https://files.pythonhosted.org/packages/4e/0c/3a8f57ac79d453814cbfb7947ca7058c432ee02d047c5af72e68c59171f0/zktraffic-0.2.0.tar.gz" } ] }