Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

可扩展遥测指南

可扩展遥测概述

安装 Apstra 设备驱动程序和遥测收集器,以收集可用于 分析探测的其他遥测数据。设备驱动程序使 Apstra 能够连接到 NOS 并收集遥测数据。Apstra 附带适用于 EOS、NX-OS、Ubuntu 和 CentOS 的驱动程序。要为此处未列出的操作系统添加驱动程序,请联系 瞻博网络支持

遥测收集器是帮助收集扩展遥测数据的 Python 模块。以下部分介绍用于创建遥测收集器和使用新收集器扩展 Apstra 的管道。你需要熟悉Python才能开发收集器。

设置开发环境

要访问遥测收集器(位于 aos_developer_sdk 存储库中),请联系 瞻博网络支持。将您开发的任何新收集器贡献到存储库中。

为了保持系统环境完整,我们建议您使用虚拟环境来隔离所需的 Python 包(用于开发和测试)。您可以从 https://support.juniper.net/support/downloads/?p=apstra/ 下载基本开发环境 aos_developer_sdk.run。要加载环境,请执行:

此命令加载 aos_developer_sdk Docker 映像。映像加载完成后,将打印用于启动环境的命令。按照命令指定的方式启动容器环境。要安装依赖项,请执行:

现在,已为开发和测试收集器设置了环境。环境中还安装了 Apstra SDK 包,例如设备驱动程序和 REST 客户端。

开发收集器

