Compare commits
40 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8824f711bb | |||
| f2d97832b5 | |||
| 855e57a651 | |||
| 0b3310b82e | |||
| e8cf7f29f0 | |||
| 62e3b001f0 | |||
| f655cebdf3 | |||
| ee492d97ad | |||
| a16d841d98 | |||
| f015662fd6 | |||
| 021dcae59b | |||
| c6dc34c821 | |||
| 88c3958aba | |||
| 24ebfac360 | |||
| b3c200b443 | |||
| 3e2b50bf60 | |||
| 89c142930e | |||
| 1515d9695c | |||
| f1f7b1081d | |||
| 07533e29f9 | |||
| 4d60a24fac | |||
| 4dc6bc661a | |||
| 0d7fd5e356 | |||
| da16b0685d | |||
| febbdea8c8 | |||
| a45c3d875c | |||
| 64d01c0a80 | |||
| bf5fe594e4 | |||
| 5cfe3c6d6d | |||
| 773e3c0f57 | |||
| b1c91343ef | |||
| 3f821ca9d0 | |||
| d296b3107e | |||
| f606c58204 | |||
| 6c1d986814 | |||
| da056b09c7 | |||
| 4eefe54be0 | |||
| b0ed7650c5 | |||
| 3d89cbd4c6 | |||
| 0f2d19f3c7 |
@@ -1,13 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace Kiri\Rpc\Note;
|
namespace Kiri\Rpc\Annotation;
|
||||||
|
|
||||||
use Kiri\Abstracts\Config;
|
use Kiri\Abstracts\Config;
|
||||||
use Kiri\Core\Network;
|
use Kiri\Core\Network;
|
||||||
use Kiri\Exception\ConfigException;
|
use Kiri\Exception\ConfigException;
|
||||||
use Kiri\Kiri;
|
use Kiri;
|
||||||
use Kiri\Rpc\RpcManager;
|
use Kiri\Rpc\RpcManager;
|
||||||
use Note\Attribute;
|
use Kiri\Annotation\Attribute;
|
||||||
use ReflectionException;
|
use ReflectionException;
|
||||||
|
|
||||||
#[\Attribute(\Attribute::TARGET_CLASS)] class JsonRpc extends Attribute
|
#[\Attribute(\Attribute::TARGET_CLASS)] class JsonRpc extends Attribute
|
||||||
@@ -23,10 +23,11 @@ use ReflectionException;
|
|||||||
* @param array $tags
|
* @param array $tags
|
||||||
* @param array $meta
|
* @param array $meta
|
||||||
* @param array $checkOptions
|
* @param array $checkOptions
|
||||||
|
* @param string $checkUrl
|
||||||
*/
|
*/
|
||||||
public function __construct(public string $service, public string $driver, public array $tags = [], public array $meta = [], public array $checkOptions = [])
|
public function __construct(public string $service, public string $driver, public array $tags = [], public array $meta = [], public array $checkOptions = [], public string $checkUrl = '')
|
||||||
{
|
{
|
||||||
$this->uniqueId = preg_replace('/(\w{11})(\w{4})(\w{3})(\w{8})(\w{6})/', '$1-$2-$3-$4-$5', md5(__DIR__ . '.' . md5(Network::local())));
|
$this->uniqueId = preg_replace('/(\w{11})(\w{4})(\w{3})(\w{8})(\w{6})/', '$1-$2-$3-$4-$5', md5(__DIR__ . 'Annotation' . md5(Network::local())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -49,6 +50,9 @@ use ReflectionException;
|
|||||||
protected function create(): array
|
protected function create(): array
|
||||||
{
|
{
|
||||||
$rpcPort = Config::get('rpc.port');
|
$rpcPort = Config::get('rpc.port');
|
||||||
|
if (empty($this->checkUrl)) {
|
||||||
|
$this->checkUrl = Network::local() . ":" . Config::get('rpc.port');
|
||||||
|
}
|
||||||
$defaultConfig = [
|
$defaultConfig = [
|
||||||
"ID" => "rpc.json.{$this->service}." . $this->uniqueId,
|
"ID" => "rpc.json.{$this->service}." . $this->uniqueId,
|
||||||
"Name" => $this->service,
|
"Name" => $this->service,
|
||||||
@@ -68,7 +72,7 @@ use ReflectionException;
|
|||||||
"Name" => "service " . $this->service . ' health check',
|
"Name" => "service " . $this->service . ' health check',
|
||||||
"Notes" => "Script based health check",
|
"Notes" => "Script based health check",
|
||||||
"ServiceID" => $this->service,
|
"ServiceID" => $this->service,
|
||||||
"TCP" => Network::local() . ":" . Config::get('rpc.port'),
|
"TCP" => $this->checkUrl,
|
||||||
"Interval" => "5s",
|
"Interval" => "5s",
|
||||||
"Timeout" => "1s",
|
"Timeout" => "1s",
|
||||||
"DeregisterCriticalServiceAfter" => "30s"
|
"DeregisterCriticalServiceAfter" => "30s"
|
||||||
@@ -6,7 +6,7 @@ use Exception;
|
|||||||
use Kiri\Abstracts\Component;
|
use Kiri\Abstracts\Component;
|
||||||
use Kiri\Context;
|
use Kiri\Context;
|
||||||
use Kiri\Exception\ConfigException;
|
use Kiri\Exception\ConfigException;
|
||||||
use Kiri\Kiri;
|
use Kiri;
|
||||||
use Kiri\Pool\Alias;
|
use Kiri\Pool\Alias;
|
||||||
use Kiri\Pool\Pool;
|
use Kiri\Pool\Pool;
|
||||||
use Swoole\Client;
|
use Swoole\Client;
|
||||||
@@ -4,6 +4,7 @@ namespace Kiri\Rpc;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
use JetBrains\PhpStorm\Pure;
|
||||||
use Throwable;
|
use Throwable;
|
||||||
|
|
||||||
class InvalidRpcParamsException extends \Exception
|
class InvalidRpcParamsException extends \Exception
|
||||||
@@ -15,7 +16,7 @@ class InvalidRpcParamsException extends \Exception
|
|||||||
* @param int $code
|
* @param int $code
|
||||||
* @param Throwable|null $previous
|
* @param Throwable|null $previous
|
||||||
*/
|
*/
|
||||||
public function __construct($message = "", $code = 0, Throwable $previous = null)
|
#[Pure] public function __construct(string $message = "", int $code = 0, Throwable $previous = null)
|
||||||
{
|
{
|
||||||
parent::__construct($message, -32602, $previous);
|
parent::__construct($message, -32602, $previous);
|
||||||
}
|
}
|
||||||
@@ -4,10 +4,10 @@ namespace Kiri\Rpc;
|
|||||||
|
|
||||||
|
|
||||||
use Exception;
|
use Exception;
|
||||||
use Http\Message\ServerRequest;
|
use Kiri\Message\ServerRequest;
|
||||||
use Http\Message\Stream;
|
use Kiri\Message\Stream;
|
||||||
use Kiri\Core\Number;
|
use Kiri\Core\Number;
|
||||||
use Kiri\Kiri;
|
use Kiri;
|
||||||
use Kiri\Pool\Pool;
|
use Kiri\Pool\Pool;
|
||||||
use Psr\Http\Client\ClientExceptionInterface;
|
use Psr\Http\Client\ClientExceptionInterface;
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
@@ -54,7 +54,6 @@ abstract class JsonRpcConsumers implements OnRpcConsumerInterface
|
|||||||
/**
|
/**
|
||||||
* @param array $data
|
* @param array $data
|
||||||
* @return ServerRequestInterface
|
* @return ServerRequestInterface
|
||||||
* @throws \ReflectionException
|
|
||||||
*/
|
*/
|
||||||
private function requestBody(array $data): ServerRequestInterface
|
private function requestBody(array $data): ServerRequestInterface
|
||||||
{
|
{
|
||||||
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
namespace Kiri\Rpc;
|
namespace Kiri\Rpc;
|
||||||
|
|
||||||
use Note\Inject;
|
use Kiri\Annotation\Inject;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Http\Message\Response;
|
use Kiri\Message\Response;
|
||||||
use Http\Message\Stream;
|
use Kiri\Message\Stream;
|
||||||
use Kiri\Abstracts\Config;
|
use Kiri\Abstracts\Config;
|
||||||
use Kiri\Exception\ConfigException;
|
use Kiri\Exception\ConfigException;
|
||||||
use Psr\Http\Client\ClientInterface;
|
use Psr\Http\Client\ClientInterface;
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
namespace Kiri\Rpc;
|
namespace Kiri\Rpc;
|
||||||
|
|
||||||
use Http\Message\Response;
|
use Kiri\Message\Response;
|
||||||
use Http\Message\Stream;
|
use Kiri\Message\Stream;
|
||||||
use Psr\Http\Client\ClientInterface;
|
use Psr\Http\Client\ClientInterface;
|
||||||
use Psr\Http\Message\RequestInterface;
|
use Psr\Http\Message\RequestInterface;
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
@@ -2,30 +2,29 @@
|
|||||||
|
|
||||||
namespace Kiri\Rpc;
|
namespace Kiri\Rpc;
|
||||||
|
|
||||||
use Http\Constrict\RequestInterface;
|
use Kiri;
|
||||||
use Http\Handler\Handler;
|
|
||||||
use Http\Handler\Router;
|
|
||||||
use Http\Message\ServerRequest;
|
|
||||||
use Kiri\Abstracts\Component;
|
use Kiri\Abstracts\Component;
|
||||||
use Kiri\Abstracts\Config;
|
use Kiri\Abstracts\Config;
|
||||||
|
use Kiri\Annotation\Annotation;
|
||||||
|
use Kiri\Annotation\Inject;
|
||||||
use Kiri\Consul\Agent;
|
use Kiri\Consul\Agent;
|
||||||
use Kiri\Context;
|
use Kiri\Context;
|
||||||
use Kiri\Events\EventProvider;
|
|
||||||
use Kiri\Exception\ConfigException;
|
use Kiri\Exception\ConfigException;
|
||||||
use Kiri\Kiri;
|
use Kiri\Message\Constrict\RequestInterface;
|
||||||
use Note\Inject;
|
use Kiri\Message\Handler\Handler;
|
||||||
use Note\Note;
|
use Kiri\Message\Handler\Router;
|
||||||
|
use Kiri\Message\ServerRequest;
|
||||||
|
use Kiri\Server\Contract\OnCloseInterface;
|
||||||
|
use Kiri\Server\Contract\OnConnectInterface;
|
||||||
|
use Kiri\Server\Contract\OnReceiveInterface;
|
||||||
|
use Kiri\Server\Events\OnBeforeShutdown;
|
||||||
|
use Kiri\Server\Events\OnServerBeforeStart;
|
||||||
|
use Kiri\Server\Events\OnTaskerStart;
|
||||||
|
use Kiri\Server\Events\OnWorkerExit;
|
||||||
|
use Kiri\Server\Events\OnWorkerStart;
|
||||||
use Psr\Container\ContainerExceptionInterface;
|
use Psr\Container\ContainerExceptionInterface;
|
||||||
use Psr\Container\NotFoundExceptionInterface;
|
use Psr\Container\NotFoundExceptionInterface;
|
||||||
use Psr\Http\Message\ServerRequestInterface;
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
use ReflectionException;
|
|
||||||
use Server\Contract\OnCloseInterface;
|
|
||||||
use Server\Contract\OnConnectInterface;
|
|
||||||
use Server\Contract\OnReceiveInterface;
|
|
||||||
use Server\Events\OnBeforeShutdown;
|
|
||||||
use Server\Events\OnServerBeforeStart;
|
|
||||||
use Server\Events\OnTaskerStart;
|
|
||||||
use Server\Events\OnWorkerStart;
|
|
||||||
use Swoole\Coroutine;
|
use Swoole\Coroutine;
|
||||||
use Swoole\Coroutine\Channel;
|
use Swoole\Coroutine\Channel;
|
||||||
use Swoole\Server;
|
use Swoole\Server;
|
||||||
@@ -43,25 +42,28 @@ class RpcJsonp extends Component implements OnConnectInterface, OnReceiveInterfa
|
|||||||
public Router $router;
|
public Router $router;
|
||||||
|
|
||||||
|
|
||||||
#[Inject(Note::class)]
|
#[Inject(Annotation::class)]
|
||||||
public Note $annotation;
|
public Annotation $annotation;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private RpcManager $manager;
|
private RpcManager $manager;
|
||||||
|
|
||||||
|
|
||||||
|
private int $timerId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public function init(): void
|
public function init(): void
|
||||||
{
|
{
|
||||||
$this->eventProvider->on(OnBeforeShutdown::class, [$this, 'onBeforeShutdown']);
|
$this->getEventProvider()->on(OnBeforeShutdown::class, [$this, 'onBeforeShutdown']);
|
||||||
|
|
||||||
scan_directory(APP_PATH . 'rpc', 'Rpc');
|
scan_directory(APP_PATH . 'rpc', 'app\Rpc');
|
||||||
|
|
||||||
$this->eventProvider->on(OnWorkerStart::class, [$this, 'consulWatches']);
|
$this->getEventProvider()->on(OnWorkerStart::class, [$this, 'consulWatches']);
|
||||||
$this->eventProvider->on(OnServerBeforeStart::class, [$this, 'register']);
|
$this->getEventProvider()->on(OnWorkerExit::class, [$this, 'onWorkerExit']);
|
||||||
|
$this->getEventProvider()->on(OnServerBeforeStart::class, [$this, 'register']);
|
||||||
|
|
||||||
$this->manager = Kiri::getDi()->get(RpcManager::class);
|
$this->manager = Kiri::getDi()->get(RpcManager::class);
|
||||||
}
|
}
|
||||||
@@ -72,12 +74,11 @@ class RpcJsonp extends Component implements OnConnectInterface, OnReceiveInterfa
|
|||||||
* @return void
|
* @return void
|
||||||
* @throws ContainerExceptionInterface
|
* @throws ContainerExceptionInterface
|
||||||
* @throws NotFoundExceptionInterface
|
* @throws NotFoundExceptionInterface
|
||||||
* @throws ReflectionException
|
|
||||||
*/
|
*/
|
||||||
public function onBeforeShutdown(OnBeforeShutdown $beforeShutdown)
|
public function onBeforeShutdown(OnBeforeShutdown $beforeShutdown)
|
||||||
{
|
{
|
||||||
$doneList = $this->manager->doneList();
|
$doneList = $this->manager->doneList();
|
||||||
$agent = $this->container->get(Agent::class);
|
$agent = $this->getContainer()->get(Agent::class);
|
||||||
foreach ($doneList as $value) {
|
foreach ($doneList as $value) {
|
||||||
$agent->service->deregister($value['config']['ID']);
|
$agent->service->deregister($value['config']['ID']);
|
||||||
$agent->checks->deregister($value['config']['Check']['CheckId']);
|
$agent->checks->deregister($value['config']['Check']['CheckId']);
|
||||||
@@ -95,19 +96,24 @@ class RpcJsonp extends Component implements OnConnectInterface, OnReceiveInterfa
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$async_time = (int)Config::get('consul.async_time', 1000);
|
$async_time = (int)Config::get('consul.async_time', 1000);
|
||||||
Timer::tick($async_time, static function ($timeId) {
|
$this->timerId = Timer::tick($async_time, static function () {
|
||||||
if (env('state', 'start') == 'exit') {
|
|
||||||
Timer::clear($timeId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Kiri::getDi()->get(RpcManager::class)->tick();
|
Kiri::getDi()->get(RpcManager::class)->tick();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param OnWorkerExit $exit
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function onWorkerExit(OnWorkerExit $exit)
|
||||||
|
{
|
||||||
|
Timer::clear($this->timerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param OnServerBeforeStart $server
|
* @param OnServerBeforeStart $server
|
||||||
* @throws ReflectionException
|
|
||||||
*/
|
*/
|
||||||
public function register(OnServerBeforeStart $server)
|
public function register(OnServerBeforeStart $server)
|
||||||
{
|
{
|
||||||
@@ -201,7 +207,7 @@ class RpcJsonp extends Component implements OnConnectInterface, OnReceiveInterfa
|
|||||||
private function dispatch($data): array
|
private function dispatch($data): array
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
[$handler, $params] = $this->container->get(RpcManager::class)->get($data['service'], $data['method']);
|
[$handler, $params] = $this->getContainer()->get(RpcManager::class)->get($data['service'], $data['method']);
|
||||||
if (is_null($handler)) {
|
if (is_null($handler)) {
|
||||||
throw new \Exception('Method not found', -32601);
|
throw new \Exception('Method not found', -32601);
|
||||||
} else {
|
} else {
|
||||||
@@ -266,10 +272,9 @@ class RpcJsonp extends Component implements OnConnectInterface, OnReceiveInterfa
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Server $server
|
|
||||||
* @param int $fd
|
* @param int $fd
|
||||||
*/
|
*/
|
||||||
public function onClose(Server $server, int $fd): void
|
public function onClose(int $fd): void
|
||||||
{
|
{
|
||||||
// TODO: Implement onClose() method.
|
// TODO: Implement onClose() method.
|
||||||
}
|
}
|
||||||
@@ -2,11 +2,12 @@
|
|||||||
|
|
||||||
namespace Kiri\Rpc;
|
namespace Kiri\Rpc;
|
||||||
|
|
||||||
use Http\Handler\Handler;
|
use Exception;
|
||||||
|
use Kiri;
|
||||||
use Kiri\Abstracts\Component;
|
use Kiri\Abstracts\Component;
|
||||||
use Kiri\Consul\Agent;
|
use Kiri\Consul\Agent;
|
||||||
use Kiri\Consul\Health;
|
use Kiri\Consul\Health;
|
||||||
use Kiri\Kiri;
|
use Kiri\Message\Handler\Handler;
|
||||||
use ReflectionException;
|
use ReflectionException;
|
||||||
|
|
||||||
class RpcManager extends Component
|
class RpcManager extends Component
|
||||||
@@ -22,11 +23,12 @@ class RpcManager extends Component
|
|||||||
/**
|
/**
|
||||||
* @param $serviceName
|
* @param $serviceName
|
||||||
* @return void
|
* @return void
|
||||||
* @throws ReflectionException
|
* @throws Exception
|
||||||
* @throws \Exception
|
|
||||||
*/
|
*/
|
||||||
public function async($serviceName): void
|
public function async($serviceName): void
|
||||||
{
|
{
|
||||||
|
$this->reRegister($serviceName);
|
||||||
|
|
||||||
$lists = Kiri::getDi()->get(Health::class)->setQuery('passing=true')->service($serviceName);
|
$lists = Kiri::getDi()->get(Health::class)->setQuery('passing=true')->service($serviceName);
|
||||||
if ($lists->getStatusCode() != 200) {
|
if ($lists->getStatusCode() != 200) {
|
||||||
return;
|
return;
|
||||||
@@ -42,20 +44,45 @@ class RpcManager extends Component
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws ReflectionException
|
* @param string $serviceName
|
||||||
|
* @return void
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public function reRegister(string $serviceName)
|
||||||
|
{
|
||||||
|
$config = $this->_rpc[$serviceName] ?? [];
|
||||||
|
if (empty($config)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$service = Kiri::getDi()->get(Agent::class);
|
||||||
|
|
||||||
|
$info = $service->service->service_health($config['config']['ID']);
|
||||||
|
if ($info->getStatusCode() == 200) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$service->service->register($config['config']);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function tick(): void
|
public function tick(): void
|
||||||
{
|
{
|
||||||
|
try {
|
||||||
foreach ($this->_rpc as $name => $list) {
|
foreach ($this->_rpc as $name => $list) {
|
||||||
$this->async($name);
|
$this->async($name);
|
||||||
}
|
}
|
||||||
|
} catch (\Throwable $throwable) {
|
||||||
|
$this->logger()->error(error_trigger_format($throwable));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $serviceName
|
* @param $serviceName
|
||||||
* @return array
|
* @return array
|
||||||
* @throws \Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function getServices($serviceName): array
|
public function getServices($serviceName): array
|
||||||
{
|
{
|
||||||
@@ -112,12 +139,12 @@ class RpcManager extends Component
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws ReflectionException
|
|
||||||
*/
|
*/
|
||||||
public function register()
|
public function register()
|
||||||
{
|
{
|
||||||
$agent = Kiri::getDi()->get(Agent::class);
|
$agent = Kiri::getDi()->get(Agent::class);
|
||||||
foreach ($this->_rpc as $list) {
|
foreach ($this->_rpc as $list) {
|
||||||
|
$agent->service->deregister($list['config']['ID']);
|
||||||
$data = $agent->service->register($list['config']);
|
$data = $agent->service->register($list['config']);
|
||||||
if ($data->getStatusCode() != 200) {
|
if ($data->getStatusCode() != 200) {
|
||||||
return;
|
return;
|
||||||
+2
-3
@@ -11,12 +11,11 @@
|
|||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.0",
|
"php": ">=8.0",
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"psr/http-client": "^1.0",
|
"psr/http-client": "^1.0"
|
||||||
"psr/http-message": "^1.0"
|
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"Kiri\\Rpc\\": "src/"
|
"Kiri\\Rpc\\": "./"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
use Kiri\Rpc\RpcJsonp;
|
use Kiri\Rpc\RpcJsonp;
|
||||||
use Kiri\Rpc\TestRpcService;
|
use Kiri\Rpc\TestRpcService;
|
||||||
use Server\Constant;
|
use Kiri\Server\Constant;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'rpc' => [
|
'rpc' => [
|
||||||
@@ -61,7 +61,7 @@ return [
|
|||||||
"node" => "t2.320",
|
"node" => "t2.320",
|
||||||
"checkId" => "service:redis1",
|
"checkId" => "service:redis1",
|
||||||
"name" => "Redis health check",
|
"name" => "Redis health check",
|
||||||
"notes" => "Script based health check",
|
"Annotations" => "Script based health check",
|
||||||
"status" => "passing",
|
"status" => "passing",
|
||||||
"serviceID" => "redis1",
|
"serviceID" => "redis1",
|
||||||
"definition" => [
|
"definition" => [
|
||||||
Reference in New Issue
Block a user