Search code examples
nestjshealth-check

NestJS: present response content from URL on healthcheck


I'm trying to develop a healthcheck endpoint with NestJS (in which I have no experience). One of the dependencies I want to check is Twilio's SMS service. So far, the best URL I've found to gather this information is https://status.twilio.com/api/v2/status.json. The problem here is that I don't want to merely ping this address, but to gather it's JSON response and present some of the information it provides, namely these:

Twilio status page JSON response

Is it possible, using (or not) the Terminus module? In the official docs I didn't find anything regarding this, only simpler examples using pingCheck / responseCheck: https://docs.nestjs.com/recipes/terminus


Solution

  • Although meanwhile the logic for this healthcheck has changed (and so this question became obsolete), this was the temporary solution I've found, before it happened (basically a regular endpoint using axios, as pointed out in one of the comments above):

    Controller

        import { Controller, Get } from '@nestjs/common';
        import { TwilioStatusService } from './twilio-status.service';
        
        @Controller('status')
        export class TwilioStatusController {
          constructor(private readonly twilioStatusService: TwilioStatusService) {}
        
          @Get('twilio')
          getTwilioStatus() {
            const res = this.twilioStatusService.getTwilioStatus();
            return res;
          }
        }
    

    Service

        import { HttpService } from '@nestjs/axios';
        import { Injectable } from '@nestjs/common';
        import { map } from 'rxjs/operators';
        
        @Injectable()
        export class TwilioStatusService {
          constructor(private httpService: HttpService) {}
        
          getTwilioStatus() {
            return this.httpService
              .get('https://status.twilio.com/api/v2/status.json')
              .pipe(map((response) => response.data.status));
          }
        }
    

    Of course this wasn't an optimal solution, since I had to do this endpoint + a separated one for checking MongoDB's availability (a regular NestJS healthcheck, using Terminus), the goal being an healthcheck that glued both endpoints together.