若要开发遥测收集器,请 顺序指定以下内容。

  1. 为其开发收集器的服务 - 确定服务是什么。例如,该服务可以从交换机接口收集接收和传输的字节。标识服务的名称。禁止使用为内置服务保留的服务名称(ARP、BGP、接口、主机名、路由、MAC、XCVR、LAG、MLAG)。
  2. 提供给 Apstra 的数据架构 - 确定收集器输出的结构方式。键值对的集合应发布到 Apstra。确定每个项目是什么,即在语法和语义上什么是键/值。对于上述示例,key 是标识接口名称的字符串。该值是一个 JSON 字符串,JSON 有两个键“rx”和“tx”,两个键都有一个整数值。
  3. 为其开发收集器的网络操作系统 (NOS) - 收集器插件特定于 NOS。在编写收集器之前,请确定需要收集器的 NOS。
  4. 如何从设备获取所需数据 - 标识可在设备中用于检索所需信息的命令。例如,“show interfaces”命令提供来自 Arista EOS 设备的接收和传输字节。
  5. 存储架构路径 - 每个项目中的键和值的类型决定了存储架构路径。所选收集器的类型决定了应用程序的存储架构。存储架构定义服务返回的数据的高级结构。可以使用下表确定收集器的存储架构路径:
    表 1:确定存储架构路径
    键类型 值类型 存储架构路径
    字符串 字符串 aos.sdk.telemetry.schemas.generic
    字符串 字典 aos.sdk.telemetry.schemas.generic
    字典 字符串 aos.sdk.telemetry.schemas.iba_string_data
    字典 整数 aos.sdk.telemetry.schemas.iba_integer_data
  6. 应用程序架构 - 应用程序架构定义发布到框架的每个项的架构。应用程序架构使用草稿 4 版本的 json 架构表示。每个项目都由一个键和值组成。下表指定了两个示例项。
    表 2:示例项及其存储架构路径
    存储架构路径 示例项
    aos.sdk.telemetry.schemas.generic
    {
        "identity": "eth0",
        "value": "up",
    }
    aos.sdk.telemetry.schemas.iba_string_data
    {
        "key": {
            "source_ip": "10.1.1.1",
            "dest_ip": "10.1.1.2",
        },
        "value": "up",
    }
    注意:

    * 具有通用存储架构的收集器返回的项目应使用键“标识”指定键值,并使用键“值”指定值。

    * 具有基于 IBA 模式的收集器返回的项目应使用键“key”指定键值,并使用键“value”指定值。

    使用此信息,可以编写 JSON 架构。下表将上面指定的示例项映射到其相应的 JSON 架构。

    表 3:示例应用程序架构
    示例项 应用程序架构
    {
        "identity": "eth0",
        "value": "up",
    }
    {
        "type": "object",
        "properties": {
            "identity": {
                "type": "string",
            },
            "value": {
                "type": "string",
            }
        }
    }
    {
    {
        "key": {
            "source_ip": "10.1.1.1",
            "dest_ip": "10.1.1.2",
        },
        "value": "up",
    }
    {
        "type": "object",
        "properties": {
            "key": {
                "type": "object",
                "properties": {
                    "source_ip": {
                        "type": "string",
                        "format": "ipv4"
                    },
                    "dest_ip": {
                        "type": "string",
                        "format": "ipv4"
                    },
                    "required": ["source_ip", "dest_ip"],
                }
            },
            "value": {
                "type": "string",
            }
        }
    }
    {

    您可以使用 JSON 架构中可用的构造指定更复杂的架构。更新文件中的架构 aos_developer_sdk/aosstdcollectors/aosstdcollectors/json_schemas/<service_name>.json

    注意:

    从 Apstra 版本 4.0.1 开始,您可以通过 GUI 导入服务架构

写收集器

Collector 是一个必须派生自 aos.sdk.system_agent.base_telemetry_collector 的类。BaseTelemetryCollector。使用逻辑重写收集器的 收集 方法,以便:

从设备收集数据

收集器中的设备驱动程序实例提供对设备执行命令的方法。例如,大多数 Apstra 设备驱动程序都提供用于执行命令和返回输出的方法get_jsonget_text

注意:

aos_developer_sdk环境的设备驱动程序已预安装。您可以探索可用于收集数据的方法。例如:

解析数据

收集的数据需要根据 Apstra 框架和上面确定的服务模式进行解析和重新格式化。具有通用存储架构的收集器遵循以下结构:

具有基于 IBA 的模式的收集器遵循以下结构:

在上述结构中,发布的数据有多个项目。每个项目都有一个键和一个值。例如,要发布接口特定信息,要发布到框架的每个接口都有一个标识/键值对。

注意:

如果要使用第三方包解析从设备获取的数据,请在路径中列出 Python 包和版本。

<aos_developer_sdk>/aosstdcollectors/requirements_<NOS>.txt.依赖项安装的软件包不会与 Apstra 软件使用的软件包冲突。Apstra 安装的软件包可在开发环境中找到 /etc/aos/python_dependency.txt

将数据发布到框架

根据所需的架构收集和分析数据时,将数据发布到框架。您可以使用 post_data 收集器中提供的方法。它接受一个参数,即应发布到框架的数据。

存储库中的文件夹 aos_developer_sdk/aosstdcollectors/aosstdcollectors 包含每个 NOS 的文件夹。将收集器添加到与 NOS 匹配的文件夹中。从 Apstra 版本 4.1.0 开始不再支持 Cumulus,但此示例仅供说明之用。例如,要为 Cumulus 编写收集器,请将收集器 aos_developer_sdk/aosstdcollectors/aosstdcollectors/cumulus添加到 ,并以服务名称命名文件。例如,如果服务名称为 interface_in_out_bytes,则将文件 interface_in_out_bytes.py命名为 。

除了定义收集器类之外,还要在收集器文件中定义函数 collector_plugin 。该函数接受一个参数并返回实现的收集器类。

例如,基于通用存储架构的收集器如下所示:

基于 IBA 存储模式的收集器如下所示:

单元测试收集器

存储库中的文件夹 aos_developer_sdk/aosstdcollectors/test 包含基于 NOS 的文件夹。将测试添加到与 NOS 匹配的文件夹中。例如,对积云收集器的测试将添加到 aos_developer_sdk/aosstdcollectors/test/cumulus中。建议使用前缀 test_命名单元测试。

现有基础结构实现用于模拟设备驱动程序命令响应的 Pytest 夹具 collector_factory 。测试开发的一般流程如下。

  1. 使用收集器工厂获取收集器实例和模拟的 Apstra 框架。收集器工厂将您编写的收集器类作为输入。
  2. 模拟设备响应。
  3. 调用收集方法。
  4. 验证发布到模拟 Apstra 框架的数据。

例如,测试如下所示:

要运行测试,请执行:

此命令执行存储库中的所有测试。

包收集器

所有收集器均基于 NOS 进行打包。要生成所有包,请在 执行 make aos_develop_sdk。您可以在 上 aos_developer_sdk/dist找到构建包。包构建大致可分为:

说明
内置收集器包 这些包具有前缀 aosstdcollectors_builtin_。要根据参考设计从设备收集遥测数据,Apstra 需要本节 <deviceblah> 中列出的服务。内置收集器包包含这些服务的收集器。这些包是基于每个 NOS 生成的。
自定义收集器包

这些软件包的名称中带有前缀 aosstdcollectors_custom_ 。这些包是基于每个 NOS 生成的。名为 aosstdcollectors_custom_<NOS>-0.1.0-py2-none-any.whl 的软件包包含开发的收集器。

Apstra SDK 设备驱动程序包

这些包具有前缀 apstra_devicedriver_。这些包是基于每个 NOS 生成的。系统会为 NOS 生成在 Apstra 中默认不可用的软件包。

上传包

如果 Apstra 软件未提供适用于您的设备操作系统 (NOS) 的内置收集器包和 Apstra SDK 设备驱动程序,则必须将它们上传到 Apstra 服务器。

如果您使用的是异机解决方案,并且您的 NOS 不是 EOS,则必须上传内置收集器包。

上传包含收集器的软件包,并将其分配给设备系统代理或系统代理配置文件。

使用遥测收集器

设置遥测服务注册表

注册表将服务映射到其应用程序架构和存储架构路径。可以使用 REST 终结点 /api/telemetry-service-registry管理遥测服务注册表。如果不为特定服务添加注册表项,则无法为服务启用收集器。在使用服务时,无法修改服务的注册表项。

注意:

执行 make时,所有应用程序模式都打包到 dist 文件夹中的 tar 文件 (json_schemas.tgz) 中。使用 apstra-cli,您可以选择导入 .tgz 文件中的所有架构。

启动收集器

要启动服务,请将 POST API /api/systems/<system_id>/services 与以下三个参数一起使用:

参数  
Input_data 作为输入提供给收集器的数据。默认值为“无”。
区间 运行服务的时间间隔。默认为 120 秒。
名字 服务的名称。
注意:

您还可以通过 apstra-cli 实用程序管理收集器。

删除收集器

要删除服务,请使用 删除 API /api/systems/<system_id>/services/<service_name>

获取收集的数据

要检索收集的数据,请使用 GET API /api/systems/<system_id>/services/<service_name>/data。仅保存上次迭代中收集的数据。数据不会在 Apstra 重启后保留。

列出正在运行的收集器服务

要检索设备上启用的服务列表,请使用 GET API /api/systems/<system_id>/services