
Compartir:
Software Developer who loves building awesome tools and products. I currently work with Laravel, PHP and Vue.
Notificación de incidentes con PagerDuty y Vonage
Tiempo de lectura: 8 minutos
Aviso de caducidad del producto A partir del 31 de agosto de 2025, la Dispatch API de Vonage estará cerrada a nuevos usuarios, aunque el producto seguirá siendo compatible para los usuarios existentes. Si deseas crear una aplicación de mensajería con funcionalidad de conmutación por error, ahora la API de Messages API admite directamente la conmutación por error.
Para obtener información general sobre la función de conmutación por error de mensajes, consulte esta guía. Para obtener información sobre la migración de Dispatch API a Messages API Failover, consulte esta guía.
Si tiene más preguntas sobre esta eliminación de productos, póngase en contacto con nosotros en la dirección comunícate con nosotros en Slack de la comunidad de Vonage.
Introducción
PagerDuty es un sistema de gestión de informes de incidentes que proporciona notificaciones y escalamientos automáticos para ayudar a los equipos de ingeniería a detectar y solucionar problemas a medida que surgen con su infraestructura. En este post, vamos a ver cómo podemos utilizar Vonage para alertar a los miembros de un equipo de ingeniería cada vez que se produce un incidente en cualquiera de sus infraestructuras.
Usando la Dispatch API de Vonage, que ofrece una opción de conmutación automática por error, primero enviaremos notificaciones a través de Facebook Messenger como medio principal y luego SMS como opción alternativa.
Requisitos técnicos
Para seguirlo, necesitarás lo siguiente:
PHP versión 7.1 o superior
Laravel 5.8
Ngrok que te permite exponer tu servidor web local a Internet. Para obtener más información sobre cómo configurar su entorno local con Ngrok, puede consultar la documentación aquí.
A Facebook Account
A PagerDuty Account
Puesta en marcha
Para poder usar la Dispatch API, debemos hacer algunas cosas con nuestra cuenta de Vonage. Dirígete a tu panel de Vonage y en la sección Mensajes y envío, crea una nueva aplicación de mensajes.
new message app in dashboard
\
La URL de estado es el punto final del webhook al que Vonage hará una solicitud POST cada vez que enviemos notificaciones por SMS. Esto nos permitirá determinar la actualización del estado del SMS que se ha enviado, es decir, entregado, rechazado o enviado. Como usaremos Ngrok, la URL de estado debería ser algo como esto
qc43v7.ngrok.io/webhooks/status.La URL de entrada es el punto final al que Vonage realizará una solicitud cada vez que se reciban mensajes de entrada y debe tener un aspecto similar al siguiente
qc43v7.ngrok.io/webhooks/inbound-messageA continuación, genera un par de claves pública/privada. Esto descargará automáticamente el archivo de clave privada para usted también. Tome nota de este archivo, ya que lo necesitaremos en breve.
Cree la aplicación y anote el identificador de la misma. A continuación, se le pedirá que asocie números y cuentas externas a esta aplicación. Esto es totalmente opcional, por lo que puede ir sólo con el valor predeterminado y luego crear la aplicación.
Configuración de PagerDuty
Visite PagerDuty y crea una Account si aún no la tienes. También necesitaremos crear un Servicio. Un Servicio en PagerDuty representa cualquier cosa contra la que nos gustaría abrir incidentes. Puede ser una aplicación, un componente, o incluso un equipo. Así que cada vez que un nuevo incidente se produce en ese servicio, queremos enviar notificaciones webhook a un punto final en particular en nuestra aplicación.
En tu panel de control de PagerDuty, dirígete a Configuración -> Servicios y crea un nuevo Servicio.
pager duty dashboard
Dado que vamos a hacer uso de nuestra propia integración personalizada, seleccione utilizar nuestra API directamente para el tipo de integración y, a continuación, seleccione Events API V2 y rellena el resto de detalles necesarios. Puedes leer más sobre cómo crear un servicio en PagerDuty aquí.
A continuación, cuando haya creado correctamente el servicio, en la pestaña Integraciones, seleccione Nueva extensión y asígnele el tipo Generic V2 webhook. La sección de detalles consistirá en el endpoint de nuestra aplicación donde queremos recibir las notificaciones de PagerDuty y debería ser algo como qc43v7.ngrok.io/webhooks/incident
pager duty
Configuración de Laravel
Usaremos Composer para instalar un nuevo proyecto Laravel. Desde la línea de comandos, crea un nuevo proyecto Laravel usando el siguiente comando:
Rutas y controlador
Edite el routes/web.php con el siguiente código:
<?php
Route::post('/webhooks/inbound-message', 'WebhookController@inboundMessage');
Route::post('/webhooks/status', 'WebhookController@status');
Route::post('/webhooks/incident', 'WebhookController@report');El ataque de falsificación de petición de sitio cruzado es un tipo de ataque malicioso mediante el cual se llevan a cabo comandos no autorizados en nombre de un usuario autenticado. Para prevenir este tipo de ataques, Laravel genera automáticamente un Csrf token para cada usuario autenticado que ayuda a validar que el usuario autenticado es el que realmente realiza una petición a la aplicación. Sin embargo, dado que estas peticiones vendrán de fuera de la aplicación y confiamos en la fuente, necesitamos deshabilitar la validación Csrf validación para estas rutas. El middleware VerifyCsrfToken se utiliza para validar todos los tokens. Afortunadamente, el middleware acepta un except que contiene una lista de todas las rutas para las que deshabilitar la verificación CSRF.
Edite el archivo app\Http\Middleware\VerifyCsrfToken.php con el siguiente código:
protected $except = [
'/webhooks/*'
];A continuación, ejecute el siguiente comando para crear un controlador:
php artisan make:controller WebhookController Esto generará un WebhookController.php en el directorio app\Http\Controllers directorio. Editar el archivo con el siguiente código:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Jobs\ReportIncident;
class WebhookController extends Controller
{
public function inboundMessage(Request $request)
{
return Log::debug('Inbound Message', $request->all());
}
public function status(Request $request)
{
return Log::debug('Status', $request->all());
}
public function report(Request $request)
{
Log::debug('Incident', $request->all());
dispatch(new ReportIncident());
return response('Webhook received');
}
}Para el inboundMessage() y status() simplemente registramos los datos de la solicitud de Vonage en el archivo de registro que Laravel proporciona. El método report() envía un trabajo ReportIncident que crearemos en breve. Este trabajo es responsable de activar las notificaciones por SMS utilizando un Wrapper personalizado alrededor de la API de Vonage.
Cómo vincular Facebook con tu Account de Vonage
Para poder enviar mensajes desde Vonage a Facebook, primero deberás vincular una página de Facebook asociada con tu Account de Facebook a tu cuenta de Vonage. Puedes aprender cómo hacerlo aquí.
Cuando hayas terminado con la vinculación, envía un mensaje desde tu Account de Facebook a la página de Facebook. Como se trata de un mensaje entrante, Vonage enviará una solicitud con los detalles del mensaje al punto final /webhooks/inbound-message que creamos anteriormente. Revisa tu archivo de registros y deberías ver una entrada similar a la siguiente:
Inbound Message{
"message_uuid":"0a2088d2-e028-4aa0-aa4a-ae11a6f82fb0",
"to":{
"id":"1923256201474167",
"type":"messenger"
},
"from":{
"id":"23037543461244470",
"type":"messenger"
},
"timestamp":"2019-08-06T21:56:16.887Z",
"direction":"inbound",
"message":{
"content":{
"type":"text",
"text":"Hello"
}
}
}El identificador del remitente de Facebook es el to.idmientras que el identificador del destinatario es el from.id. Toma nota de estos datos porque los necesitaremos en breve.
Creación de una envoltura personalizada
Dado que la Dispatch API aún se encuentra en versión beta al momento de escribir este tutorial, la biblioteca PHP de Vonage aún no ofrece soporte para ella. Como resultado, usaremos una envoltura personalizada para interactuar con la API de Nexmo. Para comenzar, primero necesitamos generar un Json Web Token (JWT) que usaremos para autenticarnos con la API.
Uso de la CLI de Vonageejecuta el siguiente comando:
vonage jwt --key_file=./private.key --app_id=VONAGE_APPLICATION_ID./private.key es la ruta al archivo de clave privada que se generó para usted cuando creó la aplicación Mensajes y Despacho, mientras que el campo app_id es el identificador de la aplicación que anotamos anteriormente. A continuación, copie la salida de este comando.
Variables de entorno y configuración
Añade el JWT que acabas de generar a tu .env, los datos de mensajería que anotamos antes y los números de teléfono que se encargarán de enviar y recibir notificaciones por SMS.
VONAGE_JWT = xxxx
FB_SENDER_ID = xxxx
FB_RECIPIENT_ID = xxxx
SMS_FROM = xxxx
SMS_TO = xxxxA continuación, haremos referencia a las variables de entorno que acabamos de definir a través de nuestro archivo de configuración. Dirígete al directorio config y en el archivo services.php añade un nuevo archivo Vonage array.
'vonage' => [
'jwt' => env('VONAGE_JWT'),
'fb_sender_id' => env('FB_SENDER_ID'),
'fb_recipient_id' => env('FB_RECIPIENT_ID'),
'sms_from' => env('SMS_FROM'),
'sms_to' => env('SMS_TO')
] Instalación de la dependencia
La única dependencia que tendrá nuestro proyecto es la de GuzzleHTTP que usaremos para hacer llamadas a la API. Ejecuta el siguiente comando para instalar la librería:
composer require guzzlehttp/guzzle Creación de la envoltura
En el directorio app cree un archivo Vonage.php y añádele el siguiente código:
<?php
namespace App;
use GuzzleHttp\Client;
class Vonage
{
protected $client;
public function __construct()
{
$this->client = $this->setUpClient();
}
protected function setUpClient()
{
$authBearer = 'Bearer ' . config('services.vonage.jwt');
return new Client([
'base_uri' => 'https://api.nexmo.com',
'headers' => [
'Authorization' => $authBearer,
'Content-Type' => 'application/json',
'Accept' => 'application/json'
]
]);
}
public function dispatch()
{
$response = $this->client->request('POST', '/v0.1/dispatch', [
'json' => [
'template' => 'failover',
'workflow' => [
[
'from' => [ 'type' => 'messenger','id' => config('services.vonage.fb_recipient_id')],
'to' => ['type' => 'messenger', 'id' => config('services.vonage.fb_sender_id')],
'message' => [
'content' => [
'type' => 'text',
'text' => 'An incident just occurred',
]
],
'failover' =>[
'expiry_time' => 15,
'condition_status' => 'read',
]
],
[
'from' => ['type' => 'sms','number' => config('services.vonage.sms_from')],
'to' => ['type' => 'sms','number' => config('services.vonage.sms_to')],
'message' => [
'content' => [
'type' => 'text',
'text' => 'An incident just occurred',
]
]
]
]
]
]);
return json_decode($response->getBody());
}
}En el método dispatch() hemos definido una plantilla de conmutación por error y un flujo de trabajo. Cada vez que se produzca un incidente a través de PagerDuty, recibiremos una notificación sobre el incidente en Facebook Messenger. Si la notificación no se lee en 15 segundos, se activa la condición de conmutación por error y se envía una notificación por SMS como alternativa.
Creación del puesto de trabajo
Ejecute el siguiente comando en el terminal para crear una nueva clase de trabajo:
php artisan make:job ReportIncidentEdite el archivo app\Http\Jobs\ReportIncident con el siguiente código:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Vonage;
class ReportIncident implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Execute the job.
*
* @return void
*/
public function handle(Voange $vonage)
{
$vonage->dispatch();
}
}El método handle() recibe la envoltura personalizada de Vonage que creamos anteriormente como dependencia y luego llamamos al método de envío de la clase.
Unirlo todo
Es hora de probar finalmente lo que hemos estado construyendo hasta ahora. Dirígete a tu panel de control de PagerDuty y crea un nuevo incidente.
incidents screenshot
Esto activará una notificación de webhook que se enviará al punto final que agregamos anteriormente a nuestra cuenta de PagerDuty que, a su vez, enviará un mensaje a la página de Facebook que vinculamos anteriormente a nuestra cuenta de Vonage. Suponiendo que todo salió bien, deberías inspeccionar tu archivo de registro ya que Vonage habría enviado una actualización con respecto al estado del mensaje que acabamos de enviar.
{
"message_uuid":"c1bcf89b-c16e-427f-a4b7-15816327832f",
"to":{
"id":"1923256201474167",
"type":"messenger"
},
"from":{
"id":"23037543461244470",
"type":"messenger"
},
"timestamp":"2019-08-08T01:53:07.922Z",
"status":"read",
"_links":{
"dispatch":{
"href":"v0.1/dispatch/15756412-30d6-4664-8a1e-abcd029ea7a4",
"dispatch_uuid":"15756412-30d6-4664-8a1e-abcd029ea7a4"
}
}
},
{
"template":"failover",
"status":"completed",
"timestamp":"2019-08-08T01:53:07.959Z",
"usage":{
"price":"0.003",
"currency":"EUR"
},
"dispatch_uuid":"15756412-30d6-4664-8a1e-abcd029ea7a4",
"_links":{
"messages":[
{
"message_uuid":"c1bcf89b-c16e-427f-a4b7-15816327832f",
"href":"v0.1/messages/c1bcf89b-c16e-427f-a4b7-15816327832f",
"channel":"messenger",
"usage":{
"price":"0.001",
"currency":"EUR"
},
"status":"read"
}
]
}
}En los registros anteriores, primero obtenemos una actualización de estado que nos informa de que se ha leído el mensaje y, a continuación, otra actualización de estado que nos informa de que se ha completado el flujo de trabajo de envío. Como el mensaje se leyó en 15 segundos, se cumplió la condición de conmutación por error, por lo que nunca se activó la notificación por SMS.
Para comprobar que la notificación SMS se enviará si no se cumple la condición de conmutación por error, puedes repetir el mismo proceso pero esta vez no leas la notificación de Facebook messenger. Descubrirás que esta vez sí se activará la notificación por SMS.
Conclusión
En este tutorial, hemos visto cómo podemos construir una integración personalizada con PagerDuty y Vonage para asegurar un sistema de alerta de emergencia en caso de emergencia. Puedes encontrar un enlace al repositorio de Github aquí.