https://a.storyblok.com/f/270183/1368x665/541410e5f5/monitoring-application-health_24.png

JavaとVonage Messages APIでアプリケーションの健全性を監視する

最終更新日 February 21, 2023

所要時間:1 分

はじめに

アクチュエータのヘルス・レポートの作成と送信は、アプリケーションのスムーズな動作を保証する重要なプロセスです。

Spring BootはJavaアプリケーションを構築するための一般的なフレームワークで、アプリケーションを監視・管理するためのツール群を提供する。機能の1つにActuatorがあり、アプリケーションの健全性を監視するためのエンドポイントのセットを提供します。これらのエンドポイントを使用して、メモリ使用量、CPU使用量、応答時間など、アプリケーションのパフォーマンスに関する情報を取得できます。

Vonage Messages APIを利用することで、アプリケーションのヘルスレポートをテキストで送信したり、重大なヘルス問題が発生した場合に追加アラートとして指定した電話番号に代替メッセージを送信したりすることができます。この記事では、アプリケーションのヘルスレポートを生成するためにSpring Bootをセットアップし、Vonage Voice、SMS、Messages APIを設定する方法について説明する。

スプリングブート

Spring BootはJavaベースのフレームワークで、ビルドと実行が簡単なスタンドアロンのプロダクショングレードのアプリケーションを作成するために使用される。Spring Frameworkの上に構築され、そのモジュールを使って開発者に幅広い機能を提供する。フォロー このこの記事に従ってSpring Bootでプロジェクトをセットアップする。

Spring BootアプリケーションでActuatorを有効にするには、Spring Boot Actuatorスターター依存関係をプロジェクトに追加し、プロジェクトの application.propertiesファイルで設定する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

また、application.propertiesファイルに以下のプロパティを追加してください:

management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/actuator

その他の依存関係は lombokおよび web.ActuatorはSpring Bootアプリケーションを監視・管理するための包括的な機能を提供し、本番環境のSpring Bootアプリケーションには必須のツールです。

スプリングブート・アクチュエーター

アクチュエーターには、以下のような便利な機能がある:

  • ヘルスチェック:Actuatorはヘルスチェックエンドポイントを提供します。このエンドポイントは、現在実行中か利用不可か、すべての依存関係が利用可能かどうかなど、アプリケーションの健全性に関する情報を含む JSON オブジェクトを返します。

  • メトリクス:Actuatorは、リクエスト数、エラー数、応答時間などのメトリクスを取得するためのエンドポイントを提供します。

  • ロギング:Actuatorはログファイルを取得するためのエンドポイントを提供し、問題のトラブルシューティングに役立ちます。

  • コンフィギュレーション:アクチュエータは、アプリケーションがどのように設定されているかを理解し、問題をトラブルシューティングするためのエンドポイントを提供します。

  • スレッドダンプアクチュエーターは、スレッドに関する問題のトラブルシューティングのためのエンドポイントを提供します。

  • 監査:Actuatorは、リクエスト数などユーザーの行動を追跡するエンドポイントを提供します。

  • HTTP トレース:Actuatorは、すべてのHTTPリクエストとレスポンスのトレースを取得するためのエンドポイントを提供します。これは、アプリケーションのHTTPレイヤーに関連する問題のトラブルシューティングに役立ちます。

Vonage Messages API

Vonage Messages APIは、SMSやMMS、WhatsApp、Viber、Facebook Messengerなどのリッチメッセージサービスのようなメッセージの送受信を可能にするRESTfulウェブサービスのセットです。APIは使いやすく、他のシステムやサービスと統合しやすいように設計されています。

Vonageを始める

Vonage APIを使い始めるには、Vonageアカウントにサインアップし、そのアカウント内でアプリケーションを作成する必要があります。アプリケーションにはAPIキーとシークレットが割り当てられ、APIへのリクエストの認証に使用します。

アプリケーション・ヘルス・レポートの作成と送信 - 実装

