Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Azure SDK for Java におけるログなど

Azure SDK for JavaのことがBlogで記事になっていたのでザックリ内容を確認しました。

devblogs.microsoft.com

原題は「in Azure Functions」とはなっていますが、Functionsに限らないSDK Loggingの話だと捉えた方がよさそうです。気をつけなくてはいけないのは、JavaのFunctionsでは、ロガーインスタンスはDIされないので、Contextオブジェクトから取得することになるくらいですちなみに、context.getLogger().info("hoge") みたいになります。

話をSDKに戻しますと、SDKのログを取得できるのは内部動作の理解にも繋がりますし、デバッグ時にも大変有効な手段です。依然は、SDK毎にバラバラだった気がしますが、最近のAzure SDKはガイドラインに沿って作られているせいか、機能毎にそれほどばらつき無く実装されているような気がします。

Key Vaultの場合

大体のJava SDKはクライアントをBuilderパターンで構築しますが、そこにhttpLogOptionsを挟み込むだけでログが取得できます。無論、slf4jを介したログ出力になっているので、このあたりの設定は必要ですが、主要なフレームワーク(Spring Bootとかは)には組み込まれていると思うので、そのまま出力されるでしょう。

        var kvCreds = new ClientSecretCredentialBuilder()
                .tenantId("")
                .clientId("")
                .clientSecret("")
                .build();

        var logOptions = new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS);

        var secretClient = new SecretClientBuilder()
                .httpLogOptions(logOptions)
                .vaultUrl(kvUri)
                .credential(kvCreds)
                .buildClient();

Azure上にデプロイして動かないなど、Managed Idの設定ではまったりするので、ログが取得できるのは、どこに設定ミスがあるかを確認したりするうえで便利だと思います。

ログの種類

https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpLogDetailLevel.java

のとおり、NONE/BASIC/HEADERS/BODY/BODY_AND_HEADERSの5種類です。

  • BASICは、URLとHTTPメソッドとリクエスト
  • HEADERSは、BASICに加えてリクエストとレスポンスヘッダ
  • BODYは、BASICにくわえリクエストとレスポンスボディ
  • BODY_AND_HEADERSは、全部という感じです。

BASICの例は以下のような感じになります。

2020-09-29 11:08:59.585  INFO 60628 --- [           main] c.a.s.k.secrets.SecretAsyncClient        : Retrieving secret - ConnectionString
2020-09-29 11:08:59.597  INFO 60628 --- [           main] c.a.s.k.secrets.SecretService.getSecret  : --> GET https://xxxxyyyyzzz.vault.azure.net/secrets/ConnectionString/?api-version=REDACTED
Try count: 1

2020-09-29 11:09:01.201  INFO 60628 --- [ctor-http-nio-1] c.a.s.k.secrets.SecretService.getSecret  : <-- 401 https://xxxxyyyyzzz.vault.azure.net/secrets/ConnectionString/?api-version=REDACTED (1603 ms, 87-byte body)
<-- END HTTP
2020-09-29 11:09:01.764  INFO 60628 --- [nPool-worker-19] c.azure.identity.ClientSecretCredential  : Azure Identity => getToken() result for scopes [https://vault.azure.net/.default]: SUCCESS
2020-09-29 11:09:01.764  INFO 60628 --- [nPool-worker-19] c.a.s.k.secrets.SecretService.getSecret  : --> GET https://xxxxyyyyzzz.vault.azure.net/secrets/ConnectionString/?api-version=REDACTED
Try count: 1

2020-09-29 11:09:02.141  INFO 60628 --- [ctor-http-nio-3] c.a.s.k.secrets.SecretService.getSecret  : <-- 200 https://xxxxyyyyzzz.vault.azure.net/secrets/ConnectionString/?api-version=REDACTED (377 ms, 302-byte body)
<-- END HTTP
2020-09-29 11:09:02.175  INFO 60628 --- [ctor-http-nio-3] c.a.s.k.secrets.SecretAsyncClient        : Retrieved secret - connectionString

Storageの場合

Storage SDKの場合も同じく、httpLogOptionsメソッドを挟み込めばOKです。

        var storageClient = new BlobServiceClientBuilder()
                .httpLogOptions(logOptions)
                .endpoint(endpoint)
                .credential(storageCreds)
                .buildClient();

他のSDK

これ以外にCosmos SDKを試してみましたが、BuilderクラスにhttpLogOptionsメソッドは実装されていませんでした。まだ全てのSDKで使えるわけではなさそうです。(CosmosにはCosmos SDKのログの方法が提供されているとは思いますが)

というわけで、今回も誰得なブログでした。以上。