跳转到主要内容

收集用户使用的库的隐私友好数据

项目描述

python-popularity-contest

codecov PyPI version GitHub Actions

在交互式计算环境中,确定哪些Python库正在使用对于管理用户环境非常有帮助。

python-popularity-contest收集用户正在积极使用的已安装库的预聚合、匿名化数据。

debian流行度竞赛命名

收集哪些数据?

我们希望收集足够的数据来帮助以下任务

  1. 删除从未导入过的未使用库。这些库可能不会对单个用户造成很大破坏,可以删除。

  2. 提供关于库“流行度”的汇总统计信息,为理解特定库对一组用户的重要性添加一个数据点。这有助于资金请求、更好的培训建议等。

为了收集尽可能少的数据,我们在源头进行聚合。只存储整体全局计数,不存储每个源的单个记录。这比存储每个用户或每个进程的记录要好得多。

我们拥有的数据将是每个库的时间序列,表示导入了该库中任何模块的进程的累积计数。这被设计为prometheus计数器,这是最终查询的编写方式。

收集基础设施

popularity_contest通过statsd协议发出度量标准,因此您需要一个正在运行的statsd服务器来收集和聚合这些信息。由于statsd仅存储全局聚合计数,所以我们从未收集我们所需之外的数据。

推荐的收集管道是

  1. 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"
    

    如果您想的话,可以在这里添加额外的标签。

  2. 一个从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()设置报告器之后导入的模块才会被计算。这减少了基线库(如IPythonsix)的噪声,这些库被所有人无形地使用。

Statsd服务器连接信息

popularity_contest期望设置以下环境变量。

  1. PYTHON_POPCONTEST_STATSD_HOST - 将statsd数据包发送到的服务器的主机名或IP地址。

  2. PYTHON_POPCONTEST_STATSD_PORT - 发送statsd数据包的端口号。使用推荐的prometheus_statsd设置,此端口号为9125

  3. 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 (6.4 kB 查看哈希值)

上传时间 源代码

构建分发

popularity_contest-0.4.1-py3-none-any.whl (7.1 kB 查看哈希值)

上传时间 Python 3

支持者