Skip to content

Health indicator for server-side monitoring & balancing

License

Notifications You must be signed in to change notification settings

qiwi/health-indicator

Repository files navigation

Health indicator

CI Maintainability Test Coverage npm (tag)

Health indicator kit for server-side monitoring and balancing. Inspired by Part V. Spring Boot Actuator: Production-ready feature 47.6.2 Writing custom HealthIndicators

Install

    npm i @qiwi/health-indicator
    yarn add @qiwi/health-indicator

Usage

    import express from 'express'
    import {SemaphoreIndicator, Endpoint} from '@qiwi/health-indicator'
    
    const app = express()
    const indicator = new SemaphoreIndicator()
    const endpoint = new Endpoint(indicator)
    
    
    // Override 'getStatus' impl in accordance with your business logic
    indicator.getStatus = () => {
        ...
        return 'GREEN'
    }
    // ... or use separate class MyIndicator extends SemaphoreIndicator {...}
    // ... or just directly set indicator status property
    indicator.status = 'RED'
    
    app.get('/health', endpoint.middleware)  

Indicator composes aggregator logic, so its health status may be resolved from deps.

    const dep1 = new SemaphoreIndicator({status: 'RED', critical: true})
    const dep2 = new SemaphoreIndicator({status: 'GREEN'})
    const dep3 = new SemaphoreIndicator({deps: {dep1, dep2}})
    const indicator = new SemaphoreIndicator({deps: {dep3}})
    
    indicator.health()
    /*
       {
           status: 'RED',
           critical: true,
           deps: {
               status: 'RED',
               critical: true,
               deps: {
                   dep1: {
                        status: 'RED',
                        critical: true
                   },
                   dep2: {
                        status: 'GREEN'
                   }
               }
           }       
       }
    */

Customization

The lib exports only a couple of indicator implementations:

  • StandardIndicator (DOWN, OUT_OF_SERVICE, UNKNOWN, UP)
  • SemaphoreIndicator (RED, BROKEN, GREEN)

To declare any CustomIndicator you may easily extend the AbstractIndicator

import {AbstractIndicator} from '@qiwi/health-indicator'

const OK = 200
const SERVICE_UNAVAILABLE = 503

export const GREEN = 'GREEN'
export const RED = 'RED'
export const BROKEN = 'BROKEN'
export const STATUS_MAP = {GREEN, BROKEN, RED}
export const SEVERITY_ORDER = [RED, BROKEN, GREEN]

export const DEFAULT_HTTP_CODE = OK
export const HTTP_MAP = {[GREEN]: OK, [RED]: SERVICE_UNAVAILABLE, [BROKEN]: SERVICE_UNAVAILABLE}

export default class SemaphoreIndicator extends AbstractIndicator {
  static getDefaultStatus (): string {
    return BROKEN
  }

  static getDefaultHttpCode (): number {
    return DEFAULT_HTTP_CODE
  }

  static getHttpMap (): Object {
    return HTTP_MAP
  }

  static getStatusMap (): Object {
    return STATUS_MAP
  }

  static getSeverityOrder (): string[] {
    return SEVERITY_ORDER
  }
}

License

MIT