{"id":21018683,"url":"https://github.com/tal-tech/alarm-dog-php-sdk","last_synced_at":"2025-05-15T06:31:41.429Z","repository":{"id":56943730,"uuid":"307757554","full_name":"tal-tech/alarm-dog-php-sdk","owner":"tal-tech","description":"哮天犬告警平台PHP SDK","archived":false,"fork":false,"pushed_at":"2020-10-27T16:14:31.000Z","size":17,"stargazers_count":7,"open_issues_count":0,"forks_count":7,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-19T06:21:07.523Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tal-tech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-10-27T16:12:39.000Z","updated_at":"2021-06-27T11:48:26.000Z","dependencies_parsed_at":"2022-08-21T07:50:54.482Z","dependency_job_id":null,"html_url":"https://github.com/tal-tech/alarm-dog-php-sdk","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tal-tech%2Falarm-dog-php-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tal-tech%2Falarm-dog-php-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tal-tech%2Falarm-dog-php-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tal-tech%2Falarm-dog-php-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tal-tech","download_url":"https://codeload.github.com/tal-tech/alarm-dog-php-sdk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254288217,"owners_count":22045862,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-19T10:27:03.926Z","updated_at":"2025-05-15T06:31:38.977Z","avatar_url":"https://github.com/tal-tech.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 哮天犬告警通知SDK\n\n该SDK为哮天犬监控告警平台告警接口的PHP实现，增加了非常友好的方式使用，开箱即用。\n\n\n# 特性\n\n- 支持协程/非协程模式自动切换\n- 支持 Laravel5 ~ Laravel7 开箱即用\n- 支持 Lumen5 ~ Lumen7 开箱即用\n- 支持 Hyperf 开箱即用\n- 支持任意场景、框架使用\n- 支持告警请求发送失败重试\n- 支持记录请求日志\n\n\n# 安装\n\ncomposer require alarm-dog/alarm\n\n\n# 使用\n\n## Hyperf\n\n### 协程版Guzzle依赖安装\n\n```\ncomposer require hyperf/guzzle\n```\n\n\n### 配置文件发布\n\n```\n$ php bin/hyperf.php vendor:publish alarm-dog/alarm\n\nScanning app ...\nScan app completed, took 171.40197753906 milliseconds.\nDetected an available cache, skip the vendor scan process.\n[DEBUG] Event Hyperf\\Framework\\Event\\BootApplication handled by Hyperf\\Config\\Listener\\RegisterPropertyHandlerListener listener.\n[DEBUG] Event Hyperf\\Framework\\Event\\BootApplication handled by Hyperf\\Paginator\\Listener\\PageResolverListener listener.\n[DEBUG] Event Hyperf\\Framework\\Event\\BootApplication handled by Hyperf\\Di\\Listener\\BootApplicationListener listener.\n[DEBUG] Event Hyperf\\Framework\\Event\\BootApplication handled by Hyperf\\DbConnection\\Listener\\RegisterConnectionResolverListener listener.\n[alarm-dog/alarm] publishes [config] successfully.\n```\n\n配置文件在 `config/autoload/dog.php`，配置说明请参考下面章节 [配置项说明](#配置项说明)\n\n\n### 告警发送\n\n```php\nuse Dog\\Alarm\\Alarm;\nuse Dog\\Alarm\\Exception\\AlarmException;\n\n$content = [\n    'errno' =\u003e 10086,\n    'error' =\u003e '您的余额已不足',\n];\n\n/**\n * 方法一：直接实例化\n */\n$alarm = new Alarm();\n\ntry {\n    /** \n     * Alarm::report 方法返回 \\Psr\\Http\\Message\\ResponseInterface 对象\n     * @var \\Psr\\Http\\Message\\ResponseInterface $response\n     */\n    $response = $alarm-\u003ereport($content);\n    $array = $alarm-\u003eresolveResponse($response);\n    /**\n    $array 的结构请参考下方数组：\n    array(3) {\n    [\"data\"]=\u003e\n    array(2) {\n        [\"uuid\"]=\u003e\n        string(36) \"74bfd2d8-a1c9-434b-9098-50efc0f08ee2\"\n        [\"report_time\"]=\u003e\n        string(19) \"2020-06-26 20:50:19\"\n    }\n    [\"msg\"]=\u003e\n    string(7) \"success\"\n    [\"code\"]=\u003e\n    int(0)\n    }\n    */\n\n    // 如果要一气呵成，直接返回数组，可以使用\n    $array = $alarm-\u003eresolveResponse($alarm-\u003ereport($content));\n} catch (AlarmException $e) {\n    // 告警发送失败会抛出该异常\n}\n\n// 指定通知时间：\n$alarm-\u003ereport($content, time());\n\n// 指定告警级别\n$alarm-\u003ereport($content, null, Alarm::LEVEL_ERROR);\n\n// 指定临时通知人\n$alarmGroups = [1, 2];\n\n$channelDingGroup = new DingGroup([\n    ['webhook' =\u003e 'webhook1', 'secret' =\u003e 'secret1'],\n    ['webhook' =\u003e 'webhook2', 'secret' =\u003e 'secret2'],\n]);\n\n$channelYachGroup = new YachGroup();\n$channelYachGroup-\u003eaddRobot('webhook1', 'secret1')-\u003eaddRobot('webhook2', 'secret2')\n    -\u003eaddRobots([\n        ['webhook' =\u003e 'webhook3', 'secret' =\u003e 'secret3'],\n        ['webhook' =\u003e 'webhook4', 'secret' =\u003e 'secret4'],\n    ]); // 第二个参数为true是会进行全量替换，覆盖之前的，默认为false\n\n$channelDingWorker = new DingWorker([98664, 98665]);\n\n$channelEmail = new Email();\n$channelEmail-\u003eaddUid(98664)-\u003eaddUid(98665)-\u003eaddUids([98666, 98667]);\n\n$channels = [$channelDingGroup, $channelYachGroup];\n\n$receiver = new Receiver($alarmGroups, $channels);\n// 或者 $receiver = new Receiver([], $channels);\n// 或者 $receiver = new Receiver($alarmGroups);\n// 或者 $receiver = new Receiver();\n$receiver-\u003eaddAlarmGroup(1)\n    -\u003eaddAlarmGroup(3)\n    -\u003eaddAlarmGroups([1, 5], true) // 第二个参数为true是会进行全量替换，覆盖之前的，默认为false\n    -\u003eaddChannel($channelDingWorker)\n    -\u003eaddChannel(new DingWorker([1]))\n    -\u003eaddChannels($channels);\n\n// 以上仅用于展示SDK所有支持的方法\n\n// 指定临时通知人\n$alarm-\u003ereport($content, null, null, $receiver);\n\n/**\n * 方法二：使用make\n */\n// 剩下使用方法同方法一\n$alarm = make(Alarm::class);\n\n/**\n * 方法三：使用@Inject注解，推荐\n */\n\n/**\n * 注意Inject的命名空间引入\n * @Inject\n * @var Alarm\n */\nprotected $alarm;\n// 剩下使用方法同方法一\n$this-\u003ealarm-\u003ereport($content);\n\n/**\n * 方法四：使用容器Container，推荐\n */\n// 剩下使用方法同方法一\n$alarm = ApplicationContext::getContainer()-\u003eget(Alarm::class);\n// 或者\n$alarm = $container-\u003eget(Alarm::class);\n// 或者\n$alarm = $this-\u003econtainer-\u003eget(Alarm::class);\n\n\n/**\n * 测试告警发送\n * 用于验证taskid、token是否合法，不真实发送告警\n */\n\ntry {\n    $result = $alarm-\u003etest();\n\n    // 测试成功\n} catch (Throwable $e) {\n    // 测试失败\n    $errMsg = $e-\u003egetMessage();\n}\n```\n\n\n## Laravel\n\n### 配置文件发布\n\n```\n$ php artisan vendor:publish --provider=\"Dog\\Alarm\\Provider\\LaravelServiceProvider\"\n\nCopied File [/alarm-dog-php-sdk/config/dog.php] To [/config/dog.php]\nPublishing complete.\n```\n\n配置文件在 `config/dog.php`，配置说明请参考下面章节 [配置项说明](#配置项说明)\n\n\n### 告警发送\n\n```php\n/**\n * 方法一：直接实例化\n */\n// 请参考Hyperf中直接实例化\n\n/**\n * 方法二：使用app()助手函数，推荐\n */\n// 剩下使用方法同Hyperf章节中的方法一\n$alarm = app(Alarm::class);\n\n/**\n * 方法三：使用门面Facade，推荐\n */\nuse Dog\\Alarm\\Provider\\Laravel\\AlarmFacade;\n$response = AlarmFacade::report($content);\n$array = AlarmFacade::resolveResponse($response);\n$array = AlarmFacade::resolveResponse(AlarmFacade::report($content));\n// 可以看出 AlarmFacade 和 new Alarm() 使用方式一样，不过Facade提供静态方法访问，剩下使用方法同Hyperf章节中的方法一\n```\n\n\n## Lumen\n\n### 配置文件发布\n\nLumen框架不支持配置文件自动发布，需要在 `bootstrap/app.php` 中配置 `$app-\u003eregister(Dog\\Alarm\\Provider\\LumenServiceProvider::class);`，例如：\n\n```php\n/*\n|--------------------------------------------------------------------------\n| Register Service Providers\n|--------------------------------------------------------------------------\n|\n| Here we will register all of the application's service providers which\n| are used to bind services into the container. Service providers are\n| totally optional, so you are not required to uncomment this line.\n|\n*/\n\n// $app-\u003eregister(App\\Providers\\AppServiceProvider::class);\n// $app-\u003eregister(App\\Providers\\AuthServiceProvider::class);\n// $app-\u003eregister(App\\Providers\\EventServiceProvider::class);\n$app-\u003eregister(Dog\\Alarm\\Provider\\LumenServiceProvider::class);\n\n/*\n|--------------------------------------------------------------------------\n| Load The Application Routes\n|--------------------------------------------------------------------------\n|\n| Next we will include the routes file so that they can all be added to\n| the application. This will provide all of the URLs the application\n| can respond to, as well as the controllers that may handle them.\n|\n*/\n```\n\nmkdir config \u0026\u0026 cp vendor/alarm-dog/alarm/config/dog.php config/\n\n配置文件在 `config/dog.php`，配置说明请参考下面章节 [配置项说明](#配置项说明)\n\n\n### 告警发送\n\n```php\n/**\n * 方法一：直接实例化\n */\n// 请参考Hyperf中直接实例化\n\n/**\n * 方法二：使用app()助手函数，推荐\n */\n// 剩下使用方法同Hyperf章节中的方法一\n$alarm = app(Alarm::class);\n\n/**\n * 方法三：使用门面Facade，必须Lumen开启了对Facade的支持才行，推荐\n */\nuse Dog\\Alarm\\Provider\\Laravel\\AlarmFacade;\n$response = AlarmFacade::report($content);\n$array = AlarmFacade::resolveResponse($response);\n$array = AlarmFacade::resolveResponse(AlarmFacade::report($content));\n// 可以看出 AlarmFacade 和 new Alarm() 使用方式一样，不过Facade提供静态方法访问，剩下使用方法同Hyperf章节中的方法一\n```\n\n\n## 无框架或者其他框架\n\n不在自动支持的框架范围内，可以直接实例化，然后手动配置，例如：\n\n```php\n$alarm = new Alarm();\n$alarm-\u003esetTaskid(1);\n$alarm-\u003esetToken('token');\n// 如果需要修改调用域名，可以调用 $alarm-\u003esetBaseUri('http://alarm-dog-service.domain.com/alarm/report');\n// 如果需要配置guzzle，可以调用 $alarm-\u003esetGuzzleConfig($guzzleConfig); 配置格式请参考config/dog.php中guzzle下面的数组\n\n// 剩下使用方法同Hyperf章节中的方法一\n$response = $alarm-\u003ereport($content);\n```\n\n\n# 配置项说明\n\n默认配置文件使用了 `env` 函数，不是所有的框架都有该函数，请根据情况修改。\n\n在 Hyperf/Laravel/Lumen 框架中，直接在 `.env` 文件中配置正确的 `DOG_TASKID`、`DOG_TOKEN` 即可直接开始使用告警功能。\n\n\n```php\n\u003c?php\n\nuse GuzzleHttp\\MessageFormatter;\nuse GuzzleHttp\\Middleware;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n/**\n * 哮天犬配置文件\n */\n\nreturn [\n    // 告警任务ID\n    'taskid' =\u003e (int) env('DOG_TASKID'),\n    // 告警任务token\n    // 获取方法请参考：https://tal-tech.github.io/alarm-dog-docs/quick-start/alarm.html#step4%EF%BC%9A%E5%91%8A%E8%AD%A6%E6%8E%A5%E5%8F%A3%E6%B5%8B%E8%AF%95\n    'token' =\u003e env('DOG_TOKEN'),\n    // 告警地址，默认为：http://alarm-dog-service.domain.com\n    // 请参考文档中的环境说明：https://tal-tech.github.io/alarm-dog-docs/alarm/alarm-api.html\n    'base_uri' =\u003e env('DOG_BASE_URI'),\n    /**\n     * GuzzleHttp配置\n     */\n    'guzzle' =\u003e [\n        // guzzle原生配置选项,请参考文档：https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html\n        'options' =\u003e [\n            'http_errors' =\u003e false,\n            'connect_timeout' =\u003e 0,\n            'timeout' =\u003e 0,\n            // hyperf集成guzzle的swoole配置选项\n            'swoole' =\u003e [\n                'timeout' =\u003e 10,\n                'socket_buffer_size' =\u003e 1024 * 1024 * 2,\n            ],\n        ],\n        // guzzle中间件配置，请参考文档：https://guzzle-cn.readthedocs.io/zh_CN/latest/handlers-and-middleware.html\n        'middlewares' =\u003e [\n            // 失败重试中间件\n            'retry' =\u003e function ($container = null) {\n                return Middleware::retry(function ($retries, RequestInterface $request, ResponseInterface $response = null) {\n                    if (\n                        (! $response || $response-\u003egetStatusCode() \u003e= 500) \u0026\u0026 \n                        $retries \u003c 1\n                    ) {\n                        return true;\n                    }\n                    return false;\n                }, function () {\n                    return 10;\n                });\n            },\n            // // 请求日志记录中间件\n            // 'logger' =\u003e function ($container = null) {\n            //     // $format中{response}调用$response-\u003egetBody()会导致没有结果输出\n            //     $format = \"\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\\n{request}\\n\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\\n{res_headers}\\n--------\\n{error}\";\n            //     $formatter = new MessageFormatter($format);\n            //     // 在其他框架将$logger进行正确替换即可\n            //     // hyperf框架请使用下发方式获得Logger\n            //     // $logger = \\Hyperf\\Utils\\ApplicationContext::getContainer()\n            //     //     -\u003eget(\\Hyperf\\Logger\\LoggerFactory::class)\n            //     //     -\u003eget('influx-guzzle');\n            //     // laravel框架请使用下发方式获得Logger\n            //     // $logger = \\Illuminate\\Support\\Facades\\Log::getLogger();\n\n            //     return Middleware::log($logger, $formatter, 'debug');\n            // }\n        ],\n        // hyperf集成guzzle的连接池配置选项，非hyperf框架忽略\n        // 连接池可以参考hyperf官方的文档：https://hyperf.wiki/2.0/#/zh-cn/guzzle\n        'pool' =\u003e [\n            'option' =\u003e [\n                'max_connections' =\u003e 200,\n            ]\n        ]\n    ],\n];\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftal-tech%2Falarm-dog-php-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftal-tech%2Falarm-dog-php-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftal-tech%2Falarm-dog-php-sdk/lists"}