簡単のために、サーバーサイドがリクエストに対して5xxエラーコードを生成するステータスを、アプリケーションで追跡することにする。HTTP Codes Standardによると、5XXは以下のようなエラーコードを意味します。 Internal Server Error.これは基本的に、アプリケーションに注意を要する課題があることを意味します。これを拡張して、アプリケーションからのリクエストに対して生成される、異なるレスポンスコードや多様なレスポンスコードを扱うことができます。

Actuatorからのレスポンスを保存したい場合は、モデルとリポジトリを作成する必要があります。モデルは、アクチュエータのJSON出力からキーと値のペアに対応するフィールドを持つことになります。これはこの記事では扱いません。

を実施する。HttpTraceRepository

クラス RemoteRepositoryを作成します。このクラスは "lombok" ライブラリの "Getter" および "Setter" アノテーションを使用しており、開発者が明示的に記述することなく、クラスのフィールドのゲッターおよびセッターメソッドを提供します。

このクラスには、HttpTraceRepository インターフェイスで実装する必要があるメソッドが 2 つあります: findAll() と add(HttpTrace trace) です。findAll() メソッドは HttpTrace オブジェクトの空のリストを返し、 add(HttpTrace trace) メソッドは HttpTrace 型のオブジェクトを受け取ります。ここであなたのロジックが登場します。この場合、トレースオブジェクトのレスポンスステータスコードをチェックします。 actuator500であれば、Vonage API経由でSMSメッセージを送信するサービスを呼び出します。WhatsAppメッセージを送信するように指示することもできる。

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.actuate.trace.http.HttpTrace;
import org.springframework.boot.actuate.trace.http.HttpTraceRepository;
import java.util.Collections;
import java.util.List;

@Getter
@Setter
public class RemoteRepository implements HttpTraceRepository {

   @Override
   public List<HttpTrace> findAll() {
       return Collections.emptyList();
   }

   @Override
   public void add(HttpTrace trace) {

       int responseStatusCode = trace.getResponse().getStatus();

       if (responseStatusCode == 500) {
           // call the services to send SMS and Messages via Vonage API
       }
   }
}

アクチュエーターConfigurationクラス

次に actuator.この設定クラスは ActuatorConfigこの設定クラスは、Springのアクチュエータ機能の特定の側面を設定します。

  • @Configuration:このクラスがSpringのアプリケーションコンテキスト用の@Bean定義を1つ以上含むことを示す。

  • @ConditionalOnWebApplication:このアノテーションはSpring Bootの機能で、アプリケーションがWebアプリケーションである場合にのみこの設定を適用することを示します。

  • @ConditionalOnProperty(prefix = "management.trace.http", name = "enabled", matchIfMissing = true):このアノテーションは、アプリケーションのコンフィギュレーションに特定のコンフィギュレーション・プロパティ(この場合は management.trace.http.enabled)が存在するかどうかをチェックします。プロパティが存在しない場合、デフォルトはtrueになります。

  • @EnableConfigurationProperties(HttpTraceProperties.class):このアノテーションは、アプリケーションの設定ファイルから指定されたクラス(HttpTraceProperties)のインスタンスに設定プロパティを自動的に注入するサポートを有効にするようSpringに指示します。

  • @AutoConfigureBefore(HttpTraceAutoConfiguration.class):このアノテーションは、HttpTraceAutoConfiguration の前に ActuatorConfig クラスを処理する必要があることを示します。

また、このクラスは traceRepository()でアノテーションされた @Bean@ConditionalOnMissingBean(HttpTraceRepository.class)これは、HttpTraceRepository型の他のBeanがアプリケーションコンテキストで定義されていない場合にのみ実行されることを意味します。このメソッドは RemoteRepositoryの新しいインスタンスを返します。 HttpTraceRepository.

import org.springframework.boot.actuate.trace.http.HttpTraceRepository;
import org.springframework.boot.actuate.autoconfigure.trace.http.HttpTraceProperties;
import org.springframework.boot.actuate.autoconfigure.trace.http.HttpTraceAutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnWebApplication
@ConditionalOnProperty(prefix = "management.trace.http", name = "enabled", matchIfMissing = true)
@EnableConfigurationProperties(HttpTraceProperties.class)
@AutoConfigureBefore(HttpTraceAutoConfiguration.class)
public class ActuatorConfig {

