收集用户使用的库的隐私友好数据
项目描述
python-popularity-contest
在交互式计算环境中,确定哪些Python库正在使用对于管理用户环境非常有帮助。
python-popularity-contest收集用户正在积极使用的已安装库的预聚合、匿名化数据。
以debian流行度竞赛命名
收集哪些数据?
我们希望收集足够的数据来帮助以下任务
-
删除从未导入过的未使用库。这些库可能不会对单个用户造成很大破坏,可以删除。
-
提供关于库“流行度”的汇总统计信息,为理解特定库对一组用户的重要性添加一个数据点。这有助于资金请求、更好的培训建议等。
为了收集尽可能少的数据,我们在源头进行聚合。只存储整体全局计数,不存储每个源的单个记录。这比存储每个用户或每个进程的记录要好得多。
我们拥有的数据将是每个库的时间序列,表示导入了该库中任何模块的进程的累积计数。这被设计为prometheus计数器,这是最终查询的编写方式。
收集基础设施
popularity_contest
通过statsd协议发出度量标准,因此您需要一个正在运行的statsd服务器来收集和聚合这些信息。由于statsd仅存储全局聚合计数,所以我们从未收集我们所需之外的数据。
推荐的收集管道是
-
prometheus_statsd作为发送statsd服务器度量标准的目标。
一个将statsd指标转换为可用的Prometheus指标的映射规则,其中包含有用的标签以表示库名称。而不是许多名为
python_popcon_library_used_<library-name>
的指标,我们可以得到更好的python_popcon_library_used{library="<library-name>"}
。一个与默认statsd指标名称结构兼容的映射规则可能看起来像mappings: - match: "python_popcon.library_used.*" name: "python_popcon_library_used" labels: library: "$1"
如果您想的话,可以在这里添加额外的标签。
-
一个从prometheus_statsd抓取指标并以可查询形式存储的Prometheus服务器。使用Grafana之类的工具来可视化结果。
Kubernetes配置
如果您运行某种类型的Kubernetes集群,您可能已经运行了Prometheus用于指标收集。prometheus_statsd有一个Helm图表,可以在集群上轻松部署。以下是一个示例Helm配置
service:
# Tell prometheus server we want metrics scraped from port 9102
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9102"
statsd:
mappingConfig: |-
mappings:
- match: "python_popcon.library_used.*"
name: "python_popcon_library_used
labels:
library: "$1"
prometheus-statsd图表有一个错误,其中mappingConfig
在重启prometheus-statsd pod之前不起作用。
安装
popularity-contest
可以从PyPI获取,并可以使用pip
进行安装。
python3 -m pip install popularity-contest
它必须安装在我们想要进行度量的环境中。
用法
激活
安装后,必须显式设置popularity_contest报告器。您可以使用IPython启动脚本为所有IPython会话(以及因此Jupyter Notebook会话)启用报告。
启动脚本只需要一行
import popularity_contest.reporter
popularity_contest.reporter.setup_reporter()
由于度量通常由管理员设置而不是用户设置,因此脚本的推荐路径是位于sys.prefix
内部 - 虚拟环境的位置。例如,如果您在/opt/conda
中安装了conda环境,您可以将文件放在/opt/conda/etc/ipython/startup/000-popularity-contest.py
中。这样,它也会在任何特定于用户的IPython启动脚本之前加载。
只有在使用popularity_contest.reporter.setup_reporter()
设置报告器之后导入的模块才会被计算。这减少了基线库(如IPython
或six
)的噪声,这些库被所有人无形地使用。
Statsd服务器连接信息
popularity_contest
期望设置以下环境变量。
-
PYTHON_POPCONTEST_STATSD_HOST
- 将statsd数据包发送到的服务器的主机名或IP地址。 -
PYTHON_POPCONTEST_STATSD_PORT
- 发送statsd数据包的端口号。使用推荐的prometheus_statsd
设置,此端口号为9125
。 -
PYTHON_POPCONTEST_STATSD_PREFIX
- 每个statsd指标将具有的前缀,默认为python_popcon.library_used
。因此,statsd中的每个指标都将采用以下形式python_popcon.library_used.<library-name>
。您可以在该前缀中添加更多信息,并使用该信息在Prometheus中提取更多标签。例如,在zero-to-jupyterhub on k8s设置中,您可以这样添加有关当前hub命名空间的信息
hub: extraConfig: 07-popularity-contest: | import os pod_namespace = os.environ['POD_NAMESPACE'] c.KubeSpawner.environment.update({ 'PYTHON_POPCONTEST_STATSD_PREFIX': f'python_popcon.namespace.{pod_namespace}.library_used' })
可以将映射规则添加到
prometheus_statsd
中提取命名空间。mappings: - match: "python_popcon.namespace.*.library_used.*" name: "python_popcon_library_used" labels: namespace: "$1" library: "$2"
由此产生的Prometheus指标将采用以下形式
python_popcon_library_used{library="<library-name>", namespace="<namespace>"}</code>
隐私
收集有限的预聚合数据有助于尽可能保护隐私,并且在其他包含更多隐私信息的数据(如与活动时间相关的用户名等)的情况下可能足够。
但是,如果整个时间序列数据集可用,则仍然可能存在旁路攻击。单个用户可能有其使用的特定模块的特定模式,并且这可能可以通过足够多的分析来识别。如果某些库仅由特定用户唯一使用,则这种分析变得更容易。根据您的需求,可以进一步聚合数据、删除使用次数很少的模块的信息等方法,可以用来进一步匿名化此数据集。
项目详情
popularity-contest-0.4.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6e6ed6bdd01e0c2f21003ace9d996c1d2b705f3a94db261e9cbf0108b85c6193 |
|
MD5 | 54b081abb81ae7d166cb912dd7a8e38f |
|
BLAKE2b-256 | d6368ee2d03461aa021669aa8d6bd1b79c5380f75a3078ac49993a62e2f50912 |
popularity_contest-0.4.1-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c8e6f1546620cdb7170761f3fc1a3f90f837fb74d267f1d623ae41956526f5c8 |
|
MD5 | 49f16b27d9052f61cb78c97dae7f6317 |
|
BLAKE2b-256 | 634af038c414a564fc431e9ea895c2abc0d5ad81f5180f83ba3b08da58585362 |