Java Azure Cosmos DB (SQL) HTTP Status コード (エラーコード)の見方 No16

自己投資としてチャレンジしている内容を Blog で公開しています。今回は Azure Cosmos DB (SQL API) に対して処理を実行した際発生したエラーについて確認する方法を紹介します。

▼1. Azure Cosmos DB の HTTP Status コード

返された HTTP Status コードを確認することで実行した処理が成功したか失敗したか、失敗した場合の理由がわかります。

(例)
HTTP Status Code – 状況
200 – 処理が成功
401 – 接続時認証エラーが発生
429 – クライアントからの処理が多すぎることにより、データベースやコレクション(コンテイナー)作成時に指定した RU/s (Provisioned RU/s) の上限値を超えたため処理が失敗した

詳細はこちらを参照ください。Azure Cosmos DB の HTTP 状態コード


▼2. 事前準備

2-1. Cosmos DB トライアルアカウントの作成

以下のサイトから無料で利用できる Azure Cosmos DB を用意します。Azure を利用するために必要な Subscription を用意する必要もありません。
https://azure.microsoft.com/ja-jp/try/cosmosdb/

2-2. Maven auto-import を IntelliJ IDEA で有効にする

ubuntu で IntelliJ IDEA をインストールしています。詳細はこちらの blog を参照ください。IntelliJ IDEA の利用 auto-import を有効にする方法 No.13


▼3. Http Status 400, BadRequest を発生させる

3-1. Http Status code 400, BatRequest を発生させる

以下のコードで insert するデータの item の id を 大文字の Id にすることで BadRequest, Http Status 400 を発生させます。
end_point  の xxx と、master_key の xxx は、それぞれ利用する Cosmos DB のアカウント名とキーに書き換えます。

import com.azure.cosmos.*;
import com.azure.cosmos.models.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collections;

public class CosmosDBHTTPStatusv {
    protected static final Logger log = LoggerFactory.getLogger(CosmosDBHTTPStatusv.class);
    public static class Family{
        //public String id;
        // change uppercase letter like Id from id to make http status 400 code
        public String Id;
        public String lastName;
        public boolean isRegistered;
        public String getLastName(){
            return lastName;
        }

        public Family(String idv,String lastnamev,boolean isv){
            //id=idv;
    // change uppercase letter like Id from id to make http status 400 code
            Id=idv;
            lastName=lastnamev;
            isRegistered=isv;
        }
    }

    public static void main(String... args) {
        String databaseName = "testdb";
        String end_point = "https://YourCosmosDBAccountName.documents.azure.com:443";
        String master_key = "xxxx";
        String containerName = "colltest";
        log.info("Prepare for data");
        Family family = new Family("10","Alex",false);
        try (CosmosClient cosmosClient = new CosmosClientBuilder().endpoint(end_point).key(master_key).gatewayMode(GatewayConnectionConfig.getDefaultConfig()).consistencyLevel(ConsistencyLevel.SESSION).connectionSharingAcrossClientsEnabled(true).contentResponseOnWriteEnabled(true).userAgentSuffix("My-Application-clienttest").preferredRegions(Collections.singletonList("West US")).buildClient()){
            log.info("The connection to Cosmos DB succeeded.");
            log.info("Create DB");
            CosmosDatabaseResponse databaseResponse = cosmosClient.createDatabaseIfNotExists(databaseName);
            CosmosDatabase database = cosmosClient.getDatabase(databaseName);
            log.info("Create container with 400 RU/s");
            CosmosContainerProperties containerProperties = new CosmosContainerProperties(containerName, "/lastName");
            CosmosContainerResponse cosmosContainerResponse = database.createContainerIfNotExists(containerProperties, ThroughputProperties.createManualThroughput(400));
            log.info("Set Container");
            CosmosContainer container = database.getContainer(containerName);
            log.info("Create item using container. Use lastName as partitionKey for the item");
            CosmosItemRequestOptions cosmosItemRequestOptions = new CosmosItemRequestOptions();
            log.info("insert data into items");
            CosmosItemResponse<Family> item = container.createItem(family, new PartitionKey(family.getLastName()),cosmosItemRequestOptions);
        }catch(CosmosException e){
            e.printStackTrace();
        }
    }
}

3-2. 実行結果

標準出力に含まれる以下のエラーメッセージや Http Status Code が対処に役に立ちます。

error={"code":"BadRequest","message":"Message: {\"Errors\":[\"The input content is invalid because the required properties - 'id; ' - are missing\"]
xxx
StatusCode: 400, SubStatusCode: 0,
xxx
requestHeaders=[Accept=application/json, x-ms-date=Wed, 29 Jul 2020 03:06:20 GMT, x-ms-documentdb-partitionkey=["Alex"], x-ms-consistency-level=Session, Content-Type=application/json]}

3-3. Portal から確認できる Metrics の Overview でも以下のように Http 400 の Status Code が見えます。

3-4. 対処方法

エラーメッセージ “The input content is invalid because the required properties – ‘id; ‘ – are missing” に従い、 Family Class で指定している大文字の Id を小文字の id にします。

Before: 変更前

    public static class Family{
        //public String id;
        // change uppercase letter like Id from id to make http status 400 code
        public String Id;
        public String lastName;
        public boolean isRegistered;
        public String getLastName(){
            return lastName;
        }
        public Family(String idv,String lastnamev,boolean isv){
            //id=idv;
    // change uppercase letter like Id from id to make http status 400 code
            Id=idv;
            lastName=lastnamev;
            isRegistered=isv;
        }
    }

After: 変更後

    public static class Family{
        public String id;
        // change lowercase letter like id from Id to avoid http status 400 code
        //public String Id;
        public String lastName;
        public boolean isRegistered;
        public String getLastName(){
            return lastName;
        }
        public Family(String idv,String lastnamev,boolean isv){
            id=idv;
    // change uppercase letter like Id from id to make http status 400 code
           // Id=idv;
            lastName=lastnamev;
            isRegistered=isv;
        }
    }

▼3. 参考情報

以上です。参考になりましたら幸いです。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です