	@Bean
	@ConditionalOnMissingBean(HttpTraceRepository.class)
	public RemoteRepository traceRepository() {
    	return new RemoteRepository();
	}
}

ユーティリティServiceVonage API サービス用クラス

扱うVonageサービスごとに serviceクラスが作成されます。基本的には、メッセージサービス(SMS、WhatsApp、Viber)とVoiceサービスそれぞれに1つのサービスクラスを作成します。

VoiceServiceクラス

Voice API を使用して音声メッセージを送信するには、Vonage Java SDK を使用する必要があります。TTS(Text-to-Speech)または事前に録音した音声ファイルを再生することで、電話番号に音声メッセージを送信できます。以下は、Vonage Java SDKを使用して音声メッセージを送信する方法のデモです:

まず、Vonage Java SDKをプロジェクトの依存関係として追加する必要があります。Mavenを使用している場合は、pom.xmlファイルに以下のコードを追加することでこれを行うことができます:

<dependency>
 	<groupId>com.vonage</groupId>
    	<artifactId>client</artifactId>
    	<version>7.1.1</version>
</dependency>

次に、Voiceメッセージの送信を処理する新しいクラスを作成する必要があります。このクラスでは、com.vonage.client.voice.Callとcom.vonage.client.VonageClientクラスをインポートする必要があります。このクラスでは、通話中にアプリケーションを認証するために、アプリケーション ID と秘密鍵を渡す必要があります。

String applicationId = "your-application-id";
String privateKeyPath = "path/to/private.key";

次に VonageClientクラスの新しいインスタンスを作成し、アプリケーションIDと秘密鍵へのパスを渡します。

VonageClient client = VonageClient
.builder()
.applicationId(applicationId)
.privateKeyPath(privateKey)
.build();

ここで、Callクラスの新しいインスタンスを作成し、from、to、answer_urlプロパティを設定します。を設定します。 fromプロパティはメッセージを送信する電話番号またはバーチャル番号です。 toプロパティは、メッセージを送信する電話番号または仮想番号です。 answer_urlプロパティは、呼び出しに応答したときに要求される URL です。

Call call = new Call();
call.setFrom(FROM_NUMBER);
call.setTo(TO_NUMBER);
call.setAnswerUrl(ANSWER_URL);

簡単にするために、クラス VonageClientProviderクラスを作成し、そこであなたの認証情報を使って Vonage クライアントのインスタンスを作成します。これは、他のクラスでコードを繰り返す必要がないようにするために重要です。

import com.vonage.client.VonageClient;

public class VonageClientProvider {

    private static final String APPLICATION_ID = "VONAGE_APPLICATION_ID";
    private static final String PRIVATE_KEY = "VONAGE_PRIVATE_KEY_PATH";
    private static VonageClient instance;

    private VonageClientProvider() {}

    public static VonageClient getInstance() {
        if (instance == null) {
            instance = VonageClient.builder()
                    .applicationId(APPLICATION_ID)
                    .privateKeyPath(PRIVATE_KEY)
                    .build();
        }

        return instance;
    }
}

messagesServiceクラス

以下は、Vonage Messages API を使用して SMS、WhatsApp メッセージ、Viber メッセージを送信する方法を示す Java のクラスです:

