Home

Awesome

horse-healthcheck

Middleware for health check in HORSE

For install in your project using boss:

$ boss install github.com/CarlosHe/horse-healthcheck

Sample Horse HealthCheck

uses Horse, Horse.HealthCheck;

begin
  THorse.Use('/healthcheck', HorseHealthCheck);

  THorseHealthCheckManager
    .AddCheck(
      'ping',
      THorseHealthCheckResult.Healthy(
        'basic ping-pong health check'
      )
    );
    
  THorse.Listen(9000);
end.

HealthCheck json result

By calling the route /healthcheck, you will result in the following structure

{
    "health_check": [
        {
            "ping": {
                "status": "Healthy",
                "description": "basic ping-pong health check",
                "exception": null,
                "data": {},
                "duration": "00:00:00:000"
            }
        }
    ]
}

Other methods of use

You can also create a class and implement the IHorseHealthCheck interface

Defining the class in THorseHealthCheckManager

uses Horse, Horse.HealthCheck;

begin
  THorse.Use('/healthcheck', HorseHealthCheck);

  THorseHealthCheckManager
    .AddCheck<THorseHealthCheckPing>('ping');

  THorse.Listen(9000);
end.

Implementation of the IHorseHealthCheck interface

unit Horse.HealthCheck.Ping;

interface

uses
  Horse.HealthCheck;

type

  THorseHealthCheckPing = class(TInterfacedObject, IHorseHealthChecker)
  public
    { public declarations }
    function CheckHealth: THorseHealthCheckResult;
  end;

implementation

{ THorseHealthCheckPing }

function THorseHealthCheckPing.CheckHealth: THorseHealthCheckResult;
begin
  Result := THorseHealthCheckResult.Create(
    THorseHealthStatus.Healthy,
    'basic ping-pong health check'
  );
end;

end.

Knowing the structure of THorseHealthCheckResult

Some ways to create the result, see some examples:

creating a Healthy result with description:

function THorseHealthCheckPing.CheckHealth: THorseHealthCheckResult;
begin
  Result := THorseHealthCheckResult.Healthy('description');
end;

creating a Unhealthy result with description:

function THorseHealthCheckPing.CheckHealth: THorseHealthCheckResult;
begin
  Result := THorseHealthCheckResult.Healthy('description');
end;

creating a Degraded result with description:

function THorseHealthCheckPing.CheckHealth: THorseHealthCheckResult;
begin
  Result := THorseHealthCheckResult.Degraded('description');
end;

or using Create and passing the status with description:

function THorseHealthCheckPing.CheckHealth: THorseHealthCheckResult;
begin
  Result := THorseHealthCheckResult.Create(THorseHealthStatus.Healthy, 'description');
end;

You can also pass in the method arguments some extra information

function THorseHealthCheckPing.CheckHealth: THorseHealthCheckResult;
var
  LExtraJsonData: TJsonObject;
begin
  LExtraJsonData := TJsonObject.Create;

  LExtraJsonData.AddPair('extra', 'data');

  Result := THorseHealthCheckResult.Create(
    THorseHealthStatus.Degraded,
    'basic ping-pong health check',
    Exception.Create('Degraded'),
    LExtraJsonData
  );
end;

HealthCheck json result


{
    "health_check": [
        {
            "ping": {
                "status": "Degraded",
                "description": "basic ping-pong health check",
                "exception": "Degraded",
                "data": {
                    "extra": "data"
                },
                "duration": "00:00:00:000"
            }
        }
    ]
}