rstgroup/zf-grafana-module

与 Grafana API 集成。

dev-master 2017-09-15 09:35 UTC

This package is not auto-updated.

Last update: 2020-01-10 16:38:44 UTC


README

本模块通过其 HTTP APIs 与 Grafana 工具集成。

安装

composer require rstgroup/zf-grafana-module

然后使用 ZF 系统配置(config/application.config.php)将模块添加到您的应用程序中

return [
    'modules' => [
        'RstGroup\ZfGrafanaModule',
    ],
]

最后一步是提供数据库连接和 HTTP 客户端,以便库可以与其他服务通信。使用 Zend 的 Service Manager 的别名功能定义

  • \RstGroup\ZfGrafanaModule\Repository\DashboardApiRepositoryFactory::HTTP_CLIENT_SERVICE
    实现 Http\Client\HttpClient 接口的 HTTP 客户端
  • \RstGroup\ZfGrafanaModule\Repository\DashboardApiRepositoryFactory::REQUEST_FACTORY_SERVICE
    用于创建 HTTP 请求的请求工厂
  • \RstGroup\ZfGrafanaModule\Repository\DbalMetadataRepositoryFactory::SERVICE_CONNECTION
    存储仪表板元数据的数据库的 Doctrine DBAL 连接
  • \RstGroup\ZfGrafanaModule\Repository\DbalIdMappingRepositoryFactory::SERVICE_CONNECTION
    存储仪表板 ID 映射的数据库的 Doctrine DBAL 连接

仪表板

模块为您提供与指定的 Grafana 实例自动同步仪表板的功能。

使用

模块提供 CLI 命令

php public/index.php grafana migrate

目前不需要任何参数。所有关于仪表板的信息都是从应用程序的配置中获取的。

定义要同步的仪表板

默认情况下,脚本会扫描 build/dashboards 目录,寻找包含仪表板定义的 .json 文件。

搜索目录可以在配置文件中轻松更改,以下是一个示例

return [
    'dashboard-migrations' => [
        'repositories' => [
            \RstGroup\ZfGrafanaModule\Repository\FilesystemDirectoryRepository::class => [
                'path' => 'path/to/your/directory',
            ],
        ],
    ],
];

自定义仪表板定义源

还可以将仪表板定义存储在其他地方。为此,您需要做两件事

  • 实现您自己的 DashboardApiRepository,在 Zend 的 Service Manager 中定义它,并配置模块使用它

    return [
        'service_manager' => [
            'factories' => [
                MyOwnRepository::class => MyOwnRepositoryFactory::class,
            ]
        ],
        'dashboard-migrations' => [
            'source-repository' => [
                'service' => MyOwnRepository::class,
            ]
        ]
    ]
  • 实现您自己的 DashboardIdsProvider,该提供程序将返回从您的自定义存储库中获取的 ID。然后只需通过接口名称别称您的自定义提供程序

    return [
        'service_manager' => [
            'aliases' => [
                \RstGroup\ZfGrafanaModule\Controller\Helper\DashboardIdsProvider::class => \Your\Custom\Provider::class,
            ];
        ]
    ];

定义远程存储库

为了使同步工作,您需要传递 Grafana API 的基本 URL 和 API 密钥。这些值应通过配置文件(或者更好的是,如果您的应用程序可以从其中获取配置,则在 Consul 中)传递给应用程序的配置

return [
    'dashboard-migrations' => [
        'repositories' => [
            \RstGroup\ZfGrafanaModule\Repository\DashboardApiRepository::class => [
                'url'     => 'http://url.to.grafana.com/api',
                'api-key' => 'grafana-api-key',
            ],
        ],
    ],
];

接下来,您需要 HTTP 客户端(实现 PSR 的客户端接口)和 HTTP 消息工厂实现(见 http://docs.php-http.org/en/latest/message/message-factory.html

您应该在应用程序的配置中传递这些信息,别称预定义的服务名称,如下例所示

return [
    'service_manager' => [
        'aliases' => [
            \RstGroup\ZfGrafanaModule\Repository\DashboardApiRepositoryFactory::HTTP_CLIENT_SERVICE       => \Http\Adapter\Guzzle6\Client::class,
            \RstGroup\ZfGrafanaModule\Repository\DashboardApiRepositoryFactory::REQUEST_FACTORY_SERVICE => \Http\Message\MessageFactory\GuzzleMessageFactory::class,
        ]
    ]
];

元数据

为什么有元数据?

模块需要存储仪表板的元数据。这是因为 Grafana API 为发布的仪表板生成额外的标识符和参数。

首先是仪表板的别名。别名是仪表板标题的文本表示,且对URL安全。别名在API的GET请求中作为必需参数使用,因此可以视为标识符。

其次是仪表板的ID,在仪表板创建后立即生成。ID是一个正整数。它用于更新请求(POST)中,并需要在JSON中的仪表板定义中提供,因此也可以视为仪表板的标识符——第二个,不那么重要的标识符 :))

下一个元数据参数是仪表板的版本——每次更新后,版本都会增加。如果您尝试使用版本号较低的仪表板进行更新,API将拒绝更改。

最后一个参数是架构版本,它决定了定义架构的版本,因此Grafana实例可以确定其是否足够新,可以解析给定的仪表板定义。

存储

默认情况下——元数据存储在MySQL数据库中,因此需要为映射器别名Doctrine DBAL连接,以便映射器能够工作

return [
    'service_manager' => [
        'aliases' => [
            \RstGroup\ZfGrafanaModule\Repository\DbalIdMappingRepositoryFactory::SERVICE_CONNECTION => 'Your\Doctrine\Dbal\Connection'
        ]
    ]
]

表应遵循以下定义

CREATE TABLE dashboard_metadata (
  dashboard_id VARCHAR(255) NOT NULL PRIMARY KEY,
  grafana_id INT NOT NULL,
  dashboard_version INT NOT NULL,
  dashboard_schema_version INT DEFAULT NULL
) DEFAULT CHARACTER SET 'utf8';

ID映射

由于别名是在Grafana API的侧创建的,因此需要保留本地-远程ID映射。

默认情况下,仪表板的本地标识符是其定义的文件名。映射存储在数据库中,因此需要为映射器别名Doctrine DBAL连接,以便映射器能够工作

return [
    'service_manager' => [
        'aliases' => [
            \RstGroup\ZfGrafanaModule\Repository\DbalIdMappingRepositoryFactory::SERVICE_CONNECTION => 'Your\Doctrine\Dbal\Connection'
        ]
    ]
]

映射表应遵循以下定义

CREATE TABLE dashboard_id_mapping (
  local_id VARCHAR(255) NOT NULL PRIMARY KEY,
  remote_id VARCHAR(255) NOT NULL
) DEFAULT CHARACTER SET 'utf8';