import com.vonage.client.VonageClient;
import com.vonage.client.messages.MessageResponse;
import com.vonage.client.messages.MessagesClient;
import com.vonage.client.messages.sms.SmsTextRequest;
import com.vonage.client.messages.viber.Category;
import com.vonage.client.messages.viber.ViberTextRequest;
import com.vonage.client.messages.whatsapp.WhatsappTextRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class MessagingService {

    private static final String VONAGE_NUMBER = "YOUR_VONAGE_NUMBER_HERE";

    public static void sendSms(String toNumber, String text) {

        VonageClient client = VonageClientProvider.getInstance();

        MessagesClient smsClient = client.getMessagesClient();

        var message = SmsTextRequest.builder()
                .from(VONAGE_NUMBER).to(toNumber)
                .text(text)
                .build();


            MessageResponse response = smsClient.sendMessage(message);
            log.info("Message sent successfully. ID: "+response.getMessageUuid());

    }

    public static void sendWhatsApp(String toNumber, String text) {

        VonageClient client = VonageClientProvider.getInstance();

        MessagesClient whatsAppClient = client.getMessagesClient();

        var message = WhatsappTextRequest.builder()
                .from(VONAGE_NUMBER).to(toNumber)
                .text(text)
                .build();

            MessageResponse response = whatsAppClient.sendMessage(message);
            log.info("Message sent successfully. ID: "+response.getMessageUuid());
    }

sendViber()方法

public static void sendViber(String toNumber, String text) {

        VonageClient client = VonageClientProvider.getInstance();

        MessagesClient viberClient = client.getMessagesClient();

        var message = ViberTextRequest.builder()
                .from(VONAGE_NUMBER).to(toNumber)
                .text(text)
                .category(Category.TRANSACTION)
                .build();

            MessageResponse response = viberClient.sendMessage(message);
            log.info("Message sent successfully. ID: " + response.getMessageUuid());
    }

改善RemoteRepositoryクラス

これで、Vonage API経由のメッセージ送信に必要なすべてのサービスが作成されました。クラスに入って RemoteRepositoryクラスに入って、これらの各サービスを自動配線します。"500 - Internal Server Error" が発生したときに、これらの各サービスが呼び出され、好きな順序と形式で実行されるようにします。クラスの完全な構造を以下に示します。 RemoteRepositoryクラスの完全な構造を以下に示します:

import com.vonage.tracer.service.MessagingService;
import com.vonage.tracer.service.VoiceService;
import lombok.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.trace.http.HttpTrace;
import org.springframework.boot.actuate.trace.http.HttpTraceRepository;

import java.util.Collections;
import java.util.List;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class RemoteRepository implements HttpTraceRepository {
    @Autowired
    private MessagingService messagingService;

    @Autowired
    private VoiceService voiceService;

    @Override
    public List<HttpTrace> findAll() {
        return Collections.emptyList();
    }

    @SneakyThrows
    @Override
    public void add(HttpTrace trace) {

        int responseStatusCode = trace.getResponse().getStatus();
        String errorMessage = "Check Server - 500 generated. Kindly check the server for an Internal Server Error";

        if (responseStatusCode == 500) {

            // call the services to send SMS, Messaging and Voice Messages via Vonage API

            MessagingService.sendSms(
                    "<sender-number-here",
                    "<recipient-number-here"
            );

            MessagingService.sendWhatsApp(
                    "<recipient-number-here", errorMessage
                    );

            MessagingService.sendViber(
                    "<recipient-number-here", errorMessage);

            voiceService.sendVoiceMessage(
                    "<recipient-here", errorMessage);

        }
    }
}

これでコントローラを作成することができ、アプリケーションに何らかの呼び出しが行われ、それがレスポンスコード500を返すたびに、サービスが次々に呼び出されるようになります。どのように動作するかは自由ですが、これで素晴らしいものができるはずです。

結論

この記事では、サーバーからHTTPエラー500コードが発生したときに、それぞれのアドレスや場所にメッセージを生成して送信する方法について見てきました。これを使えば、Actuatorからtraceオブジェクトの内容を確認し、それを使って他にどんなことができるかを見ることができます。また、Vonage APIを使えば、もっといろいろなことができます。ドキュメントはこちら。この記事のコードは こちらにもあります。

以下の会話に参加してください。 VonageコミュニティSlackまたは ツイッター.

シェア:

https://a.storyblok.com/f/270183/400x398/eaee70de70/tolulope-ayemobola.png
Tolulope Ayemobolaゲスト執筆者

トルロペは、コーディングと自分の仕事について書くことが大好きな、成長中のソフトウェア・エンジニアだ。コーディング以外の時間はディスクジョッキーとして楽しんでいる。